http://web.eecs.utk.edu/~huangj/CS302S04/notes/external-sorting2.html
合併由此而來一起運行到 先後更大的運行,直到 文件進行排序。
正如我所引用的,我們怎樣才能將結果運行在一起?我們沒有那麼多的記憶。
http://web.eecs.utk.edu/~huangj/CS302S04/notes/external-sorting2.html
合併由此而來一起運行到 先後更大的運行,直到 文件進行排序。
正如我所引用的,我們怎樣才能將結果運行在一起?我們沒有那麼多的記憶。
想象一下,你有數字1 - 9
9 7 2 6 3 4 8 5 1
而且,我們假設只有3適合在內存中的時間。
所以,你會打破他們分成3塊,每一個分類,儲存在一個單獨的文件中的每個結果:
279
346
158
現在你打開每三個文件的溪流和讀取的第一個值從每個:
2 3 1
輸出的最低值1
,並從該流獲取下一個值,你現在有:
2 3 5
輸出下一個最小值2
,並繼續向前,直到輸出完整的排序列表。
如果您將兩次運行A
和B
分成更大的運行C
,您可以逐行生成逐漸增大的運行,但一次最多隻能讀取兩行。由於該過程是迭代的,並且由於您正在處理數據流而不是完全切割數據,因此您無需擔心內存使用情況。另一方面,磁盤訪問可能會使整個過程變得緩慢 - 但它確實無法擺脫首先完成的工作。
兄弟,這會有點尷尬,今天我發佈了一個面試官問的問題,希望得到一些幫助,但沒有人回答它被查看30次以上。我真的希望你能花一點時間幫助我,這裏是鏈接:http://stackoverflow.com/q/7425400/888051非常感謝。 – Alcott 2011-09-15 05:03:27
謝謝你。但是,請網站的例子,它說「使用6個I/O單元」。如果按照你的方式,很多IOs – 2011-02-24 04:17:31
好,它的原理是一樣的,但是你不能一次完成所有的事情,你必須進行分區,分類和合並,然後對分區的其餘部分進行排序,並將其與最初合併排序的列表合併。因此您不會使用超過6個I/O單元。在頁面上的算法描述了根據您的I/O單元約束劃分數據的最佳方式。 – 2011-02-24 04:31:38
這個例子適用於你,但你有這個列表呢? 9 7 8 6 3 4 2 5 1,那麼你最終會得到以下幾組:789,346,125。如果你按照每組排序第一,然後秒和三分之一,你最終會得到類似的東西這:127248569,這是不正確的。所以簡而言之,我仍然不知道它是如何工作的... – Gaara 2013-11-04 05:58:59