外排序-多路歸并

內(nèi)排序的歸并排序是采用二路歸并近她。

將已有序的子序列合并鼻忠,得到完全有序的序列驰吓;即先使每個(gè)子序列有序混蔼,再使子序列段間有序

外排序我們可以將這個(gè)“二”擴(kuò)大到M履腋。

將一個(gè)大文件分成M個(gè)小文件,每個(gè)小文件是有序的惭嚣,然后對(duì)應(yīng)在內(nèi)存中我們開M個(gè)優(yōu)先隊(duì)列遵湖,每個(gè)隊(duì)列從對(duì)應(yīng)編號(hào)的文件中讀取TopN條記錄,然后我們從M路隊(duì)列中各取一個(gè)數(shù)字進(jìn)入中轉(zhuǎn)站隊(duì)列晚吞,并將該數(shù)字打上隊(duì)列編號(hào)標(biāo)記奄侠,當(dāng)從中轉(zhuǎn)站出來的最小數(shù)字就是我們最后要排序的數(shù)字之一,因?yàn)樵摂?shù)字打上了隊(duì)列編號(hào)载矿,所以方便我們通知對(duì)應(yīng)的編號(hào)隊(duì)列繼續(xù)出數(shù)字進(jìn)入中轉(zhuǎn)站隊(duì)列,可以看出中轉(zhuǎn)站一直保存了M個(gè)記錄烹卒,當(dāng)中轉(zhuǎn)站中的所有數(shù)字都出隊(duì)完畢闷盔,則外排序結(jié)束。這考驗(yàn)的是我們的架構(gòu)能力旅急。



問題描述:

輸入:給定一個(gè)文件逢勾,里面最多含有n個(gè)不重復(fù)的正整數(shù)(也就是說可能含有少于n個(gè)不重復(fù)正整數(shù)),且其中每個(gè)數(shù)都小于等于n藐吮,n=10^7溺拱。

輸出:得到按從小到大升序排列的包含所有輸入的整數(shù)的列表。

條件:最多有大約1MB的內(nèi)存空間可用谣辞,但磁盤空間足夠迫摔。且要求運(yùn)行時(shí)間在5分鐘以下,10秒為最佳結(jié)果泥从。

采取方法:1句占、歸并排序,內(nèi)存不夠躯嫉。2纱烘、位圖法杨拐。3、多路歸并

1擂啥、歸并排序哄陶,內(nèi)部排序。

2哺壶、位圖法

例如:用一個(gè)20位長的字符串來表示一個(gè)所有元素都小于20的簡(jiǎn)單的非負(fù)整數(shù)集合屋吨,邊框用如下字符串來表示集合{1,2,3,5,8,13}:

0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0,上述集合中各數(shù)對(duì)應(yīng)的位置則置1变骡,沒有對(duì)應(yīng)的數(shù)的位置則置0离赫。

針對(duì)我們的10^7個(gè)數(shù)據(jù)量的磁盤文件排序問題,我們可以這么考慮塌碌,由于每個(gè)7位十進(jìn)制整數(shù)表示一個(gè)小于1000萬的整數(shù)渊胸。我們可以使用一個(gè)具有1000萬個(gè)位的字符串來表示這個(gè)文件,其中台妆,當(dāng)且僅當(dāng)整數(shù)i在文件中存在時(shí)翎猛,第i位為1。采取這個(gè)位圖的方案是因?yàn)槲覀兠鎸?duì)的這個(gè)問題的特殊性:1接剩、輸入數(shù)據(jù)限制在相對(duì)較小的范圍內(nèi)切厘,2、數(shù)據(jù)沒有重復(fù)懊缺,3疫稿、其中的每條記錄都是單一的整數(shù),沒有任何其它與之關(guān)聯(lián)的數(shù)據(jù)鹃两。

三步進(jìn)行解決:

第一步遗座,將所有的位都置為0,從而將集合初始化為空俊扳。

第二步途蒋,通過讀入文件中的每個(gè)整數(shù)來建立集合,將每個(gè)對(duì)應(yīng)的位都置為1馋记。

第三步号坡,檢驗(yàn)每一位,如果該位為1梯醒,就輸出對(duì)應(yīng)的整數(shù)宽堆。

偽代碼

注意:

用此位圖方法,嚴(yán)格說來還是不太行茸习,空間消耗10^7/8還是大于1M(1M=1024*1024空間日麸,小于10^7/8)。

既然如果用位圖方案的話,我們需要約1.25MB(若每條記錄是8位的正整數(shù)的話代箭,則10000000/(1024*1024*8) ~= 1.2M)的空間墩划,而現(xiàn)在只有1MB的可用存儲(chǔ)空間,那么究竟該作何處理呢?

3嗡综、多路歸并

假設(shè)文件中整數(shù)個(gè)數(shù)為N(N是億級(jí)的)乙帮,整數(shù)之間用空格分開。首先分多次從該文件中讀取M(十萬級(jí))個(gè)整數(shù)极景,每次將M個(gè)整數(shù)在內(nèi)存中使用快速排序之后存入臨時(shí)文件察净,然后使用多路歸并將各個(gè)臨時(shí)文件中的數(shù)據(jù)再次整體排好序后存入輸出文件。

