2018-10-16 漫畫(huà)算法:什么是外部排序?

轉(zhuǎn)自: https://mp.weixin.qq.com/s/KYbYTNl9PfXK--bG96YZJg

來(lái)源:帥地(本文來(lái)自作者的投稿锨苏,其簡(jiǎn)介見(jiàn)末尾)

背景

西天取經(jīng)的路上怜俐,一樣上演著編程的樂(lè)趣.....

image
image
image
image
image
image

排序的時(shí)候我們可以選擇快速排序或歸并排序等算法。為了方便,我們把排序好的2G有序數(shù)據(jù)稱(chēng)之為有序子串吧畔况。接著我們可以把兩個(gè)小的有序子串合并成一個(gè)大的有序子串鲸鹦。

image

注意:讀取的時(shí)候是每次讀取一個(gè)int數(shù),通過(guò)比較之后在輸出跷跪。

按照這個(gè)方法來(lái)回合并馋嗜,總共經(jīng)過(guò)三次合并之后就可以得到8G的有序子串。

image
image
image

接下來(lái)把12個(gè)數(shù)據(jù)分成4份吵瞻,然后排序成有序子串

image

然后把子串進(jìn)行兩兩合并

image

輸出哪個(gè)元素葛菇,就在那個(gè)元素所在的有序子串再次讀入一個(gè)元素

image

繼續(xù)

image

重復(fù)直到合并成一個(gè)包含6個(gè)int的有序子串

image

再把兩個(gè)包含6個(gè)int的有序子串合并成一個(gè)包含12個(gè)int數(shù)據(jù)的最終有序子串

image
image

優(yōu)化策略

image

解釋下:例如對(duì)于數(shù)據(jù)2,我們把無(wú)序的12個(gè)數(shù)據(jù)分成有序的4個(gè)子串需要讀寫(xiě)各一次橡羞,把2份3個(gè)有序子串合并成6個(gè)有序子串讀寫(xiě)各一次眯停;把2份6個(gè)有序子串合并從12個(gè)有序子串讀寫(xiě)各一次,一共需要讀寫(xiě)各3次卿泽。

image
image
image

多路歸并

為了方便講解莺债,我們假設(shè)內(nèi)存一共可以裝4個(gè)int型數(shù)據(jù)

image
image
image
image
image
image
image.png

置換選擇

image
image
image
image
image
image
image

例如我們可以從12個(gè)數(shù)據(jù)讀取3個(gè)存到內(nèi)存中签夭,然后從內(nèi)存中選出最小的那個(gè)數(shù)放進(jìn)子串p1里齐邦;

之后再?gòu)脑趶氖S嗟?個(gè)數(shù)據(jù)讀取一個(gè)放到內(nèi)存中,然后再?gòu)膬?nèi)存中選出一個(gè)數(shù)放進(jìn)子串p1里第租,這個(gè)數(shù)必須滿(mǎn)足比p1中的其他數(shù)大措拇,且在內(nèi)存中盡量小

這樣一直重復(fù)慎宾,直到內(nèi)存中的數(shù)都比p1中的數(shù)小丐吓,這時(shí)p1子串存放結(jié)束浅悉,繼續(xù)來(lái)p2子串的存放。例如(這時(shí)假設(shè)內(nèi)存只能存放3個(gè)int型數(shù)據(jù)):

12個(gè)無(wú)序的int數(shù)據(jù)

image

讀入3個(gè)到內(nèi)存中汰蜘,且選出一個(gè)最小的到子串p1

image

從內(nèi)存中再次讀取一個(gè)元素86

image

從內(nèi)存中再次讀取一個(gè)元素3

image

從內(nèi)存中再次讀取一個(gè)元素24

image

從內(nèi)存中再次讀取一個(gè)元素8

image

這個(gè)時(shí)候仇冯,已經(jīng)沒(méi)有符合要求的數(shù)了,且內(nèi)存已滿(mǎn)族操,進(jìn)而用p2子串來(lái)存放苛坚,以此類(lèi)推。

通過(guò)這種方法色难,p1子串存放了4個(gè)數(shù)據(jù)泼舱,而原來(lái)的那種方法p1子串只能存放3個(gè)數(shù)據(jù)。

image
image

從12個(gè)數(shù)據(jù)中讀取3個(gè)數(shù)據(jù)枷莉,構(gòu)建成一個(gè)最小堆娇昙,然后從堆頂選擇一個(gè)數(shù)寫(xiě)入到p1中。

