为什么基数排序为


23

在基数排序中,我们首先按最低有效位排序,然后再按第二最低有效位排序,依此类推,最后得到排序列表。

现在,如果我们有数字的列表,则需要位来区分这些数字。因此,我们进行的基数排序次数将为。每遍花费时间,因此基数排序的运行时间为nlognlognO(n)O(nlogn)

但是众所周知,它是线性时间算法。为什么?


这就是为什么线性时间排序通常要求输入是某个固定范围内的整数。基数排序要求数字的固定范围。在例子中,你假定范围为,但任何整数范围是可能的数字; 例如,您可以选择[ 0 [0,1][0,n]

Answers:


19

如果我们有数字的列表,我们需要对数nnlogn

否:如果我们有一个介于2 k1之间的数字列表,则需要k位。通常,klog n之间没有关系。02k1kklogn

如果数字都是不同的,那么,和基数排序上不同数字因此具有的时间复杂度Ω Ñ 登录Ñ 。通常,基数排序的复杂度为Θ nlognkΩ(nlogn),其中 n是要排序的元素数, k是每个元素中的位数。Θ(nk)nk

要说基数排序的复杂度为意味着对数字采用固定的位大小。这意味着对于足够大的n,将存在许多重复值。O(n)n


有一个普遍的定理,即一次通过比较两个元素而工作的数组或列表排序方法在最坏的情况下不能比运行得更快。基数排序无法通过比较元素来工作,但是相同的证明方法有效。基数排序是决定要应用于数组的排列的决策过程;有n 数组的排列和基数排序采用二进制决策,即它决定在每个阶段是否交换两个元素。经过m个二元决策后,基数排序可以确定2 m个排列之间。达到n 可能的排列,有必要Θ(nlogn)n!m2mn!mlog(n!)=Θ(nlogn)

我在上面没有写过的证明中的一个假设是,算法必须在元素不同的情况下起作用。如果先验地知道这些元素不是全部不同,则潜在排列的数量小于全部。当排序ķ位数字,它是只可能有Ñ不同元件时Ñ 2 ķ ; 在那种情况下,基数排序的复杂度确实是Ω n log n 。对于较大的n值,必须存在冲突,这说明了基数排序如何具有小于Θ n!knn2kΩ(nlogn)n Ñ > 2 ķΘ(nlogn)n>2k


1
另一种观点是word-RAM成本模型:我们的机器可以在恒定时间内处理位整数。(当前的机器的w = 64。)这样,可以通过直接访问相应的数组元素在O 1 时间内完成2 w个桶的分布排序的一个步骤。这样,对于n个整数,每个w = O log n 位,基数排序是线性的。ww=642wO(1)nw=O(logn)
塞巴斯蒂安

9

分析时要小心:您认为要在时间内进行排序是什么?这是因为您的每个数字都在0k 1的范围内,这意味着您的数字可以采用k个可能的值。您需要一个稳定的排序算法,因此您可以例如选择计数排序。计数排序以Θ n + k 时间进行。如果k = O n ,则计数排序以线性时间运行。O(n)0k1kΘ(n+k)k=O(n)

您的每个字符串或数字都有数字。如您所说,您使d越过了它们。因此,基数排序显然在Θ d n + k 时间进行。但是,如果我们认为d是常数并且k = O n ,我们会发现基数排序是线性时间。ddΘ(d(n+k))dk=O(n)


1
例如,假设对于常数d,对于某些N = O n d,您正在对范围内的整数进行排序。然后,您可以拥有O d )个数字,每个数字的范围为O n [0,N1]N=O(nd)dO(d)O(n)
2012年

-2

I think the assumption k=log2(n) is wrong. You can perform radix sort with numbers in, e.g., hex. Thus, at each step you split you array of numbers into 16 buckets.


6
As far as big-O is concerned, there's no difference between log2n and log16n.
Rick Decker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.