查询输入矩形重叠的矩形集合

时间:2010-06-28 23:51:53

标签: algorithm search data-structures geometry

在多维空间中,我有一组矩形,所有这些矩形都与网格对齐。 (我在松散地使用“矩形”这个词 - 在三维空间中,它们将是矩形棱柱。)

我想查询此集合以查找与输入矩形重叠的所有矩形。

保存矩形集合的最佳数据结构是什么?我将不时地从集合中添加矩形和删除矩形,但这些操作很少发生。我想要快速的操作是查询。

一种解决方案是将矩形的角保留在列表中,并对列表进行线性扫描,找出哪些矩形与查询矩形重叠,并跳过那些没有的矩形。

但是,我希望查询操作比线性更快。

我看过R-tree data structure,但是它包含一系列点,而不是一组矩形,我没有看到任何明显的方法来概括它。

我的矩形坐标是离散的,以防你觉得有用。

我对一般解决方案感兴趣,但我也会告诉你我特定问题的属性:我的问题空间有三个维度,它们的多样性变化很大。第一个维度有两个可能的值,第二个维度有87个值,第三个维度有180万个值。

3 个答案:

答案 0 :(得分:3)

您可以根据维基页面使用可用于矩形的KD-Trees

  

变体形式

     

而不是积分

     

而不是点,kd树也可以   包含矩形或   hyperrectangles [5]。 2D矩形是   被认为是4D物体(xlow,xhigh,   ylow,yhigh)。因此范围搜索   成为回归所有人的问题   与搜索相交的矩形   长方形。树是构造的   所有矩形的通常方式   叶子。在正交范围内   搜索,相反的坐标是   用来比较时   中位数。例如,如果是当前的   水平沿xhigh分开,我们检查   搜索的xlow坐标   长方形。如果中位数小于   搜索的xlow坐标   矩形,然后没有矩形   左分支可以与之交叉   搜索矩形等都可以   修剪。否则两个分支都应该   被遍历。另请参阅区间树,   这是一个特殊的案例。

答案 1 :(得分:1)

让我们通过PN调用原始问题 - 其中N是维数。

假设我们知道P1 - 1维问题的解决方案:查找新区间是否与给定的区间集合重叠。

一旦我们知道要解决它,我们就可以检查新矩形是否与每个x / y / z投影中的矩形集合重叠。

因此P3的解决方案相当于P1_x AND P1_y AND P1_z。

为了有效地解决P1,我们可以使用排序列表。列表的每个节点都包括坐标和打开的intetrvals数量 - 这个坐标。

假设我们有以下间隔: [1,5] [2,9] [3,7] [0,2]

然后列表如下:

{0,1},{1,2},{2,2},{3,3},{5,2},{7,1},{9,0}

如果我们收到一个新的区间,比如说[6,7],我们会发现列表中最大的项目小于6:{5,2},而最大项目大于7:{9,0}

因此很容易说新区间与现有区间重叠。

排序列表中的搜索比线性更快:)

答案 2 :(得分:0)

您必须使用某种分区技术。但是,由于您的问题受到限制(仅使用矩形),因此数据结构可以稍微简化一些。我没有详细考虑过这个问题,但这样的事情应该有效;)

使用离散值约束 - 您可以创建一个类似于辅助表的数据结构,您可以在其中存储第二维的离散值(87个可能的值)。假设这些值表示垂直于该维度的平面。对于这些平面中的每一个,您可以在此辅助表中存储与这些平面相交的矩形。

同样对于第三个维度,你可以使用另一个表,你可以使用尽可能多的等间距值(180万是太多,所以你可能想要使这个至少要小几个量级),并创建一个地图两个选定值之间的矩形。

给定一个查询矩形,您可以在常量时间查询第一个表,以确定可能与此查询相交的一组表。然后,您可以在第二个表上执行另一个查询,并执行第一个和第二个查询结果的结果的交集。这应该缩小您必须执行的实际交叉点测试的数量。