【发布时间】:2017-03-30 19:52:56
【问题描述】:
我正在做一个与计算几何有关的个人项目。标题中的问题是对我正在尝试但正在努力有效解决的小子问题之一的抽象。希望它足够通用,可能不仅仅对我有用!
问题
假设我们在平面上有一组 S 矩形,所有这些矩形的边都平行于坐标轴(没有旋转)。对于我的问题,我们假设矩形交叉点非常常见。但它们也非常好:如果两个矩形相交,我们可以假设其中一个总是完全包含另一个。所以没有“部分”重叠。
我想以如下方式存储这些矩形:
- 我们可以高效地添加新矩形。
- 给定一个查询点 (x,y),我们可以有效地报告 包含该点的最小区域的矩形。
插图为后者提供了动机。我们总是希望找到包含查询点的嵌套最深的矩形,因此它始终是最小区域之一。
我的想法
所以我知道 R-Tree 和 Quad-Tree 都经常用于解决空间索引问题,而且确实在某些情况下两者都可以很好地工作。 R-Trees 的问题是它们在最坏的情况下会降级为线性性能。
我考虑过构建一组基于嵌套的平衡二叉树。节点 r 的左子树包含矩形 r 内的所有矩形。右子树包含 r 所在的所有矩形。图示的示例将具有三棵树。
但是如果没有一个矩形是嵌套的呢?然后你需要 1 个元素的 O(n) 树,而且我们有一些性能与通过框的线性扫描一样差的东西。
在最坏的情况下,我们如何以渐近亚线性时间的方式解决这个问题?即使这意味着在最佳情况下牺牲一些性能或存储要求。 (我假设对于这样的问题,可能需要维护两个数据结构,这很酷)
我确信允许矩形相交的非常具体的方式应该有助于解决这个问题。事实上,对我来说,它看起来像是对数性能的候选者,但我只是没有得到任何结果。
提前感谢您提出的任何想法!
【问题讨论】:
标签: algorithm geometry quadtree spatial-query r-tree