趣味算法圖解

IDEA 是由 SándorP. Fekete年鸳、Sebastian Morr 和 Sebastian Stiller 共同推出的圖解算法系列绍填。 它們最初是為 Sándor 在德國(guó)不倫瑞克工業(yè)大學(xué)開設(shè)的算法和數(shù)據(jù)結(jié)構(gòu)講座而設(shè)計(jì)的欣舵,作者希望它們能夠有更廣的用途费奸,因此在網(wǎng)上發(fā)布了這個(gè)項(xiàng)目召耘,希望能夠幫助到教師般渡、學(xué)生和有好奇心的人們国章。算法將會(huì)不斷更新具钥,可以訪問頁(yè)面了解更多信息:

https://idea-instructions.com/

這些圖片使用 Inkscape 繪制,可以使用任意一款向量圖編輯軟件來(lái)編輯它們液兽。每個(gè)算法下面都有相應(yīng)的圖片下載地址骂删。

快速排序

快速排序是一種“分而治之”的排序算法,通過隨機(jī)選擇“分區(qū)點(diǎn)”來(lái)避免出現(xiàn)最壞的情況四啰。


file
  1. 隨機(jī)選擇“分區(qū)點(diǎn)”宁玫。
  2. 按照“分區(qū)點(diǎn)”的高度劃條線。
  3. 高出“分局點(diǎn)”的元素需要向右移動(dòng)柑晒。
  4. 低于“分區(qū)點(diǎn)”的元素需要向左移動(dòng)欧瘪。
  5. 移動(dòng)元素。
  6. 重復(fù)上述的步驟分別對(duì)位于“分區(qū)點(diǎn)”兩邊的元素進(jìn)行排序匙赞。

下載地址:https://idea-instructions.com/quick-sort/

Bogo 排序

Bogo 排序也被稱為“愚蠢的排序”佛掖,是一種非常簡(jiǎn)單但低效的排序算法妖碉,就是不斷打亂元素的順序,直到達(dá)到有序?yàn)橹埂?/p>

file
  1. 查看元素是否有序芥被。
  2. 元素?zé)o序欧宜,那么就打亂順序。
  3. 再次檢查元素是否有序拴魄。
  4. 如果有序冗茸,排序成功,否則繼續(xù)重復(fù)上述步驟匹中。

下載地址:https://idea-instructions.com/bogo-sort/

二分查找

二分查找是一種快速?gòu)囊粋€(gè)有序數(shù)組中找到某個(gè)元素位置的查找算法夏漱。這有點(diǎn)類似于猜數(shù)字游戲,通過不斷問“目標(biāo)數(shù)字是大于還是小于某個(gè)數(shù)”這樣的問題顶捷,最終猜出目標(biāo)數(shù)字麻蹋。


file
  1. 限定元素區(qū)間。
  2. 待查找元素在區(qū)間的某個(gè)位置嗎焊切?
  3. 不在扮授。
  4. 那么看看待查找元素是不是在當(dāng)前位置的左邊或者右邊。

下載地址:https://idea-instructions.com/binary-search/

歸并排序

歸并排序也是一種“分而治之”的遞歸排序算法专肪。


file
file

把元素分成兩部分刹勃,對(duì)每一個(gè)部分采用遞歸的歸并排序。

  1. 比較已經(jīng)排好序的元素嚎尤。
  2. 合并已經(jīng)排好序的元素荔仁。
  3. 排序完畢。

下載地址:https://idea-instructions.com/merge-sort/

平衡二叉樹

平衡二叉樹是自平衡的二叉樹變種芽死,可以保證快速的查找乏梁、插入和刪除操作。


file

以圖中的平衡二叉樹為例:

  • 左子節(jié)點(diǎn)比父節(jié)點(diǎn)小关贵,而父節(jié)點(diǎn)比右子節(jié)點(diǎn)小遇骑。如果根節(jié)點(diǎn)左右子樹的高度差超過 1,就變得不平衡揖曾。
  • 想知道樹中是否包含了元素 11落萎?11 比 10 大,那么就查找 10 的右子節(jié)點(diǎn) 12炭剪。11 比 12 小练链,所以就查找 12 的左子節(jié)點(diǎn),12 的左子節(jié)點(diǎn)剛好是要查找的 11奴拦。同樣的媒鼓,樹中是否包含了元素 8?8 比 10 小,那么就查找 10 的左子節(jié)點(diǎn) 6绿鸣。8 比 6 大瓷产,那么就查找 6 的右子節(jié)點(diǎn)。6 的右子節(jié)點(diǎn)不存在枚驻,說(shuō)明樹中不存在元素 8濒旦。
  • 如何找到樹中最小的元素?從根節(jié)點(diǎn)開始再登,一直順著左子節(jié)點(diǎn)尔邓,找到最后一個(gè)葉子節(jié)點(diǎn)就是樹中最小的元素。
  • 如何找到 10 的下一個(gè)元素锉矢?如果根節(jié)點(diǎn)剛好是 10梯嗽,那么就從 10 的右子樹中找到最小的那個(gè)元素。如果根節(jié)點(diǎn)不是 10沽损,那么先找到 10灯节,如果 10 沒有右子節(jié)點(diǎn),那么就一直往父節(jié)點(diǎn)找绵估,直到找到比 10 大的元素為止炎疆。
  • 在樹種加入 17 或刪除 10,破壞了樹的平衡国裳,這個(gè)時(shí)候需要通過旋轉(zhuǎn)恢復(fù)樹的平衡形入。

