【问题标题】:Given n rectangles coordinates, find area of region where k rectangles intersect?给定 n 个矩形坐标,求 k 个矩形相交的区域面积?
【发布时间】:2019-07-25 00:54:59
【问题描述】:

给定一个由左下角和右上角[(x1, y1), (x2, y2)]坐标定义的矩形列表[R1,R2,R3],以及一个值k。

有没有找到k个矩形重叠区域的最佳方法?

例如:

R1: [(1, 1), (5, 5)]
R2: [(4, 4), (7, 6)]
R3: [(3, 3), (8, 7)]

rectangles = [R1, R2, R3]
k = 2

两个矩形重叠的面积是8。

解决这个问题的蛮力方法是计算 x 轴和 y 轴坐标的最小值和最大值,然后使用它创建一个网格并为矩形内的每个单元格增加一个。最后遍历网格以计算值为 k 的单元格的数量以找到解决方案。

该方法的复杂度为O(n^3),假设每个矩形的大小为n x n,并且有n个矩形。

是否有解决此问题的最佳运行时方法?

【问题讨论】:

  • 您的复杂性陈述有点误导。实际上,它是O(AT + AU),其中AT 是所有矩形区域的总和,AU 是联合区域(或边界框,取决于您如何对所有网格单元进行最终迭代)。虽然理论上仍然具有相同的复杂性,但在实践中使用自动分区 kd-tree 可能会更快。即,您不会记录每个网格单元的重叠,而是每个树单元,根据矩形的大小分布,重叠可能要少得多。
  • 我会选择“Quadtree”。

标签: algorithm data-structures computational-geometry


【解决方案1】:

分析矩形集合的常用方法是使用扫描线算法。想象一条从集合左侧开始并向右扫描的垂直线。存储一组当前与线相交的矩形,最初为空。当线条通过任何矩形的垂直边时,需要更新此集合:在每种情况下添加或删除一个矩形。为了提高扫描效率,请使用垂直 x 坐标的排序列表。

在这种情况下,您还需要一种方法来有效地确定被 k 个或更多矩形覆盖的扫描线的间隔。这可以通过维护一个区间树来有效地完成。

根据细节,对于 n 个矩形,效率应该大致为 O(n log n),可能还有一个最大重叠深度的附加项。我会让你弄清楚细节。

【讨论】:

  • 你能扩展 interval tree 部分吗?这将是什么,您将如何构建它?
【解决方案2】:

将矩形插入数据结构中,并按底部坐标 x1 对其进行排序。使用例如自平衡二叉搜索树,这将具有复杂度 O(N.LogN),并允许按 O(N) 的顺序遍历树,其中 N 是矩形的数量。在示例中:

[R1, R3, R2]

在将矩形插入树中时,还要保留所有唯一底部和顶部坐标 y1 和 y2 的排序列表。在示例中:

[1, 3, 4, 5, 6, 7]  

现在我们将两个连续 y 坐标之间的每个水平切片视为一维问题(类似于this answer 中的第一种方法)。

从矩形树的开头遍历该切片中的所有矩形(请记住,矩形按 y1 排序,因此它们在开始时被分组在一起),并制作其唯一 x 坐标的排序列表, 每个值如果是左坐标则加 1,如果是右坐标则减 1。如果遇到顶部坐标等于切片顶部坐标的矩形,请将它们从矩形树中删除,这可以在 O(1) 中完成。对于示例中的第一个切片,y=1~3 和高度 2,那就是:

[1: +1, 5: -1]  

如果我们遍历它,我们会找到一个宽度为 4 的区域(因此区域为 8),它是 1 个矩形的一部分。

对于示例中的第二个切片,y=3~4 和高度 1,那就是:

[1: +1, 3: +1, 5: -1, 8, -1]  

如果我们遍历它,我们会找到一个宽度为 2 的区域(因此是区域 2),它是 1 个矩形的一部分,一个宽度为 2 的区域(因此是区域 2)是 2 个矩形的一部分,以及一个区域宽度为 3(因此区域为 3),是 1 个矩形的一部分。因此,任何属于 k 个矩形的区域都会被添加到总数中。等等。

创建矩形树是 O(N.LogN),创建切片列表是 O(N.LogN),遍历切片是 O(N),在每个切片中创建排序的 x 坐标列表是 O( N.LogN),总共O(N2.LogN),与矩形有多大、总面积有多大、矩形或簇之间有多少重叠无关矩形。

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2013-07-02
    相关资源
    最近更新 更多