R-Tree 实现 Java
Posted
技术标签:
【中文标题】R-Tree 实现 Java【英文标题】:R-Tree Implementation Java 【发布时间】:2011-12-10 11:38:40 【问题描述】:最近几天我一直在寻找 R-Tree 的稳定实现,它支持无限维度(大约 20 个就足够了)。我只找到了这个http://sourceforge.net/projects/jsi/,但它们只支持二维。
另一个选项是区间树的多维实现。
也许我对使用 R-Tree 或 Intervall-Tree 来解决我的问题的想法完全错误,所以我简要说明问题,您可以将您的想法发送给我。
我需要解决的问题是某种最近邻搜索。我有一组天线和房间,每个天线都有一个整数间隔。例如。天线 1,最小 -92,最大 -85。事实上,它可以表示为房间 -> 天线组 -> 天线间隔。 这个想法是,每个房间在 R-Tree 中跨越天线维度上的一个盒子,并在每个维度上由间隔跨越。
如果我得到一个包含 N 天线和每个天线值的查询,那么我可以将信息表示为房间中的查询点,并检索到该点“最近”的房间。
希望您对问题和我的想法有所了解。
【问题讨论】:
nvm 这是一个旧线程:请注意,有专门设计用于支持最近邻查询的数据结构,如 M-trees。 en.wikipedia.org/wiki/M-tree 【参考方案1】:请注意,当您拥有离散数据时,R-Trees 可能会严重退化。您真正需要找出的第一件事是适当的数据表示,然后测试您的查询是否适用于数据的子集。
R-Trees 只会让您的查询更快。如果他们一开始就不起作用,那将无济于事。 您应该先不使用 R-Tree 来测试您的方法。除非您遇到大量数据(例如,100.000 个对象),否则内存中的线性扫描可以轻松胜过 R-Tree,尤其是当您需要一些适配器层时,因为它与您的代码没有很好地集成。
这里明显的方法是只使用边界矩形,并线性扫描它们。如果它们有效,那么您可以将 MBR 存储在 R-Tree 中以获得一些性能改进。 但如果它不适用于线性扫描,它也不适用于 R-Tree(它不会更快地工作。)
【讨论】:
是的。但是为了测试,我首先需要一个有效的实现。 ;) 是的,但不是 R-Tree。只需使用线性扫描即可!再次; R-trees 只会加速,不会解决你以前无法完成的任何任务。 加速正是我想要的。因此,我正在寻找一个通用的、免费的、稳定的实现。例如在背景中使用红黑树的 TreeMap 的原生实现。 好吧,我担心你的方法不管有没有加速都行不通!因此,在浪费时间采用一些外部代码之前先对其进行测试。 R-Trees 管理矩形,但如果你的距离函数没有帮助(这发生在高维......请参阅“维度诅咒”) 请注意,R-Trees 作为一种无需缓存的多维数据结构,在游戏开发人员中广受欢迎。尤其是当您可以从叶子遍历树时(例如,玩家攻击他的附近敌人)或几乎不更新树时,与 100k 对象的“线性扫描”相比,这是一个巨大的性能提升。这就是我的观点。【参考方案2】:我并不完全清楚您的确切问题是什么,但是 R-Tree 或区间树在 20 维中无法正常工作。这不是一个巨大的维度,但它足以让维度诅咒开始出现。
要明白我的意思,请考虑尝试查看一个盒子的所有邻居,包括角落和边缘的邻居。使用 20 个维度,您将拥有 320 - 1 或 3,486,784,400 个相邻框。 (您可以通过意识到沿每个轴的邻居可以是 -1 单位、0 单位或 +1 单位,但 (0,0,0) 不是邻居,因为它代表原始框。)
很抱歉,您要么接受暴力搜索,要么更好地分析您的问题并提出更聪明的解决方案。
【讨论】:
是的,我知道维度的诅咒。但是我会尝试使用 R-Tree,因为 20 维是最坏的情况。也许我什至可以以某种方式缩小尺寸。但我想对其进行测试并将其与其他可能更好的解决方案进行比较。 这在很大程度上取决于您的数据。我已经在 27+ 维颜色直方图上成功使用了 R-Trees。【参考方案3】:我在 Java 中发现了这个 R*-Tree 实现,它似乎提供了许多功能:
https://github.com/davidmoten/rtree
你可能想看看!
【讨论】:
【参考方案4】:另一个很好的 Java 实现是 ELKI:https://elki-project.github.io/。
【讨论】:
【参考方案5】:您可以使用 PostgreSQL 的通用搜索树索引工具。
GiST Quick demo
【讨论】:
鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。以上是关于R-Tree 实现 Java的主要内容,如果未能解决你的问题,请参考以下文章
FireDAC 下的 Sqlite [10] - 使用 R-Tree 搜索.
使用 C++ boost 库如何创建两个圆圈并将它们添加到 boost R-tree?
Big Spatio temporal Data(R-tree Index and NN & RNN & Skyline)