【问题标题】:Radix sort explanation基数排序解释
【发布时间】:2015-07-08 06:17:28
【问题描述】:

根据这篇基数排序文章http://www.geeksforgeeks.org/radix-sort/,我很难理解在排序中某些方法的时间复杂度方面所解释的内容。

来自链接:

假设输入整数中有 d 个数字。基数排序需要 O(d*(n+b)) 时间,其中 b 是表示数字的基数,例如,对于十进制系统,b 是 10。d 的值是多少?如果 k 是最大可能值,则 d 将为 O(log_b(k))。所以整体时间复杂度是 O((n+b)*logb(k))。这看起来比基于比较的大 k 排序算法的时间复杂度要高。让我们首先限制k。令 k≤nc 其中 c 是一个常数。在这种情况下,复杂度变为 O(nlogb(n))。

所以我知道排序需要 O(d*n),因为有 d 个数字因此 d 通过,并且您必须处理所有 n 个元素,但我从那里丢失了它。一个简单的解释会很有帮助。

【问题讨论】:

  • 这个 Quora 回答中有一个很好的解释:qr.ae/0pyTm

标签: algorithm sorting asymptotic-complexity radix


【解决方案1】:

假设我们使用桶排序对每个数字进行排序:对于每个数字(d),我们处理所有数字(n),将它们放入桶中以获取一个数字可能具有的所有可能值(b)

然后我们需要处理所有的桶,重新创建原始列表。将所有项目放入桶中需要 O(n) 时间,从所有桶中重新创建列表需要 O(n + b) 时间(我们必须遍历所有桶和其中的所有元素),我们对所有数字执行此操作,运行O(d * (n + b))的时间。

如果d 是一个常数并且b 不是渐近大于n,这只有线性。因此,确实,如果您有多个 log n 位,则需要 O(n log n) 时间。

【讨论】:

  • 你的解释没有考虑被排序的数字的基数,或者最大数字的宽度,这两者都决定了最终的运行时间。
  • @TimBiegeleisen 是的,它确实如此,b 是一个数字可以具有的值的数量(也就是基数),d 是每个数字中的位数(也就是宽度)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2020-08-05
  • 2015-12-01
相关资源
最近更新 更多