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

cover

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

JVM 是 java 程序員永遠的考題,算法是全部程序員永久的考題。這應該是不少人的共識,無論是誰,學習的路上咱們時常遇到迷茫階段,抓住最根本的東西你永遠不會以爲迷失。java

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

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

我但願能用這種方式激勵我本身把這本書啃完,也但願幫助到一些正在準備面試和一樣準備複習算法的同窗。筆記內容除去了書中晦澀難懂的部分,截取的書中精華部分,我認爲這本書的精華就是一張張插圖,因此我幾乎把全部的幫助理解的圖都用上了,這一點你能夠看3-3-平衡查找樹的筆記,其次是每段都會貼出相應的關鍵代碼,以便讓我之後複習時不理解能夠直接看代碼。這本筆記在我反覆複習也會隨時更新,預計之後刷 LeetCode 時,也會將對應提醒放在對應章節裏,若是有其餘建議歡迎提 issue ,若是對你有幫助的話 Star 哦。github

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
相關文章
相關標籤/搜索