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

Posted

技术标签:

【中文标题】线性时间的基数排序与将输入转换为适当的基数【英文标题】:Radix sort in linear time vs. converting input to proper base 【发布时间】:2016-05-16 20:24:16 【问题描述】:

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

因此,一种方法是使用基数排序,它通常在O(wn) 中运行,其中w 是最大字长,通过观察我们可以通过使用base 获得该范围内任何数字的字长3 n.

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

【问题讨论】:

【参考方案1】:

一个有用的观察是,如果您选择的基数不是 n,而是大于或等于 n 的 2 的最小幂,则该算法的运行时间是相同的。假设这个数字是 2k。现在,要读取一个数字的 base-2k 位,您只需检查数字中大小为 k 的位块,使用一些位移位和逻辑 AND 可以很快地做到这一点。即使您的数字存储为可变长度整数,这也可能会很快,假设可变长度整数使用某种不错的二进制编码。

【讨论】:

【参考方案2】:

根据数组的大小选择 k 位字段以使用 2k 作为基数排序的基数有一个理想的大小,但它并没有太大的区别,小于10% 用于选择 r = 8(1 个读取通道 + 4 个基数排序通道),而 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 稍快。

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

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

【讨论】:

以上是关于线性时间的基数排序与将输入转换为适当的基数的主要内容,如果未能解决你的问题,请参考以下文章

我应该在基数排序中使用哪个基数?以及如何在基数之间转换?

4.10 基数排序

大量数据常采用的高效排序算法:桶排序计数排序基数排序

算法渣-排序-基数排序

基础备忘基数排序

计数排序基数排序桶排序