內容簡介
算法是程式的靈魂,算法能夠告訴開發者在面對一個項目功能時用什麼思路去實現。《Python算法從入門到實踐》循序漸進地講解了算法實現的核心技術。全書共分為 13 章,主要內容包括初步認識算法、枚舉算法思想、遞歸算法思想、分治算法思想、貪心算法思想、試探算法思想、疊代算法思想、查找算法、排序算法、使用算法解決數據結構問題、解決數學問題、常見的經典算法問題、常用的人工智慧算法。本書通過具體實例的實現過程演練了各個知識點的具體使用流程,引領讀者全面掌握算法的核心技術。 《Python算法從入門到實踐》不但適合算法研究和學習的初學者,也適合有一定算法基礎的讀者,還可以作為大、中專院校相關專業師生的學習用書和培訓機構的教材。
作者簡介
薛小龍,哈爾濱工業大學計算機碩士,現就職於阿里天貓國際研發部門。精通Python、C、C 、Java、C#開發語言,擅長數據分析和大數據挖掘技術,熟悉軟體規劃、項目架構和項目推廣。近年來隨著AI和大數據業務的興起,深入研究了人工智慧開發套用。熱衷於人工智慧、Android開發和物聯網開發,對AI項目的架構設計和實現原理有非常深刻的認識和理解,套用開發經驗也十分豐富。
圖書目錄
第1章 初步認識算法 1
1.1 什麼是算法 2
1.1.1 一道有趣的智力題 2
1.1.2 算法的定義 2
1.1.3 計算機中的算法 3
1.1.4 算法在程式語言中的定義 4
1.2 衡量算法的優劣 4
1.2.1 衡量算法優劣的標準 4
1.2.2 算法複雜度 5
1.2.3 時間複雜度與空間複雜度的取捨問題 8
第2章 枚舉算法思想 9
2.1 枚舉算法概述 10
2.1.1 枚舉算法介紹 10
2.1.2 Python中的枚舉算法 10
2.2 破解謎題 11
2.2.1 算法分析 11
2.2.2 具體實現 11
2.3 破解24點遊戲 12
2.3.1 算法分析 12
2.3.2 使用枚舉算法解決24點問題 13
2.4 解決熄燈問題 16
2.4.1 算法分析 17
2.4.2 使用numpy和枚舉算法解決熄燈問題 19
2.5 解決“討厭的青蛙”問題 20
2.5.1 算法分析 21
2.5.2 具體實現 22
2.6 解決“雞兔同籠”問題 24
2.6.1 算法分析 24
2.6.2 具體實現:輸入頭和腳的個數的解法 24
2.7 解決“水仙花數”問題 25
2.7.1 找出1000以內的水仙花數 25
2.7.2 找出5位水仙花數 26
2.7.3 找出10000以內的水仙花數(包括1位、2位) 26
第3章 遞歸算法思想 29
3.1 遞歸算法思想基礎 30
3.1.1 什麼是遞歸 30
3.1.2 對遞歸和循環的生動解釋 31
3.1.3 用歸納法來理解遞歸 32
3.1.4 遞歸的三個要素 32
3.2 解決“斐波那契數列”問題 33
3.2.1 算法分析 33
3.2.2 計算斐波那契數列的第n項值 34
3.2.3 使用Memorization(記憶化)最佳化遞歸 35
3.3 用遞歸算法解決“漢諾塔”問題 36
3.3.1 算法分析 37
3.3.2 使用遞歸算法解決“漢諾塔”問題的具體實現 38
3.4 解決“階乘”問題 40
3.4.1 算法分析 40
3.4.2 使用遞歸算法計算10之內的階乘 41
3.4.3 使用循環計算階乘 41
3.5 進制轉換器 42
3.5.1 算法分析 42
3.5.2 比較遞歸方案和循環方案 42
3.6 解決二叉樹遍歷問題 43
3.6.1 算法分析 43
3.6.2 實現樹結構 44
3.6.3 遞歸遍歷方案 45
3.7 求解公約數和小公倍數 46
3.7.1 算法分析 47
3.7.2 基於遞歸算法的方案 47
3.8 解決全排列問題 48
3.8.1 具體實現:將全排列問題分解成多個子問題 48
3.8.2 位元組跳動的一道面試題:遞歸實現n的全排列 49
3.9 解決迷宮問題 49
3.9.1 算法分析 50
3.9.2 具體實現 50
第4章 分治算法思想 53
4.1 分治算法思想基礎 54
4.1.1 什麼是分治算法 54
4.1.2 分治法的解題思路 54
4.1.3 總結分治法能解決什麼類型的問題 56
4.2 找出有序列表中的值 56
4.2.1 算法分析 56
4.2.2 使用二分法在有序列表中找出指定的值 56
4.2.3 使用分治算法判斷某個元素是否在列表中 57
4.3 求順序表中數據的值 58
4.3.1 算法分析 58
4.3.2 具體實現 58
4.4 解決小值和值的問題 59
4.4.1 算法分析 59
4.4.2 查找列表中元素的小值和值 59
4.5 解決第k小(大)元素的問題 61
4.5.1 算法分析 61
4.5.2 找出一組序列中的第k小(大)的元素 61
4.5.3 找出列表中第k大的元素 62
4.6 快速排序 62
4.6.1 算法分析 63
4.6.2 快速排序具體方案 63
4.7 實現歸併排序 63
4.7.1 算法分析 63
4.7.2 對指定列表實現歸併排序 64
4.8 整數劃分 64
4.8.1 算法分析 65
4.8.2 整數劃分問題的具體實現 65
4.9 棋盤覆蓋 65
4.9.1 算法分析 66
4.9.2 使用分治算法解決棋盤覆蓋問題 66
4.9.3 GUI版本的解決棋盤覆蓋方案 67
4.10 解決漢諾塔問題 70
4.10.1 算法分析 70
4.10.2 用分治算法解決漢諾塔問題 71
4.11 解決循環賽問題 72
4.11.1 算法分析 72
4.11.2 根據輸入的比賽人數解決循環賽問題 72
第5章 貪心算法思想 75
5.1 貪心算法思想基礎 76
5.1.1 什麼是貪心算法 76
5.1.2 貪心算法的基本思路和基本特性 76
5.2 解決“找零方案”問題 77
5.2.1 算法分析 77
5.2.2 解決“找零方案”的具體實現 77
5.3 解決“汽車加油”問題 78
5.3.1 算法分析 78
5.3.2 計算少加油次數 79
5.3.3 計算如何加油次數會少 79
5.4 解決“求子數組之和”問題 80
5.4.1 算法分析 80
5.4.2 具體實現 81
5.5 解決“幼稚園分糖果”問題 81
5.5.1 算法分析 81
5.5.2 具體實現 82
5.6 聖誕節的禮物 82
5.6.1 算法分析 83
5.6.2 分配指定箱數的糖果 83
5.7 解決“活動安排”問題 84
5.7.1 算法分析 85
5.7.2 使用貪心算法解決“活動安排”問題的方案 85
5.8 解決“搖擺序列”問題 86
5.8.1 算法分析 86
5.8.2 具體解決方案 88
5.9 移除k個數字 89
5.9.1 算法分析 89
5.9.2 具體實現方案 89
5.10 解決“背包”問題 90
5.10.1 算法分析 90
5.10.2 使用小重量貪心策略解決背包問題 90
5.10.3 使用價值密度貪心策略解決背包問題 91
5.10.4 從單位重量價值角度解決背包問題 92
5.11 解決“霍夫曼編碼”問題 94
5.11.1 算法分析 94
5.11.2 使用內置庫解決問題 95
5.11.3 實現一個可變長度的編碼問題 97
5.12 解決“Kruskal算法”問題 98
5.12.1 算法分析 98
5.12.2 種使用Kruskal算法獲取小生成樹的方案 100
5.12.3 第二種使用Kruskal算法獲取小生成樹的方案 101
5.12.4 第三種使用Kruskal算法獲取小生成樹的方案 103
5.13 解決Prim算法問題 105
5.13.1 算法分析 105
5.13.2 種方案 106
5.13.3 第二種方案 107
5.14 解決“馬踏棋盤”問題 109
5.14.1 算法分析 109
5.14.2 使用貪心算法和遞歸算法解決“馬踏棋盤”問題 109
第6章 試探算法思想 113
6.1 試探算法思想基礎 114
6.1.1 試探法算法介紹 114
6.1.2 使用回溯算法的步驟 114
6.1.3 回溯算法會影響程式的效率嗎 115
6.2 解決“解空間”問題 115
6.2.1 算法分析 116
6.2.2 使用子集樹模板遞歸創建一個通用模板 116
6.2.3 使用排列樹模板遞歸創建一個通用模板 117
6.3 解決“全排列”問題 118
6.3.1 算法分析 119
6.3.2 實現 'a', 'b', 'c', 'd' 四個元素的全排列 119
6.4 解決“選排列”問題 120
6.4.1 算法分析 120
6.4.2 使用回溯算法解決“選排列”問題 120
6.5 解決“找零錢”問題 122
6.5.1 算法分析 122
6.5.2 使用回溯算法解決“找零錢”問題 123
6.6 解決“長公共子序列”問題 124
6.6.1 算法分析 124
6.6.2 使用回溯算法解決長公共子序列問題 125
6.7 解決“排課”問題 126
6.7.1 算法分析 127
6.7.2 使用回溯算法解決排課問題 127
6.8 解決“作業調度”問題 129
6.8.1 算法分析 129
6.8.2 使用回溯算法解決作業調度問題 130
6.9 解決“圖的遍歷”問題 131
6.9.1 算法分析 132
6.9.2 具體實現 132
6.10 解決“爬樓梯”問題 133
6.10.1 算法分析 133
6.10.2 具體實現 133
6.11 解決“m-著色”問題 134
6.11.1 算法分析 135
6.11.2 具體實現 135
6.12 解決“取物搭配”問題 137
6.12.1 算法分析 137
6.12.2 使用回溯算法解決“取物搭配”問題 137
6.13 解決“旅行商”問題 139
6.13.1 算法分析 139
6.13.2 具體實現 139
6.14 解決“0-1背包”問題 141
6.14.1 算法分析 141
6.14.2 使用回溯子集樹法解決問題 141
6.15 解決“野人與傳教士”問題 142
6.15.1 算法分析 143
6.15.2 使用回溯子集樹法解決野人與傳教士問題 143
6.16 解決“騎士巡邏”問題 144
6.16.1 算法分析 145
6.16.2 使用試探算法解決“騎士巡邏”問題 145
6.17 解決“八皇后”問題的4種方案 147
6.17.1 算法分析 147
6.17.2 使用回溯法解決八皇后問題 147
6.17.3 使用遞歸回溯算法解決八皇后問題 148
6.17.4 在縱向和斜向判斷是否存在其他皇后 151
6.18 解決“迷宮”問題 154
6.18.1 算法分析 154
6.18.2 使用回溯法解決迷宮問題 154
6.19 解決面試題“矩陣中的路徑” 156
6.19.1 算法分析 157
6.19.2 具體實現 157
6.20 解決“馬踏棋盤”問題 158
6.20.1 算法分析 159
6.20.2 使用回溯算法解決“5×5馬踏棋盤”問題 159
第7章 疊代算法思想 161
7.1 疊代算法思想基礎 162
7.1.1 疊代算法思想介紹 162
7.1.2 疊代法和方程 162
7.2 解決“斐波那契數列”問題 163
7.2.1 算法分析 163
7.2.2 使用疊代算法計算第12個月時兔子的數量 164
7.2.3 比較疊代算法和遞歸算法的效率 164
7.3 解決“角谷猜想”問題 165
7.3.1 算法分析 165
7.3.2 種方案 165
7.3.3 第二種方案 166
7.4 使用牛頓疊代法計算方程的根 167
7.4.1 算法分析 167
7.4.2 計算方程x3-x-1=0的根 167
7.4.3 比較簡單疊代法和牛頓疊代法 168
7.5 使用牛頓疊代法求極值 172
7.5.1 算法分析 172
7.5.2 具體實現 172
7.6 求平方根 173
7.6.1 算法分析 173
7.6.2 使用牛頓疊代法求平方根 173
7.7 求極值並繪製曲線 175
7.7.1 算法分析 175
7.7.2 使用牛頓疊代法求極值並繪製曲線 175
7.8 求解輸入的方程 177
7.8.1 項目需求 178
7.8.2 使用牛頓疊代法求解輸入的方程 178
7.9 求x附近的一個實根 179
7.9.1 算法分析 179
7.9.2 求方程在x附近的一個實根 179
7.10 解決“非線性方程組”問題 180
7.10.1 使用內置函式求解非線性方程組 180
7.10.2 使用第三方庫函式求解非線性方程組 181
7.11 求解線性方程組 182
7.11.1 算法分析 183
7.11.2 使用雅克比疊代法求解線性方程組 183
7.12 使用Gauss-Seidel疊代法求解線性方程組 185
7.12.1 算法分析 185
7.12.2 具體實現 185
7.13 解決數值分析問題 187
7.13.1 使用疊代法求解方程 187
7.13.2 解決“龍貝格求積公式”問題 192
7.13.3 解決“三次樣條插值”問題 193
7.13.4 解決“拉格朗日插值公式”問題 196
第8章 查找算法 199
8.1 什麼是查找算法 200
8.2 線性表查找:順序查找 200
8.2.1 順序查找法基礎 201
8.2.2 順序查找的時間複雜度 201
8.2.3 算法演練——實現順序查找算法 202
8.2.4 算法演練——實現有序列表查找 202
8.2.5 算法演練——實現無序列表查找 203
8.2.6 算法演練——在列表中查找x是否存在 203
8.3 線性表查找:折半查找算法 204
8.3.1 折半查找算法基礎 204
8.3.2 算法演練——使用折半查找算法查找數據 205
8.3.3 算法演練——使用折半查找算法查找指定數字 205
8.3.4 算法演練——使用遞歸法實現折半查找算法 206
8.3.5 算法演練——比較順序查找和折半查找 206
8.4 線性表查找:插值查找算法 208
8.4.1 插值查找算法基礎 208
8.4.2 算法演練——使用插值查找法查找指定的數據 208
8.5 線性表查找:分塊查找算法 209
8.5.1 分塊查找算法基礎 209
8.5.2 算法演練——使用分塊查找算法在列表中查找某元素 211
8.5.3 算法演練——改進的使用分塊查找算法 212
8.6 基於樹的查找法:二叉排序樹算法 213
8.6.1 二叉排序樹算法基礎 214
8.6.2 插入和生成 214
8.6.3 刪除操作 215
8.6.4 查找操作 217
8.6.5 算法演練——實現二叉樹的搜尋、插入、刪除、先序遍歷、中序遍歷和後序遍歷操作 217
8.7 基於樹的查找法:平衡二叉排序樹算法 220
8.7.1 平衡二叉排序樹算法基礎 220
8.7.2 Python判斷平衡二叉樹的方法 223
8.7.3 算法演練——實現平衡二叉樹的基本操作 223
8.8 哈希查找算法 229
8.8.1 哈希算法的基本思想 230
8.8.2 構造哈希函式 230
8.8.3 處理衝突 232
8.8.4 哈希表的查找過程 234
8.8.5 算法演練——使用哈希算法查找數據 234
8.9 斐波那契查找算法 235
8.9.1 斐波那契查找算法基礎 235
8.9.2 算法演練——使用斐波那契查找算法查找數據 236
8.9.3 算法演練——比較順序查找、二分查找、插值查找和斐波那契查找 237
8.10 紅黑樹查找算法 239
8.10.1 紅黑樹查找算法基礎 239
8.10.2 算法演練——使用紅黑樹運算元據 240
8.10.3 算法演練——繪製紅黑樹的插入圖 244
第9章 排序算法 249
9.1 什麼是排序算法 250
9.1.1 排序算法的定義 250
9.1.2 排序算法的分類 250
9.2 插入排序算法 250
9.2.1 插入排序算法基礎 251
9.2.2 直接插入排序算法 251
9.2.3 算法演練——排序一個列表 252
9.2.4 算法演練——升序和降序排列 253
9.3 希爾排序 254
9.3.1 希爾排序算法基礎 254
9.3.2 算法演練——使用希爾排序算法對數據進行排序處理 255
9.3.3 算法演練——排序一個列表 256
9.3.4 算法演練——使用希爾排序算法對列表進行排序 257
9.4 交換類排序:冒泡排序算法 258
9.4.1 冒泡排序(相鄰比序法)算法基礎 258
9.4.2 算法演練——簡單的冒泡排序 259
9.4.3 算法演練——實現從大到小的冒泡排序 260
9.4.4 算法演練——使用冒泡排序算法的最佳化 261
9.5 交換類排序:快速排序算法 263
9.5.1 快速排序算法基礎 264
9.5.2 算法演練——實現基本的快速排列 265
9.5.3 算法演練——使用快速排序算法排列一個列表 266
9.6 選擇排序算法 267
9.6.1 直接選擇排序算法基礎 267
9.6.2 樹形選擇排序算法基礎 268
9.6.3 算法演練——使用直接選擇排序算法 268
9.6.4 算法演練——使用直接選擇排序算法排列一個列表 269
9.7 堆排序算法 270
9.7.1 堆排序算法基礎 270
9.7.2 算法演練——使用堆排序處理數據 272
9.7.3 算法演練——實現堆排序 273
9.8 歸併排序算法 276
9.8.1 歸併排序算法基礎 276
9.8.2 兩路歸併算法的思路 277
9.8.3 實現歸併排序 278
9.8.4 算法演練——使用歸併排序算法排列一個列表 279
9.8.5 算法演練——圖解歸併排序算法 280
9.9 基數排序算法 282
9.9.1 多關鍵字排序 282
9.9.2 鏈式基數排序 283
9.9.3 算法演練——使用基數排序算法排序隨機數字 284
9.9.4 算法演練——使用基數排序算法排序列表 285
9.10 綜合比較各種排序方法 287
第10章 使用算法解決數據結構問題 289
10.1 約瑟夫環 290
10.1.1 問題描述 290
10.1.2 算法分析 290
10.1.3 具體實現 291
10.2 操作順序表 292
10.2.1 算法分析 293
10.2.2 具體實現 293
10.3 操作鍊表 295
10.3.1 算法分析 295
10.3.2 具體實現 295
10.4 帶有尾節點引用的單鍊表 297
10.4.1 算法分析 297
10.4.2 具體實現 297
10.5 操作佇列、鍊表、順序表和循環順序表 299
10.5.1 時間複雜度分析 299
10.5.2 具體實現 299
10.6 使用多叉樹尋找短路徑 302
10.6.1 算法分析 302
10.6.2 具體實現 302
10.7 樹操作 304
10.7.1 實現AVL樹 304
10.7.2 使用二維數組生成有向圖 307
10.7.3 使用廣度優先和深度優先遍歷二叉樹 308
第11章 解決數學問題 311
11.1 一段神奇的字元 312
11.1.1 問題描述 312
11.1.2 具體實現 312
11.2 1000以內的完全數 313
11.2.1 問題描述 313
11.2.2 算法分析 314
11.2.3 具體實現 315
11.3 多進程驗證哥德巴赫猜想 315
11.3.1 問題描述 315
11.3.2 算法分析 315
11.3.3 具體實現 316
11.4 公約數和小公倍數 318
11.4.1 算法分析 318
11.4.2 具體實現 318
11.5 親密數 319
11.5.1 算法分析 319
11.5.2 具體實現 319
11.6 計算10000以內的自守數 320
11.6.1 算法分析 320
11.6.2 具體實現 320
11.7 矩陣運算 320
11.7.1 算法分析 321
11.7.2 具體實現 321
11.8 一元多項式運算 322
11.8.1 一元多項式求導 322
11.8.2 實現多項式的加、減、乘法運算 323
11.9 素數問題 325
11.9.1 求1000以內的所有素數 325
11.9.2 孿生素數問題 326
11.9.3 金蟬素數 327
11.9.4 可逆素數 328
11.9.5 回文素數 329
11.9.6 等差素數數列 329
第12章 常見的經典算法問題 333
12.1 借書方案 334
12.1.1 算法分析 334
12.1.2 具體實現 334
12.2 捕魚和分魚 335
12.2.1 算法分析 336
12.2.2 具體實現 336
12.3 出售金魚 336
12.3.1 算法分析 336
12.3.2 具體實現 337
12.4 平分七筐魚 337
12.4.1 算法分析 337
12.4.2 具體實現 338
12.5 繩子的長度和井深 338
12.5.1 算法分析 339
12.5.2 具體實現 339
12.6 雞兔同籠 340
12.6.1 算法分析 340
12.6.2 具體實現 340
12.7 三色球問題 341
12.7.1 算法分析 341
12.7.2 具體實現 342
12.8 計算年齡 342
12.8.1 算法分析 342
12.8.2 具體實現 342
12.9 常勝將軍問題 343
12.9.1 算法分析 344
12.9.2 具體實現 344
12.10 野人與傳教士問題 345
12.10.1 算法分析 345
12.10.2 具體實現 345
12.11 三色旗問題 347
12.11.1 算法分析 347
12.11.2 具體實現 347
12.12 猴子分桃 348
12.12.1 算法分析 348
12.12.2 具體實現 349
第13章 常用的人工智慧算法 351
13.1 線性回歸算法 352
13.1.1 線性回歸介紹 352
13.1.2 繪製三維平面 352
13.1.3 預測房價 353
13.2 二元決策樹算法 359
13.2.1 何為二元決策樹 359
13.2.2 選擇二元決策樹切割點 359
13.2.3 使用二元決策樹擬合數據 361
13.2.4 確定深度的算法 362
13.3 Bagging算法 365
13.3.1 何為Bagging算法 365
13.3.2 實現Bootstrap採樣 366
13.4 Boosting算法 367
13.4.1 Boosting基礎 367
13.4.2 心絞痛ROC曲線檢測系統 368
13.5 隨機森林算法 372
13.5.1 什麼是隨機森林 373
13.5.2 分析聲吶數據 373