基数排序和更改基数

Posted

技术标签:

【中文标题】基数排序和更改基数【英文标题】:Radix sort and changing base 【发布时间】:2015-07-03 10:29:28 【问题描述】:

我最近了解了基数排序。

我知道您可以更改需要排序的数字的基数,但我真的不明白为什么这对基数排序有好处。 基数排序运行时间是 $O(d(n+k))$,其中 $d$ 是数字的位数,$k$ 是基数。

那么 $d$ 和 $k$ 之间不应该有一个固定的配给,以便优化运行时吗?

我应该如何以其他方式选择基地?

【问题讨论】:

【参考方案1】:

我认为您缺少的一个观察是每个数字中的位数取决于基数。例如,数字 255 需要以 10 为底的三位数字(十进制),以 2 为底的 8 位数字(二进制​​),以 16 为底的两位数字(十六进制),以及以 256 为底的一位数字(我认为没有名称它)。更一般地,当以基数 b 写出时,数字 n 需要 Θ(logb n) 位。通常,大 O 表示法会忽略对数的底,但由于此处 b 是变量,我们需要将其考虑在内。使用对数的基数变化公式,我们得到需要 Θ(log n / log b) 位来写出一个数字 n。

因此,假设您正在对一个包含 n 个数字的列表进行排序,其中您要排序的最大数字是数字 U。如果您选择一个底数 b,那么将有 Θ(log b U) = Θ(log U / log b) base-b 数字中的最大数,所以你需要 Θ(log U / log b) 轮的基数排序。每轮需要时间 Θ(n + b),因此总运行时间为 Θ((log U / log b)(n + b))。

这是一个有趣的运行时,因为根据 n、U 和 b 的相对值,您会得到不同的结果。例如,假设您选择 b 为任何常数值。那么这个运行时间是 Θ(n log U),它非常快,但是隐藏在这里的常数因子会产生很大的不同。如果使用基数 n,其中 n 是元素的数量,则运行时间渐近为 Θ(n log U / log n),它渐近地比任何固定基数都快,但在实践中通常会慢一些,除了巨大的输入。如果您知道 U 将比 n 小得多(例如,使用 little-o 表示法的 U = o(n)),那么您可以使用 base U 来获得 Θ(n) 的运行时间,主要是因为您'这里回到标准计数排序。

如您所见,更改基础确实可以产生很大的不同!我建议在实践中尝试一下,看看这个理论最终的效果如何。

【讨论】:

以上是关于基数排序和更改基数的主要内容,如果未能解决你的问题,请参考以下文章

❤️数据结构入门❤️(4 - 7)- 基数排序

桶排序和基数排序有啥区别?

基数排序的算法思想及性能分析

什么是基数排序?

10.6 基数排序

基数排序与基数排序