寫給第一次學演算法的同學
把演算法從「天書」
變成可以打的遊戲。
紙上考不及格沒關係。這裡用生活類比、動畫圖解、考前速翻, 把每個演算法拆成你一看就懂的小步驟。先看故事,再看圖,最後才看程式碼。
課程地圖
建議按順序看,但你也可以跳到想複習的章節。
基礎
歡迎!這裡跟學校不一樣
為什麼你之前學不會?怎麼用這個網站?三分鐘讓你知道接下來該怎麼讀。
演算法到底是什麼?(從泡麵說起)
用煮泡麵的步驟講清楚演算法的本質——不是寫 code,而是把事情做完的方法。
快還是慢?認識 Big-O(用快遞講)
不要被符號嚇到。Big-O 只是在問一件事:「資料變多 100 倍,要花多久?」
Master Theorem:遞迴式的萬用解法
看到 T(n) = aT(n/b) + f(n) 不要慌。Master Theorem 套公式三步分類,秒算 Big-O。
排序與搜尋
氣泡排序:泡泡浮上來(附動畫)
第一個排序演算法。看到動畫你就懂為什麼叫「氣泡」。慢,但是好懂、好寫、考試常考。
插入排序:你打牌時做的事
拿一張新牌,往左邊已排好的牌堆裡塞——這就是插入排序。
選擇排序:每次挑最小的放前面
從剩下的裡面挑最小的,放到最前面。動作簡單,但時間還是 O(n²)。
合併排序:分一半、各自排、再合起來
你跟同學分工排牌——一人排一半,最後合起來。這就是 Merge Sort,O(n log n)。
快速排序:選一個王,左邊小、右邊大
挑一個基準點,比它小的丟左邊、比它大的丟右邊。實務上最常用的排序。
二分搜尋:猜數字遊戲的最佳策略
我在心裡想 1~100 的一個數字,你最少猜幾次保證猜中?答案是 7 次——這就是 O(log n)。
堆積排序:用急診室來排序
把陣列建成 Heap,然後不斷取頂——出來的順序就是排序好的。O(n log n) 還省記憶體。
非比較排序:怎麼比 O(n log n) 還快?
如果不用「比較」呢?Counting Sort 和 Radix Sort 是兩種繞過 O(n log n) 下限的妙招。
進階技巧
圖論
圖論入門:點和線的世界
捷運路線圖、臉書好友、地圖導航——背後都是圖。先把詞彙學會,後面 BFS / DFS 才有意義。
BFS 和 DFS:走迷宮的兩種策略
BFS 像一圈一圈往外擴散,DFS 像鑽進去一條路走到底。兩種搜尋圖的最基本工具。
Dijkstra:Google Maps 怎麼幫你算最短路
有權重的圖找最短路徑,BFS 不夠用。Dijkstra 像水從起點以「實際距離」擴散。
拓撲排序:先穿襪子才穿鞋
課程預修順序、做菜步驟、編譯依賴——把「先做後做」變成一個合法的線性順序。
Bellman-Ford:負邊也能算最短路
Dijkstra 怕負邊,Bellman-Ford 不怕。代價是慢——O(V × E),但能偵測負環。
Floyd-Warshall:算所有點對的最短路
三層 for 迴圈,五行 code,算出任兩點之間的最短距離。O(V³) 簡單暴力。
最小生成樹:用最少的錢連起所有村莊
全村要接網路,怎麼挑最少的線路費用?這就是 MST。Kruskal 和 Prim 兩種解法都常考。
網路流:水管最多能流多少水?
從水庫到城市,中間有很多水管各有容量上限。每秒最多能送多少水?這是 Max-Flow 問題。
A* 搜尋:有第六感的 Dijkstra
一般 Dijkstra 像盲人摸象往四周試。A* 知道「終點大概在那邊」,所以優先往那走。遊戲、GPS 的核心。
資料結構
雜湊表:用櫃號快速找書
圖書館用「書名 → 櫃號」快速找書,雜湊表是電腦版。平均 O(1) 找東西,超快。
二元搜尋樹:左小右大的樹
樹版本的二分搜尋,新增/查詢平均 O(log n)。但歪掉會變 O(n),所以才有後來的 AVL/紅黑樹。
堆積與優先佇列:醫院急診室
急診室不是先到先看,而是「重傷先看」。Heap 就是這種「最重要的永遠在頂端」的資料結構。
Union-Find:判斷誰跟誰同國
一群人分組,怎麼快速問「A 和 B 同組嗎?」「把 A 和 B 合成一組」?並查集就是為這設計的。
自平衡 BST:歪了會自己轉正
BST 按順序插入會退化成 O(n)。AVL 和紅黑樹會在插入時「自動旋轉」維持平衡,保證 O(log n)。
線段樹 & BIT:區間查詢神器
給陣列,問「3~7 格的總和」、「2~10 格的最大值」——線段樹用 O(log n) 解決。