面試準備-《演算法第4版》Java演算法筆記、理解整理

Meandni發表於2019-02-03

cover

年假之前,我就規定自己要完成多少多少的任務,要做一些些有意義的事情,讀書,練習,輸出一些有價值的文字和筆記正是這一理念的實現,這樣不僅讓自己的經歷更漂亮一點,也能幫助很多其他人!

JVM 是 java 程式設計師永遠的考題,演算法是所有程式設計師永久的考題。這應該是很多人的共識,不管是誰,學習的路上我們時常遇到迷茫階段,抓住最根本的東西你永遠不會覺得迷失。

《演算法(第4版)》是一本晦澀的書,特別是中文版!我要強烈吐槽一下中文版的翻譯,因為這本書業內評價都極高,當我興致勃勃準備開始複習時,卻被繞口的中文讀的喘不過氣,導致我推遲好久終於在今年年假期間才又拿出來慢慢對著英文原版啃起來!

除去基礎資料結構的介紹,從大的方面講,全書共有 4 大塊,分別是排序、搜尋、圖、字串,每大塊基本都有 5 節的內容,每節又會有 4~5 種演算法的實現與講解,總共超過 80 道演算法型別,圖文並茂,確實是本好書(除了翻譯)。

我希望能用這種方式激勵我自己把這本書啃完,也希望幫助到一些正在準備面試和同樣準備複習演算法的同學。筆記內容除去了書中晦澀難懂的部分,擷取的書中精華部分,我認為這本書的精華就是一張張插圖,所以我幾乎把所有的幫助理解的圖都用上了,這一點你可以看3-3-平衡查詢樹的筆記,其次是每段都會貼出相應的關鍵程式碼,以便讓我以後複習時不理解可以直接看程式碼。這本筆記在我反覆複習也會隨時更新,預計以後刷 LeetCode 時,也會將對應提醒放在對應章節裡,如果有其他建議歡迎提 issue ,如果對你有幫助的話 Star 哦。

github整理地址:github.com/MeandNi/Alg…

筆記目錄

書中所有演算法集合

排序

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

相關文章