基数排序的实际应用


20

当您知道键在某个有限范围内时,从根本上讲,基数排序非常快,例如,值在范围内。如果你只值转换为基础这需要时间,做了基础基数排序,然后再转换回原来的一个整体底座算法。[ 0 ... Ñ ķ - 1 ] ķ < LG Ñ Ñ Θ Ñ ñ Θ Ñ ķ n[0nk1]k<lgnnΘ(n)nΘ(nk)

但是,我已经读到,实际上,基数排序通常比进行随机化的quicksort慢得多

对于大型阵列,基数排序的指令数最少,但是由于其相对较差的缓存性能,其总体性能比合并排序和快速排序的内存优化版本差。

基数排序只是一种很好的理论算法,还是有通用的实际用途?

Answers:


15

实际上,基数排序通常是并行计算机上最快,最有用的排序。

在多处理器的每个节点上,您可能会执行快速排序等操作,但是基数排序使多个节点可以以比各种递归排序更少的同步工作。

还有其他情况。如果您需要一种稳定的排序(每当两个键相等时它们保持相同的顺序而不是重新排列的排序),那么我不知道会使用任何版本的quicksort。Mergesort也很稳定(如果正确实施)。您的链接是我第一次听说有人说过可以使mergesort具有比基数排序更好的缓存行为。


Patterson和Hennessy与Lamarca在他们的书《计算机组织和设计》中的上述链接相同。
罗伯特·S·巴恩斯

您对Patterson的提及使我想起了Andrea Arpaci-Dusseau大约15年前在集群分类上所做的重要工作。(帕特森是合著者)。在1997年的论文中,他们实际上认为部分基数排序也比在单个节点上进行快速排序更可取。(我在答案中添加了参考文献)。
逻辑徘徊

那很有意思。在CompOrg的2009年第四版中,他们引用了Lamarca对Radix以前版本的工作不友好(第489页),但是随后在第490页的比较Quicksort和Radix排序的图表下,他们说:“由于这种结果,新版本的已经发明了基数排序,将内存层次结构考虑在内,以重新获得其算法优势。” 我很好奇这些新版本的Radix Sort如何运作。
罗伯特·S·巴恩斯

我的怀疑是Lamarca只是使用了一个愚蠢的基数排序(将其存储在链接列表中)。没有人会这样做。您将使用某种优化的动态数组(例如C ++ vector)来实现存储桶。但是我不知道,因为我还没有看过Lamarca的论文。
逻辑徘徊

@WanderingLogic基数在哪里使用存储桶?您是在这里说水桶排序吗?
酒吧

3

@Robert:您的链接非常令人惊讶(实际上我找不到引用的句子)。我的个人经验是随机输入,基数排序比STL快得多std::sort(),后者使用quicksort的变体。我过去经常std::sort()用不稳定的基数替换来使算法快50%。我不确定quicksort的“内存优化版本”是什么,但是我怀疑它的速度可能是STL版本的两倍。

这篇博客文章评估了基数排序以及其他几种排序算法。简而言之,在此评估中,std::sort()需要花费5.1秒才能对5000万个整数进行排序,而就地/不稳定基数排序则需要2.0秒。稳定的基数排序应该更快。

基数排序也广泛用于稳定地对字符串进行排序。有时会看到基数排序的变体用于构造后缀数组,BWT等。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.