繁体   English   中英

与输入范围有关的排序算法的效率

[英]Efficiency of sorting Algorithms as it relates to input range

我想知道当使用“非自然”输入而不是更标准的输入时,典型的快速排序算法(即quicksort)是否保持了优势。

IE,如果我们有一个由0到N ^ 4范围内的N个整数组成的数组,那么鉴于整数的范围非常广,Quicksort还是最快的吗?

Quicksort不受数字范围的影响,而是受顺序的影响(即,数字是否已经排序或反向排序,以及您选择第一个元素作为枢轴)。 如果您使用随机数据透视方法,则即使该问题也已解决。

总而言之,每种算法都具有最坏情况的复杂性,通常会在有关该算法的文献中进行讨论。

N ^ 4并不是很大,一个20亿个整数的数组仅需要128位就可以满足该要求。 由于这将需要至少8GB的内存来存储,因此通常只限于可以进行就地排序的O(N * log(N))排序算法,例如快速排序,而不是需要两次的O(N)算法尽可能多的内存。

允许O(N)的算法(在最佳情况下,此处不太可能)通常受内存限制。 对于给定的示例,基数排序将变为具有大数据元素的O(N log(N)),因为数据实际上是可变长度的-考虑一个32,768字节的整数-在64位计算机上,您的第一个存储区可能是基于前8个字节,第二个存储桶基于第二个8个字节,但是由于存储桶的范围可能很大,而且存储桶内的分布不随机,因此大多数存储桶会很小,剩下一些非常大的存储桶需要使用O(N log(N))算法。 同样,此算法要求为每个基数分配“存储桶”以容纳元素,这将使总内存需求增加一倍。

对于需要非常昂贵的比较的小列表元素,基数排序可能是一个不错的选择,但是O(N)和O(N log(N))之间的区别对于小列表而言可能不那么重要。

同样,通过非常昂贵的比较(例如非常大的字符串),Schwartzian变换的某些变体可能会有所帮助,并且由于每种算法都在内存和cpu之间取得平衡,因此最佳排序算法将基于在使用更多内存还是在更多内存之间进行选择。使用更多的CPU。

极端情况可能会倾向于使用不同的排序算法,例如几乎排序的列表,但是通常检测这些情况的成本会很高,并且假设极端情况是正确的,如果有可能,那么可能会导致大问题。没错

综上所述,除非绝对必要,否则所有实际实现都应尝试将std :: sort与std :: hash <>的相应实现一起使用,因为std :: sort可以根据输入数据从多个算法中进行选择。

所有众所周知的搜索算法都基于元素比较,即它们检查一个元素是否小于,等于或大于另一个元素。 因此,它们绝对不受范围限制。

但是,在某些特殊情况下,某些算法的相对性能可能与平均情况有很大差异。 此类情况的示例是:

  • 除单个元素或一小部分子集外,其他元素均已排序。
  • 元素是相反的顺序。
  • 除一个外,所有元素均相等。

因此,对于每种排序算法,都可以确定平均性能和最坏情况的性能。

其他答案基本上是正确的,因为根据输入范围,排序算法通常不会好坏。 但是,至少有一个原因可以使算法基于输入范围而变得更好或更坏,那就是它们如何处理重复值。

例如,当存在更多重复值时,Quicksort的平均水平会变差(请参阅此问题以解释原因),而当输入范围更大时,重复的机会就会减少(假设它们分布在整个范围内)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM