O(nlogn)分而治之算法计算矩形联合

时间:2014-03-10 20:42:23

标签: algorithm union computational-geometry rectangles divide-and-conquer

我知道有很多与我的问题相关的问题在这里被问到并回答过,但我仍然感到困惑。而且我对计算几何有点陌生,任何建议都会有所帮助。

问题:一组n个矩形,其边缘与x或y轴平行,每个都有相同的长度和高度;每个矩形的四个角点的坐标是已知的,设计一个O(nlogn)时间分而治之算法来计算所有矩形的并集,union表示这些矩形所覆盖的组合区域。

这些矩形可以是不相交的,接触的或重叠的,并且有数千个矩形。输出可以是任何形状(结果可以是内部空心的,如洋葱圈),边界由一组点坐标定义。当我将它们分成两半时,我正在努力研究如何合并这两个子部分。 (我知道如何使用扫描线/扫描平面方法计算联合区域,但不知道如何使用DaC进行计算。)

示例:

1 个答案:

答案 0 :(得分:1)

让我们像众所周知的merge sort algorithm一样思考。请致电我们的程序UnionShape。假设我们有向量<形状>最初的结构大小为n(未排序),因此我们可以将它除以一半并递归地应用UnionShape,给出lg n个级别(让它为k)。如果我们可以详细说明Union程序,那么在每个级别上我们将有O(n)工作,我们将得到总数O(n lg(n))。

想法是,如果形状的角是排序,我们可以详细说明Union过程,这样它需要O(m)时间,其中m是联合形状的角的数量。最初(最低k级 - 在k次递归调用之后)总数为n / 2 ^ k,比如2,矩形的角已经排序。我们有2 ^ k个Union调用,每个角有n / 2 ^ k个角,O(n)。当组合矩形时,我们支持所得形状的角的排序顺序。在下一个级别,我们将有2 ^(k-1)次调用n / 2 ^(k-1)个形状角(最大)等等 - 每个级别给出O(n)比较,我们有lg n个等级,所以我们一共有O(n lgn)。

这就是你的意思,如果你以这种方式完成数据结构和联盟程序,你就可以完成。