年假之前,我就規定自己要完成多少多少的任務,要做一些些有意義的事情,讀書,練習,輸出一些有價值的文字和筆記正是這一理念的實現,這樣不僅讓自己的經歷更漂亮一點,也能幫助很多其他人!
JVM 是 java 程式設計師永遠的考題,演算法是所有程式設計師永久的考題。這應該是很多人的共識,不管是誰,學習的路上我們時常遇到迷茫階段,抓住最根本的東西你永遠不會覺得迷失。
《演算法(第4版)》是一本晦澀的書,特別是中文版!我要強烈吐槽一下中文版的翻譯,因為這本書業內評價都極高,當我興致勃勃準備開始複習時,卻被繞口的中文讀的喘不過氣,導致我推遲好久終於在今年年假期間才又拿出來慢慢對著英文原版啃起來!
除去基礎資料結構的介紹,從大的方面講,全書共有 4 大塊,分別是排序、搜尋、圖、字串,每大塊基本都有 5 節的內容,每節又會有 4~5 種演算法的實現與講解,總共超過 80 道演算法型別,圖文並茂,確實是本好書(除了翻譯)。
我希望能用這種方式激勵我自己把這本書啃完,也希望幫助到一些正在準備面試和同樣準備複習演算法的同學。筆記內容除去了書中晦澀難懂的部分,擷取的書中精華部分,我認為這本書的精華就是一張張插圖,所以我幾乎把所有的幫助理解的圖都用上了,這一點你可以看3-3-平衡查詢樹的筆記,其次是每段都會貼出相應的關鍵程式碼,以便讓我以後複習時不理解可以直接看程式碼。這本筆記在我反覆複習也會隨時更新,預計以後刷 LeetCode 時,也會將對應提醒放在對應章節裡,如果有其他建議歡迎提 issue ,如果對你有幫助的話 Star 哦。
github整理地址:github.com/MeandNi/Alg…
筆記目錄
- Chapter02-Sorting
- Chapter03-Searching
- Chapter04-Graphs
- Chapter05-String
書中所有演算法集合
排序:
ALGORITHM | CODE | IN PLACE | STABLE | BEST | AVERAGE | WORST | REMARKS |
---|---|---|---|---|---|---|---|
選擇排序 | Selection.java | ✔ | ½ n 2 | ½ n 2 | ½ n 2 | n exchanges; quadratic in best case | |
插入排序 | Insertion.java | ✔ | ✔ | n | ¼ n 2 | ½ n 2 | use for small or partially-sorted arrays |
氣泡排序 | Bubble.java | ✔ | ✔ | n | ½ n 2 | ½ n 2 | rarely useful; use insertion sort instead |
希爾排序 | Shell.java | ✔ | n log3 n | unknown | c n 3/2 | tight code; subquadratic | |
合併排序 | Merge.java | ✔ | ½ n lg n | n lg n | n lg n | n log n guarantee; stable | |
快速排序 | Quick.java | ✔ | n lg n | 2 n ln n | ½ n 2 | n log n probabilistic guarantee; fastest in practice | |
堆排序 | Heap.java | ✔ | n † | 2 n lg n | 2 n lg n | n log n guarantee; in place |
優先佇列
DATA STRUCTURE | CODE | INSERT | DEL-MIN | MIN | DEC-KEY | DELETE | MERGE |
---|---|---|---|---|---|---|---|
陣列 | BruteIndexMinPQ.java | 1 | n | n | 1 | 1 | n |
二叉堆 | IndexMinPQ.java | log n | log n | 1 | log n | log n | n |
d-way heap | IndexMultiwayMinPQ.java | logd n | d logd n | 1 | logd n | d logd n | n |
二項堆 | IndexBinomialMinPQ.java | 1 | log n | 1 | log n | log n | log n |
斐波那契堆 | IndexFibonacciMinPQ.java | 1 | log n † | 1 | 1 † | log n † | log n |
查詢
worst case | average case | ||||||
---|---|---|---|---|---|---|---|
DATA STRUCTURE | CODE | SEARCH | INSERT | DELETE | SEARCH | INSERT | DELETE |
順序查詢 (無序列表) | SequentialSearchST.java | n | n | n | n | n | n |
二分查詢 (有序列表) | BinarySearchST.java | log n | n | n | log n | n | n |
二叉樹 (不平衡) | BST.java | n | n | n | log n | log n | sqrt(n) |
紅黑二叉樹 (左傾) | RedBlackBST.java | log n | log n | log n | log n | log n | log n |
雜湊表 (分離連結法) | SeparateChainingHashST.java | n | n | n | 1 † | 1 † | 1 † |
雜湊表 (線性探測) | LinearProbingHashST.java | n | n | n | 1 † | 1 † | 1 † |
圖
PROBLEM | ALGORITHM | CODE | TIME | SPACE |
---|---|---|---|---|
路徑 | DFS | DepthFirstPaths.java | E + V | V |
最短路徑(最少邊緣) | BFS | BreadthFirstPaths.java | E + V | V |
環 | DFS | Cycle.java | E + V | V |
有向路徑 | DFS | DepthFirstDirectedPaths.java | E + V | V |
最短有向路徑 (最少邊緣) | BFS | BreadthFirstDirectedPaths.java | E + V | V |
有向環 | DFS | DirectedCycle.java | E + V | V |
拓撲排序 | DFS | Topological.java | E + V | V |
bipartiteness / odd cycle | DFS | Bipartite.java | E + V | V |
連通分量 | DFS | CC.java | E + V | V |
強連通分量 | Kosaraju–Sharir | KosarajuSharirSCC.java | E + V | V |
強連通分量 | Tarjan | TarjanSCC.java | E + V | V |
強連通分量 | Gabow | GabowSCC.java | E + V | V |
尤拉回路 | DFS | EulerianCycle.java | E + V | E + V |
定向尤拉迴圈 | DFS | DirectedEulerianCycle.java | E + V | V |
傳遞閉包 | DFS | TransitiveClosure.java | V (E + V) | V 2 |
最小生成樹 | Kruskal | KruskalMST.java | E log E | E + V |
最小生成樹 | Prim | PrimMST.java | E log V | V |
最小生成樹 | Boruvka | BoruvkaMST.java | E log V | V |
最短路徑(非負權) | Dijkstra | DijkstraSP.java | E log V | V |
最短路徑(無負迴圈) | Bellman–Ford | BellmanFordSP.java | V (V + E) | V |
s最短路徑(無環) | topological sort | AcyclicSP.java | V + E | V |
所有節點對之間的最短路 | Floyd–Warshall | FloydWarshall.java | V 3 | V 2 |
最大流/最小割 | Ford–Fulkerson | FordFulkerson.java | E V (E + V) | V |
二分圖匹配 | Hopcroft–Karp | HopcroftKarp.java | V ½ (E + V) | V |
任務分配問題 | successive shortest paths | AssignmentProblem.java | n 3 log n | n 2 |