这是一个流行的问题:对 100 万个 32 位整数进行排序的最有效(时间复杂度)方法是什么。大多数答案似乎都同意,最好的方法之一是使用基数排序,因为假设这些数字中的位数是恒定的。当 CS 学生第一次学习基于非比较的排序时,这也是一个非常常见的思维练习。但是,我没有看到详细(或至少清楚地)描述的是如何为算法优化选择基数(或桶数)。
在这个观察到的答案中,基数/桶数的选择是凭经验完成的,对于 32 位 100 万整数,结果是 2^8。我想知道是否有更好的方法来选择该号码?在“算法简介”(第 198-199 页)中,它解释了 Radix 的运行时间应该是 Big Theta(d(n+k))(d=digits/passes,n=number of items,k=possible values)。然后它进一步说,给定 n 个 b 位数字,并且任何正整数 r <= b,基数排序在 Big Theta((b/r)(n+2^r)) 时间内对数字进行排序。然后它说:“如果 b>= floor(lg(n)),则选择 r ~= floor(lg(n)) 给出了在常数因子内的最佳时间......”。
但是,如果我们选择 r=lg(1million)~=20 != 8 正如观察到的答案所示。
这告诉我,我很可能误解了书中建议的“选择 r”方法,并且遗漏了一些东西(很可能),或者观察到的答案没有选择最佳值。
谁能帮我解决这个问题?先感谢您。