R 树实现 Java

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

另一种选择是区间树的多维实现。

也许我对使用R树或间隔树来解决我的问题的想法是完全错误的,所以我简短地陈述了问题,你可以把我的想法发给我。

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

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

希望你对这个问题和我的想法有所了解。


答案 1

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

R 树只会使您的查询速度更快。如果他们一开始就不工作,那就无济于事。您应该先在不使用 R 树的情况下测试您的方法。除非您命中大量数据(例如,100.000 个对象),否则内存中的线性扫描可以轻松胜过 R-Tree,尤其是在需要一些适配器层时,因为它与您的代码集成不紧密。

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


答案 2

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

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

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