Algorithm 创建一个;“未翻译”;方格

Algorithm 创建一个;“未翻译”;方格,algorithm,Algorithm,我正在写一个程序,根据用户给出的每个正方形的坐标和边长,将正方形的周长打印到屏幕上 如果正方形重叠,那么它们应该位于彼此的顶部,以便底部的正方形被顶部的正方形隐藏 正方形的顺序是根据它们输入程序的顺序设置的(首先是底部) 例如: &&&& && &&$$$ &&&&$ $$ $$ $$$$$ 我提出的最佳算法是每平方的时间复杂度为O(n^2) 你提到的O(n^2)算法可能是经典的“画师算法”,在该算法中,你只需从底部到顶部一个接一个地渲染(“光栅化”)正方形。这是一个非常好的算法,广泛应用于计算

我正在写一个程序,根据用户给出的每个正方形的坐标和边长,将正方形的周长打印到屏幕上

如果正方形重叠,那么它们应该位于彼此的顶部,以便底部的正方形被顶部的正方形隐藏

正方形的顺序是根据它们输入程序的顺序设置的(首先是底部)

例如:

&&&&
&&
&&$$$
&&&&$
$$
$$
$$$$$

我提出的最佳算法是每平方的时间复杂度为O(n^2)

你提到的
O(n^2)
算法可能是经典的“画师算法”,在该算法中,你只需从底部到顶部一个接一个地渲染(“光栅化”)正方形。这是一个非常好的算法,广泛应用于计算机图形学。然而,任何“光栅”算法都将具有与每平方米
O(n^2)
相同的时间复杂度

但是如果你想要一个渐进的更快的算法,你必须寻找一个“向量”算法,也就是说,该算法可以处理正方形的边缘,但不会浪费时间处理它们的内部。构建这种算法的一种方法是预先计算矢量形式的最终可见边布局,然后仅在屏幕上绘制可见边

要实现类似的功能,每个正方形最初必须由一组四条边表示。然后,单次扫描线算法将消除不可见边。然后可以在屏幕上渲染剩余的可见边。该算法将比“画家算法”复杂得多,因为您必须实现扫描和边缘消除逻辑。但是对于这个特殊的问题(特别是考虑到它涉及正交几何),它一点也不难


另外,这里的一个关键点是,后一种方法只有在所有平方都事先已知的情况下才能起作用,即它只适用于离线问题。如果你正在处理一个在线问题,也就是说,当你从输入中收到正方形时,你必须立即画出它们,而不是事先知道所有的正方形,那么在一般情况下,没有理由试图在这里改进任何东西。使用画家的算法。

画家的算法()处理这个问题。@AndyG:这可能正是OP的
O(n^2)
算法的意思。@AndreyT:在一般情况下构造BSP是O(n^2),但对于正交几何,Paterson和Yao证明它是O(n sqrt n)@AndyG:首先,我不明白这与BSP有什么关系。“画师算法”的整体思想是,您只需从后到前将内容光栅化,所有内容都可以正常显示,而无需任何BSP。其次,在任何光栅算法中,所需的工作量都保证为
O(n^2)
,这仅仅是因为您必须填充
O(n^2)
每平方像素。你可以对它进行优化,但它不会渐进地改变任何东西。@AndreyT我的意思是画家的算法是前后画。因此,它需要订购。BSP给出了这样的排序,考虑了循环重叠的情况。在OP的例子中,一个朴素的画师算法可能会起作用,因为输入已经指定了顺序,所以不会有任何循环重叠。请您详细说明一下向量形式和扫描线算法好吗?我也不熟悉。@David Tzoor:“扫描线”是一种用于构建各种向量算法的方法,例如,处理指定为边集的多边形的算法。这是一个相当广泛的话题,它太宽泛了,无法用一个单一的答案来回答。在网上搜索“扫描线算法”,你会发现大量的信息。任何关于计算几何的书都会描述这种方法。在任何情况下,这种情况下的想法都是提前剪掉边缘的不可见部分。“扫描线”在这方面效果很好,但也可以使用其他方法。