返回区域的查找算法?

时间:2015-05-05 07:45:28

标签: java algorithm coordinates quadtree

我有一个包含2D坐标的大型区域列表。没有区域重叠。这些区域并非紧邻彼此,也不遵循放置模式。

是否有高效的查找算法可以让我知道特定点会落入哪个区域?这似乎与QuadTree的确切相反。

2 个答案:

答案 0 :(得分:3)

您需要的数据结构称为R-Tree。大多数RT允许"内部"或者"交叉口"查询,它将返回包含或重叠给定区域的任何地理区域,例如, wikipedia

没有理由不能建立自己的R-Tree,它只是平衡B树上的一个变种,它可以容纳扩展结构并允许一些重叠。 This implementation是轻量级的,您可以通过将区域包裹在矩形中来使用它。每个查询可能会返回多个结果,但您可以检查基础区域。它可能比尝试构建支持折线的R树版本更容易。

答案 1 :(得分:1)

如果我理解正确的话,你需要的是point location data structure,正如你所说的那样,它与quad或R-tree相反。在点位置数据结构中,您存储了一组区域,并且查询的格式为:给定点p给出包含它的区域。

存在多个点位置数据结构,最着名的和实现最佳性能的结构是Kirkpatrick的一个也称为三角测量细化,并实现O(n)空间和O(logn)查询时间;但也很难实现。另一方面,有几个更简单的数据结构可以实现O(n)或O(nlogn)空间但是O(log ^ 2n)查询时间,这不是那么糟糕且更容易实现,并且对于某些人来说可以减少使用名为fractional cascading的方法查询O(logn)的时间。

我建议你看看de Berg,Overmars等人的第6章。 Computational Geometry: Algorithms and Applications以一种非常容易理解的方式解释主题,但它不包括Kirkpatrick的方法,您可以在Preparata's book中找到它或直接从Kirkpatrick's paper读取它。

BTW,这些结构中的一些假定您的区域不重叠但预期相邻(区域共享边缘),并且边缘形成连通图,有时也假设三角形区域。在所有情况下,您可以通过添加新边来扩展您的区域集,但是您不必担心,因为所需的额外空间将仍然是线性的,因为最后一组区域将引发平面图。因此,您可以盲目地扩展您的区域集,而不必担心太多的空间增长。