我进行了很多搜索,但没有找到适合这种情况的好答案。我们有一些水平或垂直的矩形。它们可以随机放置在页面上。它们可以重叠或具有共同的边缘,或彼此分开。我想用O(nlogn)找到一种算法,可以找到这些矩形的周长和面积。这些图片可能使问题更清楚。
我认为间隔树可能会有所帮助,但我不确定如何。
可以通过 扫线 算法完成。
我们将从左到右扫描一条假想线。我们将注意到直线和矩形集之间的交点表示一组间隔的方式,并且当我们遇到矩形的左边缘或右边缘时,它会发生变化。
假设交点在x坐标 x1 和 x2 之间不变。然后,如果经过的交点的长度 X1 是 大号 ,线会扫过的区域等于( X2 - X1 ) 大号 ,通过从清扫 X1 至 X2* 。
例如,您可以在下一张图片中将 x1 视为左蓝色线,将 x1 视为右蓝色线(我从您那里偷走了,并进行了一些修改:)):
应该清楚的是,我们的 扫掠线 的交点在这些点之间没有变化。但是,蓝色相交与红色相交完全不同。
我们需要具有以下操作的数据结构:
insert_interval(y1, y2); get_total_length();
使用 段树 可以轻松实现这些功能,因此我现在不再赘述。
现在,该算法将如下所示:
由 左 及 右 我的意思是一个矩形的边。
该想法仅用于计算面积,但是,您可以对其进行修改以计算周长。基本上,您将想知道相交在某个x坐标处变化之前和之后的长度之间的差异。
该算法的复杂度为O(N log N)(尽管它取决于您可能会获得的输入值的范围,但这很容易解决)。
您可以在TopCoder上找到有关 扫线 算法的广泛主题的更多信息。
您可以在PEG评判Wiki上了解使用 段树的 各种方法。
这是我的算法(非常古老)的实现,作为SPOJ问题NKMARS的解决方案:实现。