用于对多边形轮廓中的顶点进行排序的线性时间算法

时间:2010-05-12 06:18:12

标签: c algorithm sorting polygon

我想出了一个算法,如果我将顶点索引从最低坐标分类到最高坐标,我可以让我在线性时间内将我的有孔多边形变成梯形。

我将简单的多边形作为轮廓。它们具有可能在大多数时间被利用的某种顺序。

所以给出这些条件,是否有一个接近线性时间的排序算法?

4 个答案:

答案 0 :(得分:1)

我认为您想要的答案是“不”,但我也认为您可能需要更仔细地考虑您的问题。

问题是您使用的是连续坐标,因此原则上您不能使用线性排序。 (实际上,你可以使用一个基数排序来处理固定大小的坐标,但实际上这可能比标准的O(N log N)排序要慢,因为涉及的开销......)

理论规则是:只要您遇到只能比较值的情况,一般排序不能比O(N log N)快。

您提到了一个未指定的属性,“可能会在大多数时间被利用”。问题是O()符号是渐近的,最坏情况的理论属性,所以“大部分时间”都不会产生影响。通常可以通过这种方式利用输入的特定属性,但是:

  • O()加速对你的财产是什么非常敏感
  • 具有更好O()的算法可能会比实际应用慢得多
  • 实际利用输入的最有效技术通常与具有最佳渐近属性的技术非常不同

不幸的是,在调整算法以利用您的输入时,很容易错过一个模糊的最坏情况,这种情况会在您发布之后很久就以意想不到的方式消除您的性能。关于算法的O()最重要的是阻止它像这样严重爆炸。

请注意,为此,O(N log N) 接近线性,并且使用标准的,表现良好的库排序可能是正确的选择。

答案 1 :(得分:0)

以线性时间运行的排序算法包括排序,基数排序和存储桶排序。

Wiki也很有帮助: Sorting algorithms

答案 2 :(得分:0)

我不确定“某些订单”和“大部分时间”是什么意思。对于简单(即非凸)的一般多边形,恐怕可能没有解,因为这些点可能与它们的坐标有任何顺序(你可以有非常奇怪形状的“简单”多边形......)

如果你正在处理凸多边形,那么相对于y坐标的线性时间排序很简单:只需找到最低点并在左侧和右侧“向上走”并行...

无论如何,除非你有很大的多边形,否则一个很好实现的 O(n log n)算法可能比某些线性时间算法快(甚至更快)(例如,如果线性算法大于 log n ...)

答案 3 :(得分:0)

你的问题有点模糊,但假设如下:

  1. 多边形是2D
  2. 您想要沿特定轴(x或y)
  3. 对顶点进行排序
  4. 多边形定义为连接轮廓
  5. 您可以执行以下操作:

    1. 沿顶点行走
    2. 对于第一个顶点,将其添加到范围
    3. 对于每个其他顶点,如果顶点比前一个顶点“高”,则将其添加到当前范围,否则创建一个包含顶点的新范围。
    4. 我们现在有一个排序范围列表,将范围相互合并:http://en.wikipedia.org/wiki/Merge_algorithm