那个returns区域的查找算法?

Lookup algorithm that returns regions?

我有一大堆带有二维坐标的区域。 None 个区域重叠。这些区域彼此并不紧邻,也不遵循放置模式。

有没有一种高效的查找算法可以让我知道一个特定的点会落在哪个区域?这似乎与四叉树完全相反。

您需要的数据结构称为 R 树。大多数 RTree 允许 "Within" 或 "Intersection" 查询,这将 return 包含或重叠给定区域的任何地理区域,参见,例如wikipedia.

没有理由不能构建自己的 R 树,它只是平衡 B 树的一个变体,它可以容纳扩展结构并允许一些重叠。 This implementation 是轻量级的,您可以通过将区域包裹在矩形中来在此处使用它。每个查询可能 return 多个结果,但您可以检查基础区域。与尝试构建支持折线的 R 树版本相比,它可能是一个更简单的解决方案。

如果我理解正确的话,您需要的是一个 point location data structure,正如您所说的那样,在某种程度上与四叉树或 R 树相反。在点位置数据结构中,您存储了一组区域,查询的形式为:给定点 p 给我包含它的区域。

存在几种点位置数据结构,最著名和性能最好的是柯克帕特里克的一种,也称为三角剖分细化,实现了 O(n) space 和 O(logn) 查询时间;但也以难以实施而闻名。另一方面,有几个更简单的数据结构可以实现 O(n) 或 O(nlogn) space 但 O(log^2n) 的查询时间,这并不是那么糟糕并且更容易实现,并且对于某些使用称为分数级联的方法可以将查询时间减少到 O(logn)。

我建议您看一下 de Berg、Overmars 等人的第 6 章。 Computational Geometry: Algorithms and Applications which explains the subject in a way very easy to grasp, though it doesn't includes Kirkpatrick's method, which you can find it in Preparata's book or read it directly from Kirkpatrick's paper.

顺便说一句,其中一些结构假定您的区域不重叠但预计相邻(区域共享边),并且边形成连接图,有时还假设三角形区域。在所有情况下,您都可以通过添加新边来扩展您的区域集,但您不必为此担心,因为所需的额外 space 仍然是线性的,因为最终的区域集将产生一个平面图。所以你可以盲目地扩展你的区域集而不用担心 space.

增长太多