下載地址:https://idea-instructions.com/avl-tree/

圖遍歷

圖遍歷算法會(huì)遍歷圖中所有可達(dá)的頂點(diǎn),可以通過輔助數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)各種遍歷缝左,比如使用無(wú)序集合實(shí)現(xiàn)隨機(jī)遍歷亿遂,使用堆棧實(shí)現(xiàn)深度優(yōu)先遍歷,使用隊(duì)列實(shí)現(xiàn)廣度優(yōu)先遍歷渺杉。


file
  • 隨機(jī)查找:選定一個(gè)頂點(diǎn)蛇数,把它放入一個(gè)無(wú)序集合中。從集合中取出一個(gè)頂點(diǎn)是越,訪問該頂點(diǎn)耳舅,把該頂點(diǎn)的相鄰頂點(diǎn)放入集合中,并把該頂點(diǎn)移出集合英妓。重復(fù)這一過程挽放,直到集合中的元素全部被遍歷完畢绍赛。
  • 深度優(yōu)先遍歷:選定一個(gè)頂點(diǎn)壓入棧中蔓纠,把該頂點(diǎn)其中的一個(gè)相鄰頂點(diǎn)也壓入棧中。訪問棧頂?shù)捻旤c(diǎn)吗蚌,如果該頂點(diǎn)沒有其他相鄰的頂點(diǎn)腿倚,就出棧。如果有其他相鄰頂點(diǎn)蚯妇,就把其中的一個(gè)相鄰頂點(diǎn)壓入棧中敷燎。重復(fù)這一過程暂筝,直到棧中的元素全部被遍歷完畢。
  • 廣度優(yōu)先遍歷:選定一個(gè)頂點(diǎn)硬贯,把該頂點(diǎn)的相鄰頂點(diǎn)放進(jìn)隊(duì)列尾部焕襟。訪問隊(duì)列頭部的頂點(diǎn),把該頂點(diǎn)移出隊(duì)列饭豹,如果該頂點(diǎn)有相鄰頂點(diǎn)鸵赖,就把相鄰頂點(diǎn)放進(jìn)隊(duì)列尾部。重復(fù)這一過程拄衰,直到隊(duì)列中的元素全部遍歷完畢它褪。

下載地址:https://idea-instructions.com/graph-scan/

一筆畫

一筆畫是一種 Fleury 算法,旨在優(yōu)雅地找出圖中的歐拉(Eulerian)路徑翘悉。歐拉路徑是圖中的一條路徑茫打,剛好經(jīng)過每條邊,并且每條邊只被訪問一次妖混。


file
  1. 頂點(diǎn)度數(shù)表示該頂點(diǎn)有幾條邊老赤。
  2. 如果圖中有且僅有兩個(gè)頂點(diǎn)的度數(shù)為奇數(shù),其他為偶數(shù)制市,或者不存在奇數(shù)度數(shù)的頂點(diǎn)诗越,則存在歐拉路徑。
  3. 選定一個(gè)頂點(diǎn)開始畫路徑息堂。
  4. 如果存在兩個(gè)以上的橋嚷狞,那么可以走橋。如果只剩下一個(gè)橋荣堰,就不能走橋床未,除非只剩下橋可以走。
  5. 如果還有沒有走過的邊振坚,重復(fù)步驟 4薇搁。
  6. 成功畫出歐拉路徑。

下載地址:https://idea-instructions.com/euler-path/

原文鏈接:https://idea-instructions.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渡八,一起剝皮案震驚了整個(gè)濱河市啃洋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屎鳍,老刑警劉巖宏娄,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逮壁,居然都是意外死亡孵坚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卖宠,“玉大人巍杈,你說(shuō)我怎么就攤上這事】肝椋” “怎么了筷畦?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)刺洒。 經(jīng)常有香客問我汁咏,道長(zhǎng),這世上最難降的妖魔是什么作媚? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任攘滩,我火速辦了婚禮,結(jié)果婚禮上纸泡,老公的妹妹穿的比我還像新娘漂问。我一直安慰自己,他們只是感情好女揭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布蚤假。 她就那樣靜靜地躺著,像睡著了一般吧兔。 火紅的嫁衣襯著肌膚如雪磷仰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天境蔼,我揣著相機(jī)與錄音灶平,去河邊找鬼。 笑死箍土,一個(gè)胖子當(dāng)著我的面吹牛逢享,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吴藻,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瞒爬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了沟堡?” 一聲冷哼從身側(cè)響起侧但,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎航罗,沒想到半個(gè)月后禀横,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伤哺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年燕侠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了者祖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立莉。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绢彤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜓耻,到底是詐尸還是另有隱情茫舶,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布刹淌,位于F島的核電站饶氏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏有勾。R本人自食惡果不足惜疹启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔼卡。 院中可真熱鬧喊崖,春花似錦、人聲如沸雇逞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塘砸。三九已至节仿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掉蔬,已是汗流浹背廊宪。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留女轿,地道東北人挤忙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谈喳,于是被迫代替她去往敵國(guó)和親册烈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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