排序過程兩部分構(gòu)成:

1)內(nèi)存排序

由于要求的可用內(nèi)存為1MB盼樟,那么每次可以在內(nèi)存中對(duì)250K的數(shù)據(jù)進(jìn)行排序氢卡,然后將有序的數(shù)寫入硬盤。

那么10M的數(shù)據(jù)需要循環(huán)40次晨缴,最終產(chǎn)生40個(gè)有序的文件译秦。

2)歸并排序

將每個(gè)文件最開始的數(shù)讀入(由于有序,所以為該文件最小數(shù))击碗,存放在一個(gè)大小為40的first_data數(shù)組中筑悴;

選擇first_data數(shù)組中最小的數(shù)min_data,及其對(duì)應(yīng)的文件索引index稍途;

將first_data數(shù)組中最小的數(shù)寫入文件result阁吝,然后更新數(shù)組first_data(根據(jù)index讀取該文件下一個(gè)數(shù)代替min_data);

判斷是否所有數(shù)據(jù)都讀取完畢械拍,否則返回2突勇。

所以,本程序按順序分兩步坷虑,第一步甲馋、Memory Sort,第二步猖吴、Merge Sort。程序的流程圖挥转,如下圖所示(感謝F的繪制)海蔽。





小結(jié):

bit-map

適用范圍:可進(jìn)行數(shù)據(jù)的快速查找,判重绑谣,刪除党窜,一般來說數(shù)據(jù)范圍是int的10倍以下

基本原理及要點(diǎn):使用bit數(shù)組來表示某些元素是否存在,比如8位電話號(hào)碼

擴(kuò)展:bloom filter可以看做是對(duì)bit-map的擴(kuò)展

問題實(shí)例:

1)已知某個(gè)文件內(nèi)包含一些電話號(hào)碼借宵,每個(gè)號(hào)碼為8位數(shù)字幌衣,統(tǒng)計(jì)不同號(hào)碼的個(gè)數(shù)。

8位最多99 999 999,大概需要99m個(gè)bit豁护,大概10幾m字節(jié)的內(nèi)存即可哼凯。

2)2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)楚里。

將bit-map擴(kuò)展一下断部,用2bit表示一個(gè)數(shù)即可,0表示未出現(xiàn)班缎,1表示出現(xiàn)一次蝴光,2表示出現(xiàn)2次及以上〈镏罚或者我們不用2bit來進(jìn)行表示蔑祟,我們用兩個(gè)bit-m

[外排序適用范圍]

大數(shù)據(jù)的排序,去重基本原理及要點(diǎn):外排序的歸并方法沉唠,置換選擇敗者樹原理疆虚,最優(yōu)歸并樹擴(kuò)展。

問題實(shí)例:

1).有一個(gè)1G大小的一個(gè)文件右冻,里面每一行是一個(gè)詞装蓬,詞的大小不超過16個(gè)字節(jié),內(nèi)存限制大小是1M纱扭。返回頻數(shù)最高的100個(gè)詞牍帚。這個(gè)數(shù)據(jù)具有很明顯的特點(diǎn),詞的大小為16個(gè)字節(jié)乳蛾,但是內(nèi)存只有1m做hash有些不夠暗赶,所以可以用來排序。內(nèi)存可以當(dāng)輸入緩沖區(qū)使用肃叶。


具體實(shí)例詳解:

鏈接 :http://www.reibang.com/p/1683cf5cc0c9


勝者樹蹂随,敗者樹

勝者樹和敗者樹都是完全二叉樹,是樹形選擇排序的一種變型因惭。每個(gè)葉子結(jié)點(diǎn)相當(dāng)于一個(gè)選手岳锁,每個(gè)中間結(jié)點(diǎn)相當(dāng)于一場(chǎng)比賽,每一層相當(dāng)于一輪比賽蹦魔。

同的是激率,勝者樹的中間結(jié)點(diǎn)記錄的是勝者的標(biāo)號(hào);而敗者樹的中間結(jié)點(diǎn)記錄的敗者的標(biāo)號(hào)勿决。

勝者樹與敗者樹可以在log(n)的時(shí)間內(nèi)找到最值乒躺。任何一個(gè)葉子結(jié)點(diǎn)的值改變后,利用中間結(jié)點(diǎn)的信息低缩,還是能夠快速地找到最值嘉冒。在k路歸并排序中經(jīng)常用到。


區(qū)別:

在用勝者樹的時(shí)候,每個(gè)新元素上升時(shí)讳推,首先需要獲得父節(jié)點(diǎn)顶籽,然后再獲得兄弟節(jié)點(diǎn),然后再比較娜遵。

在使用敗者樹的時(shí)候蜕衡,每個(gè)新元素上升時(shí),只需要獲得父節(jié)點(diǎn)并比較即可设拟。

