algorithm - O(nlogn) 分治算法计算矩形并集

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

我知道这里提出并回答了很多与我的问题相关的问题,但我仍然很困惑。我对计算几何有点陌生,任何建议都会有帮助。

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

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

示例:

最佳答案

让我们像众所周知的 merge sort algorithm 一样思考。调用我们的程序 UnionShape。假设我们有最初大小为 n(未排序)的向量< Shape > 结构,因此我们可以将其除以一半并递归地对其应用 UnionShape,从而给出 lg n 个级别(令其为 k)。如果我们可以详细说明 Union 过程,使得在每个级别上我们都有 O(n) 工作,我们将得到总共 O (n lg (n))。

想法是,如果形状的角点已排序,我们可以详细说明并集过程,使其花费 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)。

这就是您的重点,如果您以这种方式计算出数据结构和 Union 过程,您就完成了。

关于algorithm - O(nlogn) 分治算法计算矩形并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22310889/

相关文章:

c - 如何正确使用灵活数组成员?

c++ - 如何生成随机顶点以在 C++ 中形成凸多边形?

algorithm - 直线与凸集的交集

algorithm - 从给定的四个整数显示最大军事时间

arrays - 排序但旋转的数组

algorithm - 使用分而治之是否会提高在数组中查找最大值和最小值的时间复杂度

mysql - UNION 查询中的订单字段

sql - 使用 Microsoft Access SQL 将多个列中的数据合并到单个列中

algorithm - Sub O(n ^ 2)算法来计算嵌套间隔?

c++ - 我可能对 std::set 的工作感到困惑。我的代码不能正常工作