很好的算法入門書籍,基於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 問題解決技巧 ............................... 2 1.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最近鄰算法:推薦系統(分類,迴歸)。
最後一章,接下來如何作:
一、查詢、插入和刪除時間複雜度都較高爲O(log N)的數據結構--樹。高級數據結構:B樹(數據庫經常使用它來存儲數據),紅黑樹,堆,伸展樹。
二、反向索引:散列表<單詞,包含單詞的網頁集合>,搜索引擎的工做原理。
三、傅里葉變換:給它一杯冰沙,它能告訴你其中包含哪些成分。可將歌曲分解成不一樣頻率,能夠強化低音並隱藏高音;能夠壓縮音樂,將不重要的音符刪除,MP3格式的工做原理;圖像壓縮成JPG格式;地震預測;DNA分析;音樂識別軟件。
四、並行算法:很難設計,速度提高並不是線性。緣由兩個:並行性管理開銷,好比排序並行計算後的合併也須要時間。負載均衡,