簡體   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