如果给定一个由n个数字组成的数组,并且m是数组中最大的数字,我们如何选择最有效的基数进行基数排序



如果我们得到一个由n个数字组成的数组,并且m是数组中最大的数字,并且我们想使用基数排序来对这个数组进行排序,那么我们如何选择基数排序以使其节省时间和内存?数组的大小或数组的最大数量如何帮助我们选择基数。

这是特定于处理器的,与内部缓存以及缓存的实现方式有关。在X86处理器的情况下,可能有3或4个级别的高速缓存,通常这些都是8路关联的。

一些处理器对紧循环中代码的位置也很敏感。在我的系统中,我看到相同代码的运行时间差异高达40%,其中唯一的差异是我用来将它们对齐到偶数或奇数16字节边界的函数之间的nops。

对于在32位或64位无符号整数上使用基数排序,以256为基数似乎是最好的。我运行了对3600万个伪随机64位无符号整数进行排序的基准测试,使用位字段大小{8,8,8,8,8}(以256为基数(进行8次遍历。我尝试使用{11,11,11,10,10}(以2048或1024为基数(进行6次传递,所用时间是原来的两倍(约2秒,而不是约1秒(,这是一个与如何在处理器上实现缓存有关的问题。我还尝试了{16,16,16,16}(基数65536(,4次传球,几乎花了2.5秒。

可以考虑m的相对较小的值。如果m是<=65536,则可以在2次遍历中完成基数为256(2^8(的基数排序。如果对整数和m进行排序足够小,那么基于计数而不是实际对数据进行排序的单次计数排序会更快。

最新更新