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