【问题标题】:No key-comparison sorting algorithm无键比较排序算法
【发布时间】:2012-11-24 17:39:20
【问题描述】:

在这个webpage我可以阅读:

一些特殊情况的算法(一个例子在 Programming Pearls) 可以更快地对某些数据集进行排序 O(n*log(n))。这些算法不是基于比较项目 被排序并依靠技巧。已经证明没有 key-comparison 算法的性能优于 O(n*log(n))。

这是我第一次听说非比较算法。谁能给我一个这些算法的例子,并更好地解释他们如何比 O(nlog(n)) 更快地解决排序问题?该网页的作者在说什么技巧?

欢迎任何指向论文或其他良好来源的链接。谢谢。

【问题讨论】:

  • 注:编辑删除了“这是我第一次听说 no 键比较算法”中的“no”一词。 - 虽然这是回答问题的关键。
  • 抱歉,我不懂编辑。这不是我第一次听说如此著名的密钥比较算法。这是我第一次听说:“no-key-comparison alg”。
  • 用 NPE 使用的术语再次编辑

标签: sorting


【解决方案1】:

首先,让我们弄清楚术语:

  1. 关键比较算法不能比O(n logn)做得更好。
  2. 还有其他的 -- 非比较 -- 给定数据的某些假设的算法可以比O(n logn) 做得更好。 Bucket sort 就是这样一个例子。

为了给出第二类的直观示例,假设您知道您的输入数组完全由零和一组成。您可以遍历数组,计算零和一的数量。让我们将最终计数称为n0n1。然后遍历输出数组,写出n0 零,然后是n1 。这是一个O(n) 排序算法。

仅仅因为我们利用了数据的特殊结构,才有可能为这个问题提出一个线性时间算法。这与通用的键比较算法形成对比。这样的算法不需要知道任何关于数据的信息,除了一件事:它们需要知道如何比较任意两个元素的排序键。换句话说,给定任意两个元素,它们需要知道哪个应该在排序后的数组中排在第一位。

仅使用一种算法就能够以任何可以想象的方式对任何事物进行排序的代价是,平均而言,没有一种算法能比O(n logn) 做得更好。

【讨论】:

  • 所以,我们可以说我的问题引用中提到的“技巧”与“对数据进行某些假设”的可能性密切相关?
  • @LuigiMassaGallerano:没错。
【解决方案2】:

是的,非比较排序通常需要 O(n),这些排序算法的一个例子是 Bucket SortRadix Sort

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多