algorithm - 计算随机放在 table 上的卡片所覆盖的区域

标签 algorithm math data-structures computational-geometry

这是一道面试题,面试过了。

给定一副长方形卡片,将它们随机放在一张长方形 table 上, table 的大小远大于卡片大小的总和。有些卡片可能会随机重叠。设计一个算法,计算出所有卡片覆盖的 table 面积,并分析算法的时间复杂度。所有卡片的每个顶点的所有坐标都是已知的。卡片可以以任何模式重叠。

我的想法:

按垂直坐标降序对卡片进行排序。

到达卡片的边或顶点后,从上到下垂直扫描卡片,用另一条扫描线继续扫描,直到到达另一条边,找到两条线之间的区域。最后,将位于两条线之间的所有区域相加并得到结果。

但是,如果面积不规则,如何计算位于两条线之间的面积是一个问题。

感谢任何帮助。谢谢!

最佳答案

这可以使用 union-intersection formula 轻松完成(A union B union C 的大小 = A + B + C - AB - AC - BC + ABC 等),但这会导致 O(n!) 算法。还有另一种更复杂的方法会导致 O(n^2 (log n)^2)


将每张卡片存储为一个多边形+它在列表中的面积。将列表中的每个多边形与其他每个多边形进行比较。如果它们相交,则将它们都从列表中删除,并将它们的并集添加到列表中。继续直到没有多边形相交。将它们的面积相加得到总面积。

多边形可以是凹的并且有孔,因此计算它们的交点并不容易。但是,有algorithms (和 libraries ) 可用于在 O(k log k) 中计算它,其中 k 是顶点数。由于顶点的数量可以是 n 的数量级,这意味着计算交集是 O(n log n)

将每个多边形与其他每个多边形进行比较是 O(n^2)。但是,我们可以使用 O(n log n) sweeping algorithm而是找到最近的多边形,使整个算法 O((n log n)^2) = O(n^2 (log n)^2)

关于algorithm - 计算随机放在 table 上的卡片所覆盖的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9910459/

相关文章:

c++ - 不正确的排序和/或搜索通过外部文件填充的数组

javascript - 简单的算术错误javascript

algorithm - 计算没有连续元素的子集总数

arrays - 笛卡尔幂(一种特殊的笛卡尔积)——以可重复的方式从数组中选择元素

algorithm - Graph - 有向图的平方

algorithm - 构造一棵二叉树,使得后序遍历应该给出排序后的结果

algorithm - 汽车转向算法?

javascript - 如何对数组进行高效排序

java - 在 Java 中使用循环的数字模式

python - 链表 : Finding intersection of 2 linked lists by swapping their pointers after reaching the end of one of them