【问题标题】:O(nlogn) divide-and-conquer algorithm computing union of rectanglesO(nlogn) 分治算法计算矩形的并集
【发布时间】:2014-03-10 20:42:23
【问题描述】:

我知道这里有很多与我的问题相关的问题,但我仍然感到困惑。而且我是计算几何的新手,任何建议都会有所帮助。

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

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

例子:

【问题讨论】:

  • 如果每个子输出都已排序,则扫描线合并将是 O(n)。
  • 什么是联合形状?比如说,第一个矩形是 ( (0,0), (0,1), (1,0), (1,1) ),第二个是 ( (2,1), (2,2), (3,1 ), (3,2) )。如果我们取 min x, min y, max x, max y,会是理想的联合吗? ( (0,0), (0,2), (3,0), (3,2) )。然后只需找到最小值和最大值,它将是 O(n)。
  • @DavidEisenstat 我正在考虑通过递归绘制虚拟垂直线来将矩形的所有左下角分成两半,直到垂直线左侧只有一个矩形,但还没有想出了如何合并左侧和右侧区域
  • @Alex union 表示这些矩形覆盖的所有区域,留出空白,可以参考示例图片

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


【解决方案1】:

让我们像众所周知的merge sort algorithm 一样思考。调用我们的程序 UnionShape。假设我们有一个初始大小为 n(未排序)的向量 结构,所以我们可以将其除以一半并递归地应用 UnionShape,给它 lg n 个级别(让它为 k)。如果我们可以详细说明联合程序,使得在每个级别上都有 O(n) 个工作,我们将得到 O (n lg (n)) 的总数。

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

这就是你的重点,如果你以这种方式制定数据结构和联合程序,你就会完成。

【讨论】:

  • 谢谢,我明白你的想法,这就是我一直在努力实现的。尽管如此,我对如何精确地合并(例如在最低级别)两个矩形感到沮丧。在运行时间复杂度方面,我可以合理地证明 O(nlogn),我只是不知道如何编写合并两个子形状的过程。
猜你喜欢
  • 2016-01-05
  • 2015-07-07
  • 2021-05-25
  • 1970-01-01
  • 2017-08-12
  • 2015-09-05
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多