算法圖解筆記
阿新 • • 發佈:2018-07-23
stat states 順序 規劃 mage ocr 快速排序 散列函數 表達 ——一種速度較慢的排序算法。
? O(n!),這樣的算法包括接下來將介紹的旅行商問題的解決方案——一種非常慢的算法。
? O(2n),這樣的算法包括集合求所有子集個數。
很好的算法入門書籍,基於Python講解,好理解。
算法的時間復雜度一般有幾種,O(1),O(log N),O(N),O(N*log N),O(N2),O(N!),O(2N)。
時間復雜度指的不是算法運行的時間,而是操作次數,表達的是隨著規模N增大,操作次數增長的速度。而且時間復雜度是忽略常數的,在表達增速上常數的意義不大。
? O(1),常數時間,這樣的算法包括散(哈希)表。
? O(log n),也叫對數時間,這樣的算法包括二分查找。
? O(n),也叫線性時間,這樣的算法包括簡單查找。
? O(n * log n),這樣的算法包括第4章將介紹的快速排序——一種速度較快的排序算法。
? O(n2),這樣的算法包括第2章將介紹的選擇排序
? O(n!),這樣的算法包括接下來將介紹的旅行商問題的解決方案——一種非常慢的算法。
? O(2n),這樣的算法包括集合求所有子集個數。
目錄如下:
第 1 章 算法簡介 ............................................. 1 1.1 引言 .......................................................... 1 1.1.1 性能方面 ....................................... 1 1.1.2 問題解決技巧 ............................... 21.2 二分查找 ................................................... 2 1.2.1 更佳的查找方式 ............................ 4 1.2.2 運行時間 ....................................... 8 1.3 大 O 表示法 .............................................. 8 1.3.1 算法的運行時間以不同的速度 增加 ............................................... 9 1.3.2理解不同的大 O 運行時間 ........... 10 1.3.3 大 O 表示法指出了最糟情況下 的運行時間 .................................. 12 1.3.4 一些常見的大 O 運行時間 ........... 12 1.3.5 旅行商 .......................................... 13 1.4 小結 ......................................................... 15 第 2 章 選擇排序 ............................................ 16 2.1 內存的工作原理 ...................................... 16 2.2 數組和鏈表 .............................................. 18 2.2.1 鏈表 .............................................. 19 2.2.2 數組 .............................................. 20 2.2.3 術語 .............................................. 21 2.2.4 在中間插入 .................................. 22 2.2.5 刪除 .............................................. 23 2.3 選擇排序 .................................................. 25 2.4 小結 ......................................................... 28 第 3 章 遞歸 .................................................... 29 3.1 遞歸 ......................................................... 29 3.2 基線條件和遞歸條件 ............................... 32 3.3 棧 ............................................................. 33 3.3.1 調用棧 .......................................... 34 3.3.2 遞歸調用棧 .................................. 36 3.4 小結 ......................................................... 40 第 4 章 快速排序 ............................................ 41 4.1 分而治之 .................................................. 41 4.2 快速排序 .................................................. 47 4.3 再談大 O 表示法 ..................................... 52 4.3.1 比較合並排序和快速排序 ........... 53 4.3.2 平均情況和最糟情況 ................... 54 4.4 小結 ......................................................... 57 第 5 章 散列表 ................................................ 58 5.1 散列函數 .................................................. 60 5.2 應用案例 .................................................. 63 5.2.1 將散列表用於查找 ....................... 63 5.2.2 防止重復 ...................................... 64 5.2.3 將散列表用作緩存 ....................... 66 5.2.4 小結 .............................................. 68 5.3 沖突 ......................................................... 69 5.4 性能 ......................................................... 71 5.4.1 填裝因子 ...................................... 72 5.4.2 良好的散列函數 .......................... 74 5.5 小結 ......................................................... 75 第 6 章 廣度優先搜索 ................................... 76 6.1 圖簡介 ..................................................... 77 6.2 圖是什麽 .................................................. 79 6.3 廣度優先搜索 .......................................... 79 6.3.1 查找最短路徑 .............................. 82 6.3.2 隊列 .............................................. 83 6.4 實現圖 ..................................................... 84 6.5 實現算法 ................................................. 86 6.6 小結 ......................................................... 93 第 7 章 狄克斯特拉算法 ............................... 94 7.1 使用狄克斯特拉算法 .............................. 95 7.2 術語 ......................................................... 98 7.3 換鋼琴 ................................................... 100 7.4 負權邊 ................................................... 105 7.5 實現 ....................................................... 108 7.6 小結 ....................................................... 116 第 8 章 貪婪算法 .......................................... 117 8.1 教室調度問題 ........................................ 117 8.2 背包問題 ............................................... 119 8.3 集合覆蓋問題 ........................................ 121 8.4 NP 完全問題 .......................................... 127 8.4.1 旅行商問題詳解 ........................ 127 8.4.2 如何識別 NP 完全問題 .............. 131 8.5 小結 ....................................................... 133 第 9 章 動態規劃 .......................................... 134 9.1 背包問題 ............................................... 134 9.1.1 簡單算法 .................................... 135 9.1.2 動態規劃 .................................... 136 9.2 背包問題 FAQ ....................................... 143 9.2.1 再增加一件商品將如何呢 ......... 143 9.2.2 行的排列順序發生變化時結果將如何 ................................ 145 9.2.3 可以逐列而不是逐行填充網格嗎 ........................................ 146 9.2.4 增加一件更小的商品將如何呢 ........................................... 146 9.2.5 可以偷商品的一部分嗎 ............. 146 9.2.6 旅遊行程最優化 ........................ 147 9.2.7 處理相互依賴的情況 ................. 148 9.2.8 計算最終的解時會涉及兩個以上的子背包嗎 .................... 148 9.2.9 最優解可能導致背包沒裝滿嗎 ........................................... 149 9.3 最長公共子串 ........................................ 149 9.3.1 繪制網格 .................................... 150 9.3.2 填充網格 .................................... 151 9.3.3 揭曉答案 .................................... 152 9.3.4 最長公共子序列 ........................ 153 9.3.5 最長公共子序列之解決方案 ..... 154 9.4 小結 ....................................................... 155 第 10 章 K 最近鄰算法 ............................... 156 10.1 橙子還是柚子 ...................................... 156 10.2 創建推薦系統 ...................................... 158 10.2.1 特征抽取 ................................ 159 10.2.2 回歸 ....................................... 162 10.2.3 挑選合適的特征 .................... 164 10.3 機器學習簡介 ...................................... 165 10.3.1 OCR(光學字符識別(optical character recognition)) ....................................... 165 10.3.2 創建垃圾郵件過濾器 ............ 166 10.3.3 預測股票市場 ........................ 167 10.4 小結 ..................................................... 167 第 11 章 接下來如何做 ............................... 168 11.1 樹 ......................................................... 168 11.2 反向索引 ............................................. 171 11.3 傅裏葉變換 .......................................... 171 11.4 並行算法 ............................................. 172 11.5 MapReduce .......................................... 173 11.5.1 分布式算法為何很有用 ......... 173 11.5.2 映射函數 ................................ 173 11.5.3 歸並函數 ................................ 174 11.6 布隆過濾器和 HyperLogLog ............... 174 11.6.1 布隆過濾器 ............................ 175 11.6.2 HyperLogLog ......................... 176 11.7 SHA 算法 ............................................ 176 11.7.1 比較文件 ................................ 177 11.7.2 檢查密碼 ................................ 178 11.8 局部敏感的散列算法 .......................... 178 11.9 Diffie-Hellman 密鑰交換 .................... 179 11.10 線性規劃 ........................................... 180 11.11 結語 ................................................... 180 練習答案 ........................................................... 181
這裏介紹的算法還是比較簡單。
遞歸:講了遞歸和調用棧的關系,遞歸可能引起棧溢出導致程序終止。
排序:講了選擇排序,快速排序(分而治之,找基準值,遞歸)。合並排序只提了下,和快排一個復雜度,但比快排慢。其他排序沒提:冒泡排序,堆排序等。
查找:講了散列表(用作緩存,沖突,合理的填裝因子和散列函數來提高性能),二分查找。其他查找沒提等。
圖:講了廣度優先搜索(解決有向無權重無環圖的最短路徑問題,用到了隊列和散列表),講了狄克斯特拉算法(解決有向帶權重無負權邊無環圖的最優路徑問題,用到了3個散列表,例子換鋼琴)
貪心算法:解決高復雜度問題求最優解的方法,求近似結果,教室調度,背包問題,集合覆蓋問題。近似算法,NP完全問題識別:集合覆蓋問題,旅行商問題詳解。
#集合覆蓋問題
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"]) stations = {} stations["kone"] = set(["id", "nv", "ut"]) stations["ktwo"] = set(["wa", "id", "mt"]) stations["kthree"] = set(["or", "nv", "ca"]) stations["kfour"] = set(["nv", "ut"]) stations["kfive"] = set(["ca", "az"]) final_stations = set() while states_needed: best_station = None states_covered = set() for station, states in stations.items(): covered = states_needed & states if len(covered) > len(states_covered): best_station = station states_covered = covered states_needed -= states_covered final_stations.add(best_station) >>> print final_stations set([‘ktwo‘, ‘kthree‘, ‘kone‘, ‘kfive‘])
動態規劃:通過繪制網格解決問題,分而治之,網格的算法可能不同。背包問題,最長公共子串/序列。
K最近鄰算法:推薦系統(分類,回歸)。
最後一章:查詢、插入和刪除時間復雜度都較高的數據結構--樹。
算法圖解筆記