2011-02-24 21 views

回答

44

想象一下,你有數字1 - 9

9 7 2 6 3 4 8 5 1 

而且,我們假設只有3適合在內存中的時間。

所以,你會打破他們分成3塊,每一個分類,儲存在一個單獨的文件中的每個結果:

279 
346 
158 

現在你打開每三個文件的溪流和讀取的第一個值從每個:

2 3 1 

輸出的最低值1,並從該流獲取下一個值,你現在有:

2 3 5 

輸出下一個最小值2,並繼續向前,直到輸出完整的排序列表。

+0

謝謝你。但是,請網站的例子,它說「使用6個I/O單元」。如果按照你的方式,很多IOs – 2011-02-24 04:17:31

+0

好,它的原理是一樣的,但是你不能一次完成所有的事情,你必須進行分區,分類和合並,然後對分區的其餘部分進行排序,並將其與最初合併排序的列表合併。因此您不會使用超過6個I/O單元。在頁面上的算法描述了根據您的I/O單元約束劃分數據的最佳方式。 – 2011-02-24 04:31:38

+0

這個例子適用於你,但你有這個列表呢? 9 7 8 6 3 4 2 5 1,那麼你最終會得到以下幾組:789,346,125。如果你按照每組排序第一,然後秒和三分之一,你最終會得到類似的東西這:127248569,這是不正確的。所以簡而言之,我仍然不知道它是如何工作的... – Gaara 2013-11-04 05:58:59

1

如果您將兩次運行AB分成更大的運行C,您可以逐行生成逐漸增大的運行,但一次最多隻能讀取兩行。由於該過程是迭代的,並且由於您正在處理數據流而不是完全切割數據,因此您無需擔心內存使用情況。另一方面,磁盤訪問可能會使整個過程變得緩慢 - 但它確實無法擺脫首先完成的工作。

+0

兄弟,這會有點尷尬,今天我發佈了一個面試官問的問題,希望得到一些幫助,但沒有人回答它被查看30次以上。我真的希望你能花一點時間幫助我,這裏是鏈接:http://stackoverflow.com/q/7425400/888051非常感謝。 – Alcott 2011-09-15 05:03:27