我有2個數組沒有排序。將它們單獨分類然後合併它們會更快嗎?或者只是先串聯數組並排序組合巨大數組會更快?合併然後進行排序或排序然後合併會更快嗎?
回答
很明顯,大O在這個問題上並沒有真正的說什麼。假設你正在使用的算法是快速排序。 It has a average running time of:
所以,現在,如果排序然後合併,我們得到:
F1 = 1.39n *的log(n)* 2 + 2N
合併然後排序:
F2 = n + 1.39 * 2n * log(2n)
區別是
f2 -f1 = -n + 2。78N> 0
在一般情況下,如果一個排序算法具有複雜
C = K * n日誌(n)的
然後由於k應該是通常大於1,並且是不太可能在0.5附近的任何地方,如果您假設合併成本最多爲2n,那麼合併將會更快。
我認爲用這種方法分析算法的運行時間並不是很有意義。大O符號忽略的實際常量的使用表明它更加準確,但您仍然只計算選定的操作(比較次數,複製次數)並忽略其他許多操作(方法調用,緩存效果等)。國際海事組織(IMO),如果你想執行比big-O更接近實際的分析,你還應該考慮所有系統/語言/實現特定的常量,並使用分析器來代替。 – blubb 2013-04-11 08:59:21
@blubb你絕對是對的;我忘了在我的回答中提到,這只是比較輸入隨機時的平均比較次數。上述分析必須擴展,並定義計算模型。我會盡量編輯答案,使其更加真實世界,而不是在稍後的某一段時間只是一個粗俗的廢話。 – 2013-04-11 11:28:43
我認爲這將取決於排序算法和數據的大小。
但一個瘋狂的猜測是合併,然後排序整個批次是可取的。因爲在這種情況下的合併只是追加。
而在另一種情況下,您將需要應用排序合併。
儘管您的答案可能會更簡單,但問題的要求並不會更快。 – Alan 2013-04-10 11:38:14
我認爲在具體代碼運行之前沒有確定的答案。 – 2013-04-10 11:54:15
如果確保第二個數組中的所有條目都大於第一個數組中的所有條目,那麼可以在對每個數組進行排序後連接數組。每種排序算法的複雜性都比線性更差,所以當您可以將排序任務分解爲可以單獨排序的子集時,應該這樣做。
但是當條目在合併數組之後需要重新排序時,事先對每個數組進行排序不可能使其更快。
如果您想準確知道它,請創建一大組測試數據並自行測量性能。
這取決於您使用的技術。
排序第一,然後合併會給你更好的結果在一個現代的多處理器體系結構,你可以在兩個陣列上運行排序算法並行線程O(nlogn)
左右(但有更少的常量),然後合併它們在O(n)
時間。
假設串聯在O(1)
完成,合併需要O(n)
和排序O(n log n)
,您有以下選擇:
- 排序和合並:
O(n log n) + O(n) = O(n log n)
- 連擊和排序:
O(1) + O((2n) log (2n)) = O(n log n)
因此,兩個選項漸近地相等。
當然,如果你使用使用MergeSort,那麼整個討論都是無稽之談。
- 1. XSLT:合併的節點,然後排序
- 2. 二元合併排序&天然合併排序
- 3. Laravel - 合併兩個集合後排序?
- 4. 合併多個數組,然後按數組值排序
- 5. 有沒有辦法合併多個屬性,然後通過LINQ進行排序?
- 6. 如何將合併排序轉換爲並行合併排序
- 7. C++合併排序不會合並?
- 8. 並行合併排序
- 9. MySQL:排序行,然後排列列?
- 10. 多線程快速排序或合併排序
- 11. 如何自定義排序然後在angularjs中進行排序?
- 12. 爲什麼插入排序比合並排序更快?
- 13. 合併排序的方式比插入排序更快謎題
- 14. 瞭解合併排序和快速排序的運行時間
- 15. SVN合併,然後rebase
- 16. 合併排序java
- 17. 合併排序R
- 18. Group然後用MongoDB排序
- 19. 分組然後排序
- 20. MYSQL對組中的項目進行排序然後對它們進行排序
- 21. 使用合併對數組進行排序索引排序
- 22. 使用合併排序對n個字符串進行排序
- 23. MongoDb:分組然後排序並取最後一個文檔
- 24. 並行合併兩個排序列表
- 25. python 2.7如何並行合併排序?
- 26. 合併列表和「合併」排序
- 27. 合併排序中的合併部分
- 28. 合併排序不排序數組
- 29. 罐推薦和排序(排序合併)
- 30. 按ID排序然後按名稱比按名稱排序更快?
似乎第二種方法更快,因爲串聯速度更快,然後合併。 – Egor 2013-04-10 11:30:13
我寧願分而治之。快速排序和合並排序從中受益。 – 2013-04-10 11:31:55
@Egor排序是一種比串聯和合並更少線性的操作(除非我們正在談論基數排序)。 – 2013-04-10 11:33:04