之后再?gòu)氖S嗟?個(gè)數(shù)中讀取一個(gè)數(shù)笤妙,如果這個(gè)數(shù)比剛才那個(gè)寫(xiě)入到p1中的數(shù)大冒掌,則把這個(gè)數(shù)插入到最小堆中,重新調(diào)整最小堆結(jié)構(gòu)蹲盘,然后在堆頂選一個(gè)數(shù)寫(xiě)入到p1中股毫。

否則,把這個(gè)數(shù)暫放在一邊召衔,暫時(shí)不處理铃诬。之后一樣需要調(diào)整堆結(jié)構(gòu),從堆頂選擇一個(gè)數(shù)寫(xiě)入到p1中苍凛。

這里說(shuō)明一下趣席,那個(gè)被放在一邊的數(shù)是不能再放入p1中的了,因?yàn)樗欢ū萷1中的數(shù)都要小醇蝴,所以它會(huì)放在下一個(gè)子串中

看這些文字會(huì)讓人頭大宣肚,我畫(huà)圖解釋下吧。

從12數(shù)據(jù)讀取3個(gè)數(shù)據(jù)

image

構(gòu)建最小堆悠栓,且選出目標(biāo)數(shù)

image

讀入下一個(gè)數(shù)86

image

讀入下一個(gè)數(shù)3钉寝,比70小,暫放一邊闸迷,不加入堆結(jié)構(gòu)中

image

讀入下一個(gè)數(shù)據(jù)24嵌纲,比81小,不加入堆結(jié)構(gòu)

image

讀入下一個(gè)數(shù)據(jù)8腥沽,比86小逮走,不加入堆結(jié)構(gòu)。此時(shí)p1已經(jīng)完成了今阳,把那些剛才暫放一邊的數(shù)重新構(gòu)成一個(gè)堆师溅,繼續(xù)p2的存放茅信。

image

以此類(lèi)推...

最后生成的p2如下:

image
image
image
image
image

這種方法適合要排序的數(shù)據(jù)太多,以至于內(nèi)存一次性裝載不下墓臭。只能通過(guò)把數(shù)據(jù)分幾次的方式來(lái)排序蘸鲸,我們也把這種方法稱(chēng)之為外部排序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窿锉,隨后出現(xiàn)的幾起案子酌摇,更是在濱河造成了極大的恐慌,老刑警劉巖嗡载,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窑多,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洼滚,警方通過(guò)查閱死者的電腦和手機(jī)埂息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遥巴,“玉大人千康,你說(shuō)我怎么就攤上這事〔” “怎么了拾弃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)迹炼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)颠毙,這世上最難降的妖魔是什么斯入? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蛀蜜,結(jié)果婚禮上刻两,老公的妹妹穿的比我還像新娘。我一直安慰自己滴某,他們只是感情好磅摹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著霎奢,像睡著了一般户誓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幕侠,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天帝美,我揣著相機(jī)與錄音,去河邊找鬼晤硕。 笑死悼潭,一個(gè)胖子當(dāng)著我的面吹牛庇忌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舰褪,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼皆疹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了占拍?” 一聲冷哼從身側(cè)響起略就,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刷喜,沒(méi)想到半個(gè)月后残制,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掖疮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年初茶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浊闪。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恼布,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搁宾,到底是詐尸還是另有隱情折汞,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布盖腿,位于F島的核電站爽待,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翩腐。R本人自食惡果不足惜鸟款,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茂卦。 院中可真熱鬧何什,春花似錦、人聲如沸等龙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛛砰。三九已至罐栈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泥畅,已是汗流浹背悠瞬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浅妆。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓望迎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凌外。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辩尊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 暖與希望閱讀 143評(píng)論 0 0
  • 01 說(shuō)實(shí)話,我真的不容易相信別人康辑。任何交給別人的事情摄欲,我基本上會(huì)想好第二種方案甚至第三種方案,除非這件事情沒(méi)那么...
    楊小米閱讀 2,491評(píng)論 15 43
  • 大家早上好,我是65號(hào)季開(kāi)宇按咒,來(lái)自上海迟隅。我的3個(gè)標(biāo)簽是: 1、我是汽車(chē)發(fā)動(dòng)機(jī)研發(fā)的項(xiàng)目經(jīng)理,2励七、時(shí)間管理的踐行者智袭,...
    季開(kāi)宇閱讀 179評(píng)論 1 4
  • 關(guān)于技能囤積欲: 最近經(jīng)常聽(tīng)到一個(gè)詞,技多不壓身掠抬。技多真的不壓身嗎吼野?我在網(wǎng)上查了一下這個(gè)詞的出處同時(shí)也參閱了一些文...
    樂(lè)業(yè)工坊閱讀 8,232評(píng)論 0 2