【发布时间】: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