15

最近几天我一直在寻找 R-Tree 的稳定实现,支持无限维度(20 左右就足够了)。我只找到了这个http://sourceforge.net/projects/jsi/但它们只支持二维。

另一个选项是区间树的多维实现。

也许我对使用 R-Tree 或 Intervall-Tree 来解决我的问题的想法完全错误,所以我简短地陈述问题,您可以将您的想法发送给我。

我需要解决的问题是某种最近邻搜索。我有一组天线和房间,每个天线都有一个整数间隔。例如天线 1,最小 -92,最大 -85。事实上,它可以表示为房间 -> 天线组 -> 天线间隔。这个想法是,每个房间在 R-Tree 中跨越天线维度上的一个盒子,并在每个维度上由间隔跨越。

如果我得到一个带有 N 天线和每个天线值的查询,那么我可以将信息表示为房间中的查询点,并检索到该点“最近”的房间。

希望您对问题和我的想法有所了解。

4

5 回答 5

4

请注意,当您拥有离散数据时,R-Trees 可能会严重退化。您真正需要找出的第一件事是适当的数据表示,然后测试您的查询是否适用于数据的子集。

R-Trees 只会让您的查询更快。如果他们一开始就不起作用,那将无济于事。您应该在不首先使用 R-Trees 的情况下测试您的方法。除非您遇到大量数据(例如,100.000 个对象),否则内存中的线性扫描可以轻松胜过 R-Tree,特别是当您需要一些适配器层时,因为它没有与您的代码很好地集成。

这里明显的方法是只使用边界矩形,并线性扫描它们。如果它们有效,那么您可以将 MBR 存储在 R-Tree 中以获得一些性能改进。但如果它不适用于线性扫描,它也不适用于 R-Tree(它不会更快地工作。)

于 2011-12-11T13:24:41.807 回答
3

我不完全清楚您的确切问题是什么,但是 R-Tree 或区间树在 20 维中不能很好地工作。这不是一个巨大的维度,但它足以让维度的诅咒开始出现。

要了解我的意思,请考虑尝试查看一个盒子的所有邻居,包括角落和边缘的邻居。对于 20 个维度,您将拥有 3个 20 - 1 或 3,486,784,400 个相邻框。(您可以通过意识到沿每个轴的邻居可以是 -1 单位、0 单位或 +1 单位,但 (0,0,0) 不是邻居,因为它代表原始框。)

很抱歉,您要么需要接受蛮力搜索,要么更好地分析您的问题并提出更聪明的解决方案。

于 2011-12-10T16:33:43.170 回答
3

我在 Java 中发现了这个 R*-Tree 实现,它似乎提供了许多特性:

https://github.com/davidmoten/rtree

您可能想检查一下!

于 2015-03-06T16:20:36.790 回答
0

您可以使用 PostgreSQL 的通用搜索树索引工具。

GiST 快速演示

于 2018-05-08T15:34:49.533 回答
0

Java 中另一个很好的实现是 ELKI:https ://elki-project.github.io/ 。

于 2016-12-13T14:37:06.500 回答