每个矩形由4个双打组成:(x0,y0,x1,y1)
边缘与x轴和y轴平行
它们随机放置 - 它们可能在边缘接触,重叠或没有任何接触
我需要找到由它们重叠形成的区域 - 画布中多个矩形“覆盖”的所有区域(例如,有两个矩形,它将是交叉点)
我明白我需要使用扫描线算法。我必须使用树形结构吗?使用扫描线算法解决此问题的最简单方法是什么?
答案 0 :(得分:2)
乍一看似乎O(n ^ 2)算法应该是直截了当的,因为我们可以检查所有成对点。但是,这会产生重复计算的问题,因为3个矩形中的所有点都会被计数3次!在意识到这一点之后,O(n ^ 2)算法现在对我来说并不坏看。如果你能想到一个简单的O(n ^ 2)算法,请发帖。
这是一个O(n ^ 2 log ^ 2 n)算法。
数据结构:Point(p){x_value,isBegin,isEnd,y_low,y_high,rectid}
[对于每个点,我们有一个x_value,两个y_values,以及这个点来自的矩形的ID]
给定n个矩形,首先使用矩形的x_left和x_right值创建2n个点。
创建一个点列表,并在x_value上对其进行排序。这需要O(n log n)时间
从左侧开始(索引0),在看到开始时使用地图放置,并在看到终点时删除。
换句话说:
Map m = new HashMap(); // rectangles overlapping in x-axis
for (Point p in the sorted list) {
if (p.isBegin()) {
m.put(p); // m is keyed off of rectangle id
if (s.size() >= 2) {
checkOverlappingRectangles(m.values())
}
} else {
m.remove(p); // So, this takes O(log n) time
}
}
接下来,我们需要一个获取矩形列表的函数,知道所有矩形都有重叠的x轴,但在y轴上可能重叠也可能不重叠。事实上,这与该算法相同,我们只使用横向数据结构,因为我们现在对y轴感兴趣。