所以總的來說慨仿,減少了訪存的時(shí)間。

勝者樹和敗者樹在每輸出和補(bǔ)充一個(gè)值之后都要自底向上調(diào)整纳胧,每上升一層都需要一次比較镰吆,敗者樹是和父節(jié)點(diǎn)的一次比較,勝者樹是和兄弟的一次比較跑慕,在比較的內(nèi)存訪問次數(shù)上二者沒有太大的差別(或者勝者樹可能好一點(diǎn))万皿。不同的是勝者樹每次必然需要更新勝者(因?yàn)檫@條路徑就是以原來的最終勝者為外部節(jié)點(diǎn)的路徑,而原來的最終勝者已經(jīng)被輸出了)核行,但敗者樹每次不一定需要更新牢硅,這就代表它在每次上升時(shí)可能會(huì)少一次向內(nèi)存的寫入,因此更優(yōu)

由于新加入的節(jié)點(diǎn)一定是替換了上一輪的勝者芝雪,那么對(duì)于勝者堆减余,從新節(jié)點(diǎn)到根之間路徑節(jié)點(diǎn)存的都是上一輪的勝者,這些數(shù)據(jù)事實(shí)上對(duì)于本輪比較來說是無用的惩系,但每次還要與兄弟節(jié)點(diǎn)比較去更新它位岔。

而敗者堆中,對(duì)于新更新的節(jié)點(diǎn)堡牡,它的父節(jié)點(diǎn)都是兄弟子堆的勝者抒抬,是最有價(jià)值、值得比較的數(shù)據(jù)晤柄,每次更新也都可以直接用于下輪比較擦剑。











http://blog.csdn.net/v_JULY_v/article/details/6451990 ?(贊)

http://blog.csdn.net/v_JULY_v/article/details/6279498 ?(超贊)

http://www.cnblogs.com/charlesblc/p/6138908.html

http://blog.csdn.net/msdnwolaile/article/details/52084983

http://blog.csdn.net/u013322907/article/details/38125641

http://blog.csdn.net/msdnwolaile/article/details/52084983

http://blog.csdn.net/v_JULY_v

http://blog.csdn.net/whz_zb/article/details/7425152

https://www.zhihu.com/question/35144290


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芥颈,隨后出現(xiàn)的幾起案子惠勒,更是在濱河造成了極大的恐慌,老刑警劉巖浇借,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉撮,死亡現(xiàn)場(chǎng)離奇詭異怕品,居然都是意外死亡妇垢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闯估,“玉大人灼舍,你說我怎么就攤上這事≌切剑” “怎么了骑素?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刚夺。 經(jīng)常有香客問我献丑,道長,這世上最難降的妖魔是什么侠姑? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任创橄,我火速辦了婚禮,結(jié)果婚禮上莽红,老公的妹妹穿的比我還像新娘妥畏。我一直安慰自己,他們只是感情好安吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布醉蚁。 她就那樣靜靜地躺著,像睡著了一般鬼店。 火紅的嫁衣襯著肌膚如雪网棍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天薪韩,我揣著相機(jī)與錄音确沸,去河邊找鬼。 笑死俘陷,一個(gè)胖子當(dāng)著我的面吹牛罗捎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拉盾,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桨菜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了捉偏?” 一聲冷哼從身側(cè)響起倒得,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夭禽,沒想到半個(gè)月后霞掺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讹躯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年菩彬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缠劝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骗灶,死狀恐怖惨恭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耙旦,我是刑警寧澤脱羡,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站免都,受9級(jí)特大地震影響锉罐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绕娘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一氓鄙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧业舍,春花似錦抖拦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至下面,卻和暖如春复颈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沥割。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工耗啦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人机杜。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓帜讲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椒拗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子似将,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 因?yàn)橹熬蛷?fù)習(xí)完數(shù)據(jù)結(jié)構(gòu)了,所以為了保持記憶蚀苛,整理了一份復(fù)習(xí)綱要在验,復(fù)習(xí)的時(shí)候可以看著綱要想具體內(nèi)容。 樹 樹的基本...
    牛富貴兒閱讀 6,877評(píng)論 3 10
  • 教你如何迅速秒殺掉:99%的海量數(shù)據(jù)處理面試題 本文經(jīng)過大量細(xì)致的優(yōu)化后堵未,收錄于我的新書《編程之法》第六章中腋舌,新書...
    Helen_Cat閱讀 7,421評(píng)論 1 39
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,253評(píng)論 0 2
  • 摘要:本文將向您講述諸多數(shù)據(jù)處理面試題以及方法的總結(jié)。 第一部分渗蟹、十道海量數(shù)據(jù)處理面試題 1块饺、海量日志數(shù)據(jù)耻陕,提取出...
    拾壹北閱讀 1,695評(píng)論 0 28
  • 排序的基本概念 在計(jì)算機(jī)程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個(gè)關(guān)鍵字進(jìn)行排序刨沦,排序完成的序列可用于快...
    Jack921閱讀 1,430評(píng)論 1 4