Radix按线性时间排序,将输入转换为适当的基数

时间:2016-05-16 20:24:17

标签: algorithm sorting radix-sort

我在考虑线性时间排序问题,该问题出现在很多来源中,提示您在线性时间内对0n^3-1范围内的数字数组进行排序。

所以一种方法是使用基数排序,通常在O(wn)中运行,其中w是最大单词大小,观察我们可以获得任何数字的单词大小3在该范围内使用基础n

这就是我的问题 - 虽然它在纸上看起来不错,但实际上将所有数字转换为基数n,这种天真的方式将花费相当多的时间,甚至可能比后来的排序更多本身。有没有办法比天真地更快地转换为基础n或以某种方式欺骗这种限制,或者你只需​​要忍受它吗?

2 个答案:

答案 0 :(得分:2)

一个有用的观察结果是,如果您选择的是基数而不是数字n,那么此算法的运行时间是相同的,但是2的最小幂大于或等于n。让我们想象这个数字是2 k 。现在,要读取一个数字的base-2 k 数字,你可以检查数字中大小为k的位块,使用一些位移和逻辑AND可以很快地完成。即使您的数字存储为可变长度整数,这也可能很快,假设可变长度整数使用了一些很好的二进制编码。

答案 1 :(得分:0)

根据数组的大小,选择k位字段使用2 k 作为基数排序的基数有一个理想的大小,但它没有太大的区别,小于选择r = 8(1次读取通过+ 4次基数排序)的10%,而r = 16(1次读取通过+ 2次基数排序),因为r = 8对缓存更友好。在我的系统上,(Intel 2600K 3.4 ghz),对于阵列大小= 2 ^ 20,r = 8稍微快一些。对于数组大小= 2 ^ 24,r = 10.67(使用10,11,11位字段)稍微快一些。对于数组大小= 2 ^ 26,r = 16稍微快一些。

对于有符号整数,可以在基数排序期间切换符号位。

在您的情况下,给出了整数的最大值,因此这有助于选择位字段大小。