基数排序的最佳基础

时间:2014-04-18 00:21:57

标签: performance algorithm sorting radix-sort radix

我已经阅读了有关此主题的几个来源。但是,我无法弄清楚这些公式到底意味着什么。当b = n时,似乎Radix Sort是线性的。这是否意味着,我应该将基数设置为数组的长度?

如果我有1亿个整数的数组,范围从0到10亿,我应该选择1亿的基数?

如果这不正确,请尝试为我愚蠢。使用Radix Sort I的大多数示例只能找到基数10或基数2,因此它们对于大于10或2的数组来说都很慢,或者我只是没有得到它。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

当您将基数设置为数组中的条目数时,基数排序实际上不是线性时间。基数排序的运行时间为O(n log b U),其中n是数组中元素的总数,b是选定的基数,U是数组中的最大数。如果设置b = n,则运行时为O(n log n U)= O(n log U / log n)。渐渐地,这真的很棒!

但实际上,在评估基数排序时,其他因素往往更为重要。一个方面是将数字分成单个数字的成本。使用具有2的幂的基数,这只是一个简单的位移。对于其他基础,您可能需要使用(相对)更昂贵的部门,这可能会有点伤害。但更重要的是,有参考的地方。如果你使用base b,那么你将有b个不同的数组,元素将被丢弃。如果选择b太高,那么在将元素附加到bucket数组的末尾时,可能会得到较差的缓存性能,这实际上会导致性能下降。

可能最好的想法是在不同的基础选择中实际分析程序并查看最佳选择。根据经验,当我尝试使用base-n基数排序时,我发现它比大输入上的标准base-2基数排序慢,主要是由于地点问题。我猜这个2不是基数排序的理想基础,但像2 16 这样的大事可能会开始遭遇缓存未命中。尝试尝试,让我们知道你发现了什么!

希望这有帮助!

答案 1 :(得分:1)

对于您的情况,最佳基数排序基数为2 ^ 16(65536)或2 ^ 8(256)。 在第一种情况下,您将为每个元素排序数组进行两次移动,在第二种情况下进行排序 - 进行4次移动。