存储对象以按 x,y 坐标进行定位

2022-09-03 01:39:35

我正在尝试确定一种存储一组对象的快速方法,每个对象都有一个x和y坐标值,这样我就可以快速检索某个矩形或圆形内的所有对象。对于小组对象(~100),简单地将它们存储在列表中并循环访问它的朴素方法相对较快。但是,对于更大的群体来说,这预计会很慢。我也尝试将它们存储在一对树状图中,一个按x坐标排序,另一个按y坐标排序,使用以下代码:

xSubset = objectsByX.subSet( minX, maxX );
ySubset = objectsByY.subSet( minY, maxY );
result.addAll( xSubset );
result.retainAll( ySubset );

这也有效,并且对于较大的对象集更快,但仍然比我想要的要慢。部分问题还在于这些对象会四处移动,并且需要将其插入回此存储中,这意味着将它们从树/列表中删除并重新添加到树/列表中。我不禁认为一定有更好的解决方案。我正在Java中实现它,如果它有任何区别,尽管我希望任何解决方案都会以有用的模式/算法的形式出现。


答案 1

四叶树似乎解决了我问的具体问题。Kd-Trees是一种更一般的形式,适用于任意数量的维度,而不仅仅是两个维度。

如果存储的对象具有边界矩形,而不仅仅是一个简单的点,则 R 树也可能很有用。

这些类型结构的总称是空间索引

有一个QuadtreeR-Tree的Java实现。


答案 2

通用术语是空间索引。我想你应该根据现有的实现来选择。


推荐