R-Tree实现Java

时间:2011-12-10 11:38:41

标签: java algorithm data-structures r-tree interval-tree

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

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

对于我的问题使用R-Tree或Intervall-Tree的想法,我可能完全错了,所以我简单地说明问题,你可以把你的想法发给我。

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

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

希望你对问题和想法有所了解。

5 个答案:

答案 0 :(得分:3)

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

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

对不起,您要么接受暴力搜索,要么更好地分析问题并提出更明智的解决方案。

答案 1 :(得分:3)

请注意,当您拥有离散数据时,R-Trees会严重降级。您真正需要找到的第一件事是适当的数据表示,然后测试您的查询是否对数据的子集起作用。

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

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

答案 2 :(得分:2)

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

https://github.com/davidmoten/rtree

您可能想要查看它!

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

GiST Quick demo