我想出了一个算法,如果我将顶点索引从最低坐标分类到最高坐标,我可以让我在线性时间内将我的有孔多边形变成梯形。
我将简单的多边形作为轮廓。它们具有可能在大多数时间被利用的某种顺序。
所以给出这些条件,是否有一个接近线性时间的排序算法?
答案 0 :(得分:1)
我认为您想要的答案是“不”,但我也认为您可能需要更仔细地考虑您的问题。
问题是您使用的是连续坐标,因此原则上您不能使用线性排序。 (实际上,你可以使用一个基数排序来处理固定大小的坐标,但实际上这可能比标准的O(N log N)排序要慢,因为涉及的开销......)
理论规则是:只要您遇到只能比较值的情况,一般排序不能比O(N log N)快。
您提到了一个未指定的属性,“可能会在大多数时间被利用”。问题是O()符号是渐近的,最坏情况的理论属性,所以“大部分时间”都不会产生影响。通常可以通过这种方式利用输入的特定属性,但是:
不幸的是,在调整算法以利用您的输入时,很容易错过一个模糊的最坏情况,这种情况会在您发布之后很久就以意想不到的方式消除您的性能。关于算法的O()最重要的是阻止它像这样严重爆炸。
请注意,为此,O(N log N) 接近线性,并且使用标准的,表现良好的库排序可能是正确的选择。
答案 1 :(得分:0)
以线性时间运行的排序算法包括排序,基数排序和存储桶排序。
Wiki也很有帮助: Sorting algorithms
答案 2 :(得分:0)
我不确定“某些订单”和“大部分时间”是什么意思。对于简单(即非凸)的一般多边形,恐怕可能没有解,因为这些点可能与它们的坐标有任何顺序(你可以有非常奇怪形状的“简单”多边形......)
如果你正在处理凸多边形,那么相对于y坐标的线性时间排序很简单:只需找到最低点并在左侧和右侧“向上走”并行...
无论如何,除非你有很大的多边形,否则一个很好实现的 O(n log n)算法可能比某些线性时间算法快(甚至更快)(例如,如果线性算法大于 log n ...)
答案 3 :(得分:0)
你的问题有点模糊,但假设如下:
您可以执行以下操作: