使用基数排序对n位整数进行排序时,选择最佳基数/桶数

时间:2014-01-13 03:02:42

标签: algorithm sorting computer-science time-complexity computer-science-theory

这是一个很受欢迎的问题:对100万个32位整数进行排序的最有效(时间复杂度)方法是什么。 Most answers似乎同意最好的方法之一是使用基数排序,因为这些数字中的位数被假定为常量。当CS学生第一次学习非基于比较的分类时,这也是一个非常普遍的思考练习。然而,我没有看到详细描述(或至少清楚地描述)的是如何最佳地选择算法的基数(或桶的数量)。

In this observed answer,根据经验进行基数/桶数的选择,对于32位100万个整数,结果为2 ^ 8。我想知道是否有更好的方法来选择这个数字?在“算法导论”(第198-199页)中,它解释了Radix的运行时应该是Big Theta(d(n + k))(d =数字/通过,n =项目数,k =可能的值)。然后它进一步说,给定n个b位数,并且任何正整数r <= b,radix-sort对Big Theta((b / r)(n + 2 ^ r))时间内的数字进行排序。然后它说:“如果b> = = floor(lg(n)),选择r~ = floor(lg(n))给出一个恒定因子内的最佳时间......”。

但是,如果我们选择r = lg(1百万)〜= 20!= 8,正如观察到的答案所暗示的那样。

这告诉我,我很可能误解了本书所暗示的“选择r”方法并且遗漏了某些东西(非常可能),或者观察到的答案没有选择最佳值。

有人可以为我清除这个吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

观察到的答案指向了一些似乎需要Google凭据的内容,而我并不热衷于“论文,请”。但是,我认为这最好通过经验解决,因为每个参数选择需要多长时间取决于缓存和其他内存访问行为的细节。当我们计算出算法在理论上采用的时间时,我们通常不会使用这样详细的模型 - 我们通常只考虑操作次数或内存访问次数,我们通常甚至会丢弃常数因子,因此我们可以使用符号像O(n)vs O(n ^ 2)。

如果你在一个长期运行的程序中做了很多类似的基数排序,那么在开始选择最佳设置之前,你可以花一些时间进行一系列测试。即使不同的计算机需要不同的设置,这也会确保它使用最快的设置,因为它们具有不同大小的缓存,或者主存储器和缓存之间的访问时间比例不同。