【问题标题】:Generic and practical sorting algorithm faster than O(n log n)?比 O(n log n) 更快的通用和实用排序算法?
【发布时间】:2011-06-25 18:35:37
【问题描述】:

对于泛型元素(与计数排序或桶排序不同)是否有任何运行速度超过 O(n log n) 的实用算法?

【问题讨论】:

    标签: algorithm sorting computer-science big-o


    【解决方案1】:

    很多人都提到了信息论 Ω(n lg n) 对比较排序算法的约束,在比较排序中不能被打破。 (This earlier question 探讨了为什么会这样。)

    然而,有一些类型的比较排序,虽然在平均情况下不会破坏 O(n lg n),但可以显示在已经在某种程度上预先排序的输入上运行得更快。例如,Dijkstra 的平滑排序在 O(n) 上运行在 O(n lg n) 最坏情况行为的已排序输入上。我最喜欢的一种,Cartesian tree sort,可以证明在一些指标中充分利用了预排序。例如,它可以在 O(n) 时间内对具有恒定数量的递增或递减子序列的任何序列进行排序,在最坏的情况下优雅地降级到 O(n lg n)。

    关于非比较排序的主题,有一些著名但棘手的整数排序算法超过了 O(n lg n) bynp 执行巧妙的位操作技巧。最著名的整数排序算法是一种随机算法,可以在 O(n √lg lg n) 时间内排序,而最快的整数排序确定性算法在 O(n lg lg n) 时间内运行。您可能听说过基数排序在 O(n) 中有效,但从技术上讲它是 O(n lg U),其中 U 是要排序的数组中的最大值。

    简而言之,不,你不能比 O(n lg n) 做得更好,但如果你对自己的输入有所了解,你可以做得更好。

    【讨论】:

    • 在O(n √lg lg n)中运行的整数排序算法叫什么名字?
    • 我不确定它是否像其他排序算法一样有一个好听的名字。这些理论算法中的大多数只是以提出它们的人的名字而闻名。如果您查找有关整数排序的 Wikipedia 文章,您可以获得大量对原始论文的引用。
    【解决方案2】:

    没有。这是我们拥有的算法为数不多的严格的最小界限之一。对于 n 个元素的集合,有 n!不同的顺序,因此要指定给定的顺序,我们需要 log(n!) 位。根据斯特林的近似,这大约是 n log n。对于我们在元素之间进行的每次比较,我们基本上都会得到一点信息(忽略相同元素的可能性)。

    【讨论】:

      【解决方案3】:

      有多少个元素?即使它类似于 N1.2,Shell-Metzner 排序通常也比大多数其他排序更快(最多几千个元素)。

      这还取决于您所说的“通用”和“实用”。基数排序可以击败 O(n log n),它适用于相当广泛的数据(但绝对不是所有数据)。

      如果您对实用和通用的想法将算法限制为直接比较元素的算法,那么不——没有什么比 O(n log n) 更好(或永远不可能)。这已经被证明了很长一段时间。

      【讨论】:

        【解决方案4】:

        对于只能比较而不能访问其内部的通用元素,不可能有比 Theta(n log n) 更快的排序算法。那是因为有n! (n 阶乘) 元素的可能顺序,您需要 Theta(n log n) 比较来区分所有元素。

        【讨论】:

          猜你喜欢
          • 2021-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多