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)最壞的情況四啰。
- 隨機(jī)選擇“分區(qū)點(diǎn)”宁玫。
- 按照“分區(qū)點(diǎn)”的高度劃條線。
- 高出“分局點(diǎn)”的元素需要向右移動(dòng)柑晒。
- 低于“分區(qū)點(diǎn)”的元素需要向左移動(dòng)欧瘪。
- 移動(dòng)元素。
- 重復(fù)上述的步驟分別對(duì)位于“分區(qū)點(diǎn)”兩邊的元素進(jìn)行排序匙赞。
下載地址:https://idea-instructions.com/quick-sort/
Bogo 排序
Bogo 排序也被稱為“愚蠢的排序”佛掖,是一種非常簡(jiǎn)單但低效的排序算法妖碉,就是不斷打亂元素的順序,直到達(dá)到有序?yàn)橹埂?/p>
- 查看元素是否有序芥被。
- 元素?zé)o序欧宜,那么就打亂順序。
- 再次檢查元素是否有序拴魄。
- 如果有序冗茸,排序成功,否則繼續(xù)重復(fù)上述步驟匹中。
下載地址:https://idea-instructions.com/bogo-sort/
二分查找
二分查找是一種快速?gòu)囊粋€(gè)有序數(shù)組中找到某個(gè)元素位置的查找算法夏漱。這有點(diǎn)類似于猜數(shù)字游戲,通過不斷問“目標(biāo)數(shù)字是大于還是小于某個(gè)數(shù)”這樣的問題顶捷,最終猜出目標(biāo)數(shù)字麻蹋。
- 限定元素區(qū)間。
- 待查找元素在區(qū)間的某個(gè)位置嗎焊切?
- 不在扮授。
- 那么看看待查找元素是不是在當(dāng)前位置的左邊或者右邊。
下載地址:https://idea-instructions.com/binary-search/
歸并排序
歸并排序也是一種“分而治之”的遞歸排序算法专肪。
把元素分成兩部分刹勃,對(duì)每一個(gè)部分采用遞歸的歸并排序。
- 比較已經(jīng)排好序的元素嚎尤。
- 合并已經(jīng)排好序的元素荔仁。
- 排序完畢。
下載地址:https://idea-instructions.com/merge-sort/
平衡二叉樹
平衡二叉樹是自平衡的二叉樹變種芽死,可以保證快速的查找乏梁、插入和刪除操作。
以圖中的平衡二叉樹為例:
- 左子節(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)先遍歷渺杉。
- 隨機(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)過每條邊,并且每條邊只被訪問一次妖混。
- 頂點(diǎn)度數(shù)表示該頂點(diǎn)有幾條邊老赤。
- 如果圖中有且僅有兩個(gè)頂點(diǎn)的度數(shù)為奇數(shù),其他為偶數(shù)制市,或者不存在奇數(shù)度數(shù)的頂點(diǎn)诗越,則存在歐拉路徑。
- 選定一個(gè)頂點(diǎn)開始畫路徑息堂。
- 如果存在兩個(gè)以上的橋嚷狞,那么可以走橋。如果只剩下一個(gè)橋荣堰,就不能走橋床未,除非只剩下橋可以走。
- 如果還有沒有走過的邊振坚,重復(fù)步驟 4薇搁。
- 成功畫出歐拉路徑。