算法學習與應用從入門到精通
張玲玲
相關主題
商品描述
算法是程序的靈魂,只有掌握了算法,才能輕松地駕馭程序開發。算法能夠告訴開 發者在面對一個項目功能時用什麽思路去實現,有了這個思路後,編程工作只需遵循這個思路去實現即可。本書循序漸進、由淺入深地詳細講解了算法實現的核心技術,並通過具體實例的實現過程演練了各個知識點的具體使用流程。
全書共20章,其中,第 1章講解了算法為什麽是程序的靈魂;第 2~8章分別講解了常用的算法,如線性表、隊列和棧,樹,圖,查找算法,內部排序算法,外部排序算法等知識,這些內容都是算法技術核心的語法知識;第9~15章分別講解了經典的數據結構問題、解決數學問題、解決趣味問題、解決圖像問題、算法的經典問題、解決奧賽問題、常見算法應用實踐等高 級編程技術,這些內容是算法技術的重點和難點;第 16~20章分別通過5個綜合實例的實現過程,介紹了算法在綜合開發項目中的使用流程和發揮的作用。全書內容以“技術解惑”和“實踐應用”貫穿全書,引 領讀者全面掌握算法的核心技術。
本書不但適合算法研究和學習的初學者,也適合有一定算法基礎的讀者,還可以作為大中專院校相關專業師生的學慣用書和培訓學校的教材。
作者簡介
计算机硕士,杰出程序员和算法专家,在算法研究和应用上很有心得,曾经开发过众多的游戏应用、系统软件的。业余期间,曾经在国内主流期刊中发表过多篇算法领域的杰出论文。
目錄大綱
目錄
第 1章 算法是程序的靈魂 1
(視頻總計18分鐘,技術解惑1個)
1.1 算法的基礎 2
1.1.1 算法的特徵 2
1.1.2 何為算法 2
1.2 電腦中的算法 3
1.2.1 認識電腦中的算法 3
1.2.2 為什麽說算法是程序的
靈魂 4
1.3 在電腦中表示算法的方法 4
1.3.1 用流程圖來表示算法 4
1.3.2 用N-S流程圖來表示算法 6
1.3.3 用電腦語言表示算法 6
1.4 技術解惑 6
第 2章 常用的算法思想 8
(視頻總計51分鐘,實例15個,技術解惑8個)
2.1 枚舉算法思想 9
2.1.1 枚舉算法基礎 9
2.1.2 實戰演練—百錢買百雞 9
2.1.3 實戰演練—解決
“填寫運算符”問題 10
2.2 遞推算法思想 12
2.2.1 遞推算法基礎 12
2.2.2 實踐演練—解決
“斐波那契數列”問題 12
2.2.3 實踐演練—解決
“銀行存款”問題 14
2.3 遞歸算法思想 15
2.3.1 遞歸算法基礎 15
2.3.2 實踐演練—解決“漢諾塔”
問題 16
2.3.3 實踐演練—解決“階乘”
問題 18
2.4 分治算法思想 19
2.4.1 分治算法基礎 19
2.4.2 實踐演練—解決
“大數相乘”問題 19
2.4.3 實踐演練—歐洲冠 軍杯
比賽日程安排 21
2.5 貪心算法思想 23
2.5.1 貪心算法基礎 23
2.5.2 實踐演練—解決“裝箱”
問題 24
2.5.3 實踐演練—解決
“找零方案”問題 26
2.6 試探法算法思想 27
2.6.1 試探法算法基礎 27
2.6.2 實踐演練—解決
“八皇後”問題 28
2.6.3 實踐演練—體彩29選
7彩票組合 29
2.7 迭代算法 30
2.7.1 迭代算法基礎 30
2.7.2 實踐演練—解決
“求平方根”問題 31
2.8 模擬算法思想 32
2.8.1 模擬算法的思路 32
2.8.2 實踐演練—解決
“猜數字游戲”問題 32
2.8.3 實踐演練—解決
“擲骰子游戲”問題 33
2.9 技術解惑 34
2.9.1 衡量算法的標準是什麽 34
2.9.2 在什麽時候選擇使用
枚舉法 36
2.9.3 遞推和遞歸有什麽差異 36
2.9.4 總結分治法能解決什麽
類型的問題 37
2.9.5 分治算法的機理是什麽 37
2.9.6 為什麽說貪婪算法並不是**
優解決問題的方案 37
2.9.7 回溯算法會影響算法
效率嗎 38
2.9.8 遞歸算法與迭代算法
有什麽區別 38
第3章 線性表、隊列和棧 39
(視頻總計35分鐘,實例9個,技術解惑5個)
3.1 線性表詳解 40
3.1.1 線性表的特性 40
3.1.2 順序表操作 41
3.1.3 實踐演練—順序表操作
函數 44
3.1.4 實踐演練—操作順
序表 45
3.1.5 鏈表操作 48
3.1.6 實踐演練—定義鏈表操作
函數 51
3.1.7 實踐演練—操作鏈表 52
3.2 先進先出的隊列詳解 53
3.2.1 什麽是隊列 54
3.2.2 鏈隊列和循環隊列 55
3.2.3 隊列的基本操作 55
3.2.4 隊列的鏈式存儲 55
3.2.5 實踐演練—完整的順序
隊列的操作 56
3.2.6 實踐演練—完整的循環
隊列的操作 57
3.2.7 實踐演練—實現一個
排號程序 59
3.3 後進先出棧 60
3.3.1 什麽是棧 61
3.3.2 棧的基本分類 61
3.3.3 實踐演練—棧操作
函數 63
3.3.4 實踐演練—測試棧
操作 64
3.4 技術解惑 65
3.4.1 線性表插入操作的時間
復雜度是多少 65
3.4.2 線性表刪除操作的時間
復雜度是多少 65
3.4.3 線性表按值查找操作的
時間復雜度是多少 66
3.4.4 線性表鏈接存儲(單鏈表)
操作的11種算法是什麽 66
3.4.5 堆和棧的區別是什麽 70
第4章 樹 71
(視頻總計35分鐘,實例9個,技術解惑5個)
4.1 樹基礎 72
4.1.1 什麽是樹 72
4.1.2 樹的相關概念 72
4.2 二叉樹詳解 73
4.2.1 二叉樹的定義 73
4.2.2 二叉樹的性質 74
4.2.3 二叉樹存儲 75
4.2.4 操作二叉樹 77
4.2.5 遍歷二叉樹 79
4.2.6 線索二叉樹 82
4.2.7 實踐演練—測試二叉樹
操作函數 85
4.2.8 實踐演練—C++的二叉樹
操作 87
4.2.9 實踐演練—實現各種線索
二叉樹的操作 89
4.2.10 實踐演練—測試線索
二叉樹的操作 91
4.3 霍夫曼樹 92
4.3.1 霍夫曼樹基礎 93
4.3.2 實踐演練—實現各種
霍夫曼樹操作 95
4.3.3 實踐演練—測試霍夫曼樹
的操作 97
4.3.4 總結霍夫曼編碼的算法
實現 98
4.4 技術解惑 100
4.4.1 樹和二叉樹的差別是
什麽 100
4.4.2 二叉樹和鏈表的效率誰
更牛 100
4.4.3 如何打印二叉樹中的
所有路徑 100
第5章 圖 101
(視頻總計40分鐘,實例8個,技術解惑4個)
5.1 圖的起源 102
5.2 圖的相關概念 103
5.3 存儲結構 105
5.3.1 表示頂點之間相鄰關系的
鄰接矩陣 106
5.3.2 鄰接表 107
5.3.3 十字鏈表 108
5.3.4 實踐演練—創建一個鄰接
矩陣 109
5.3.5 實踐演練—測試霍夫曼樹
的操作 111
5.4 圖的遍歷 112
5.4.1 深度優先搜索 113
5.4.2 廣度優先搜索 114
5.4.3 實踐演練—求一條包含
圖中所有頂點的簡單
路徑 117
5.4.4 實踐演練—求距v0的
各頂點中**短路徑長度
**長的一個頂點 118
5.4.5 實踐演練—實現圖的
遍歷操作方法 118
5.4.6 實踐演練—實現圖的
遍歷操作 120
5.5 圖的連通性 120
5.5.1 無向圖連通分量 121
5.5.2 **小生成樹 121
5.5.3 實踐演練—創建一個**小
生成樹 123
5.5.4 實踐演練—調用**小生成
樹函數實現操作 123
5.5.5 關鍵路徑 124
5.6 尋求**短路徑 128
5.6.1 求某一頂點到其他各頂點的
**短路徑 128
5.6.2 任意一對頂點間的
**短路 129
5.6.3 實踐演練—創建**短路徑
算法函數 131
5.6.4 實踐演練—調用**短路徑
算法實現測試 132
5.7 技術解惑 132
5.7.1 幾種**短路徑算法的
比較 132
5.7.2 鄰接矩陣與鄰接表的
對比 134
5.7.3 如何表示有向圖的十字鏈表
存儲 135
5.7.4 比較深度優先算法和廣度
優先算法 135
第6章 查找算法 136
(視頻總計37分鐘,實例8個,技術解惑3個)
6.1 幾個相關概念 137
6.2 基於線性表的查找法 137
6.2.1 順序查找法 137
6.2.2 實踐演練—實現順序查找
算法 138
6.2.3 實踐演練—改進的順序
查找算法 139
6.2.4 折半查找法 140
6.2.5 實踐演練—使用折半查找
算法查找數據 140
6.2.6 實踐演練—查找10個已
排好序的數 141
6.2.7 分塊查找法 142
6.3 基於樹的查找法 143
6.3.1 二叉排序樹 143
6.3.2 實踐演練—將數據插入到
二叉樹節點中 147
6.3.3 實踐演練—刪除二叉樹中
一個節點 148
6.3.4 平衡二叉排序樹 150
6.4 哈希法 155
6.4.1 哈希法的基本思想 155
6.4.2 構造哈希函數 155
6.4.3 處理沖突 156
6.4.4 哈希表的查找過程 157
6.5 索引查找 158
6.5.1 索引查找的過程 158
6.5.2 實踐演練—索引查找法
查找指定的關鍵字 158
6.5.3 實踐演練—實現索引查找並插入一個新關鍵字 160
6.6 技術解惑 161
6.6.1 分析查找算法的性能 161
6.6.2 演示對二叉樹的完整
操作 162
6.6.3 分析哈希法的性能 164
第7章 內部排序算法 166
(視頻總計39分鐘,實例10個,技術解惑6個)
7.1 排序基礎 167
7.1.1 排序的目的和過程 167
7.1.2 內部排序與外部排序 167
7.1.3 穩定排序與不穩定排序 167
7.2 插入排序算法 168
7.2.1 直接插入排序 168
7.2.2 實踐演練—編寫直接插入
排序算法 169
7.2.3 實踐演練—插入排序算法
對數據進行排序處理 169
7.2.4 折半插入排序 170
7.2.5 表插入排序 170
7.2.6 希爾排序 171
7.2.7 實踐演練—使用希爾排序
算法對數據進行排序
處理 172
7.2.8 實踐演練—使用希爾排序
處理數組 173
7.3 交換類排序法 174
7.3.1 冒泡排序(相鄰比序法) 174
7.3.2 快速排序 174
7.3.3 實踐演練—用冒泡排序
算法實現對數據的排序
處理 175
7.3.4 實踐演練—使用快速排序
算法 177
7.4 選擇類排序法 178
7.4.1 直接選擇排序 178
7.4.2 樹形選擇排序 179
7.4.3 堆排序 179
7.4.4 實踐演練—直接選擇排序
算法對數據的排序處理 181
7.4.5 實踐演練—堆排序算法
實現排序處理 182
7.5 歸並排序 183
7.5.1 歸並排序思想 183
7.5.2 兩路歸並算法的思路 184
7.5.3 實現歸並排序 185
7.5.4 實踐演練—用歸並算法
實現排序處理 186
7.5.5 實踐演練—使用歸並排序
算法求逆序對 188
7.6 基數排序 189
7.6.1 多關鍵字排序 189
7.6.2 鏈式基數排序 189
7.7 技術解惑 192
7.7.1 插入排序算法的描述是
什麽 192
7.7.2 希爾排序和插入排序誰
更快 192
7.7.3 快速排序的時間耗費是
多少 192
7.7.4 堆排序與直接選擇排序的
區別是什麽 193
7.7.5 歸並排序的效率如何,應該
如何選擇 193
7.7.6 綜合比較各種排序方法 193
第8章 外部排序算法 195
(視頻總計32分鐘)
8.1 外部信息概覽 196
8.1.1 磁帶存儲器 196
8.1.2 磁盤存儲器 197
8.2 外部排序的基本方法 198
8.2.1 磁盤排序 198
8.2.2 磁帶排序 201
8.3 文件的基礎知識 204
8.4 文件組織方式 205
8.4.1 順序文件 205
8.4.2 索引文件 205
8.4.3 ISAM文件 206
8.4.4 VSAM文件 207
8.4.5 散列文件 209
8.4.6 多關鍵字文件 209
第9章 經典的數據結構問題 211
(視頻總計31分鐘,實例5個)
9.1 約瑟夫環 212
9.2 大整數運算 214
9.2.1 數組實現大整數運算 214
9.2.2 鏈表實現大整數運算 220
9.3 電腦進制轉換 224
9.4 中序表達式轉換為後序表達式 227
第 10章 解決數學問題 231
(視頻總計36分鐘,實例12個)
10.1 **大公約數和**小公倍數 232
10.2 哥德巴赫猜想 233
10.3 完全數 235
10.4 親密數 237
10.5 自守數 238
10.6 方程求解 239
10.6.1 用高斯消元法解方程組 239
10.6.2 用二分法解非線性
方程 242
10.6.3 用牛頓迭代法解非線性
方程 243
10.7 矩陣運算 244
10.8 實現n×n整數方陣的轉置 246
10.9 一元多項式運算 247
10.9.1 一元多項式的加法運算 247
10.9.2 一元多項式的減法
運算 250
第 11章 解決趣味問題 257
(視頻總計43分鐘,實例16個)
11.1 歌星大獎賽 258
11.2 借書方案 258
11.3 打魚還是曬網 259
11.4 捕魚和分魚 260
11.5 出售金魚 261
11.6 平分七筐魚 262
11.7 繩子的長度和井深 263
11.8 雞兔同籠 264
11.9 漢諾塔 265
11.9.1 遞歸法 266
11.9.2 非遞歸法 267
11.10 馬踏棋盤 268
11.10.1 使用循環查找法 269
11.10.2 使用遞歸法 271
11.10.3 使用棧方法 272
11.11 三色球問題 275
11.12 新郎和新娘問題 276
11.13 計算年齡 278
第 12章 解決圖像問題 279
(視頻總計31分鐘,實例6個)
12.1 “八皇後”問題 280
12.1.1 使用遞歸法 280
12.1.2 使用循環法 282
12.2 生命游戲 284
12.3 黑白棋問題 287
12.4 “騎士迷宮”問題 293
12.5 找出迷宮問題中的所有路徑 298
第 13章 算法的經典問題 300
(視頻總計36分鐘,實例8個)
13.1 存錢利息**大化 301
13.2 背包問題 303
13.2.1 使用動態規劃法 303
13.2.2 使用遞歸法 307
13.3 農夫過河 309
13.4 三色旗問題 311
13.5 取石子 313
13.6 停車場管理 316
13.7 約瑟夫生死者游戲 323
第 14章 解決奧賽問題 325
(視頻總計55分鐘,實例7個)
14.1 孿生素數問題 326
14.2 百錢買百雞問題 327
14.3 馬克思手稿中的數學題 328
14.4 正整數分解質因數 329
14.5 水仙花數 330
14.6 素數 330
14.6.1 求1000以內的所有
素數 331
14.6.2 求1000以內的迴文
素數 332
14.6.3 求1000以內的平方回
文數 333
14.7 階乘 333
14.7.1 使用遞歸法 334
14.7.2 實現大數的階乘 335
14.8 青蛙過河 339
14.9 過河卒 342
14.10 素數組合 344
14.11 校驗碼問題 346
14.12 老師排座位 347
14.13 模擬立體圖 349
14.14 採藥問題 351
14.15 等價表達式問題 352
14.16 購買年貨問題 355
第 15章 常見算法應用實踐 358
(視頻總計26分鐘,實例7個)
15.1 實現Ping功能中的校驗和
算法 359
15.2 24點游戲算法 363
15.3 洗牌 368
15.4 21點游戲 370
15.5 2048游戲 375
15.6 引用計數算法 386
15.7 貓捉老鼠游戲 388
第 16章 俄羅斯方塊游戲 393
(視頻總計42分鐘,綜合實例1個)
16.1 游戲功能描述 394
16.2 游戲總體設計 394
16.2.1 功能模塊設計 394
16.2.2 數據結構設計 396
16.2.3 構成函數介紹 397
16.3 游戲具體實現 398
16.3.1 預處理 398
16.3.2 主函數—遞歸算法 400
16.3.3 初始化界面處理—
分治算法 401
16.3.4 時鐘中斷處理 402
16.3.5 成績、速度和幫助
處理 403
16.3.6 滿行處理—碰撞檢
測算法 403
16.3.7 方塊顯示和消除處理—
分治算法 405
16.3.8 游戲方塊操作判斷
處理—枚舉算法 406
第 17章 學生成績管理系統 409
(視頻總計36分鐘,綜合實例1個)
17.1 系統總體描述 410
17.1.1 開發目標和項目背景
介紹 410
17.1.2 系統功能模塊 410
17.2 系統總體設計 411
17.2.1 功能模塊設計 411
17.2.2 數據結構設計 413
17.2.3 構成函數介紹 413
17.3 系統具體實現 415
17.3.1 預處理 415
17.3.2 主函數main—
遞歸算法 415
17.3.3 系統主菜單函數—
模擬算法 416
17.3.4 表格顯示信息 417
17.3.5 信息查找定位—
分治算法 417
17.3.6 格式化輸入數據—
遞歸、分治算法 418
17.3.7 增加學生記錄—
試探算法 418
17.3.8 查詢學生記錄—
分治算法 419
17.3.9 刪除學生記錄—分治、
遞歸算法 420
17.3.10 修改學生記錄—遞歸、
模擬算法 421
17.3.11 插入學生記錄—
遞推算法 421
17.3.12 統計學生記錄—
分治算法 423
17.3.13 排序處理—插入排序
算法 423
17.3.14 存儲學生信息 424
第 18章 繪圖板系統 428
(視頻總計42分鐘,綜合實例1個)
18.1 項目規劃分析 429
18.1.1 繪圖板的核心技術 429
18.1.2 功能描述 429
18.1.3 總體設計 429
18.2 設計數據結構 430
18.2.1 設計數據結構 430
18.2.2 規劃系統函數 430
18.3 具體編碼 432
18.3.1 預處理模塊 432
18.3.2 功能控制模塊—遞推、
遞歸算法 434
18.3.3 保存加載模塊—
遞歸算法 435
18.3.4 鼠標控制模塊—枚舉、
遞歸算法 436
18.3.5 圖形繪制模塊—遞歸、
分治、枚舉、遞推
算法 437
18.3.6 主函數模塊—模擬、
遞歸算法 447
18.4 項目調試 451
第 19章 UDP傳輸系統 452
(視頻總計45分鐘,綜合實例1個)
19.1 項目規劃分析 453
19.1.1 功能描述 453
19.1.2 功能模塊設計 453
19.1.3 系統流程圖 454
19.1.4 廣播消息發送流程 454
19.1.5 廣播消息接收流程圖 455
19.1.6 多播消息接收流程圖 456
19.2 設計數據結構 457
19.2.1 定義常量 457
19.2.2 定義全局變量 458
19.3 規劃系統函數 458
19.4 具體編碼 459
19.4.1 預處理 460
19.4.2 初始化模塊處理 460
19.4.3 獲取參數—
枚舉算法 461
19.4.4 用戶幫助模塊—
遞歸算法 462
19.4.5 廣播信息發送模塊—
試探算法 463
19.4.6 廣播信息接收模塊—
試探算法 464
19.4.7 多播功能控制模塊—
試探算法 465
19.4.8 多播消息發送模塊—
試探算法 466
19.4.9 多播消息接收模塊—
試探算法 467
19.4.10 主函數—遞歸
算法 467
19.5 項目調試 468
第 20章 推箱子游戲 469
(視頻總計43分鐘,綜合實例1個)
20.1 項目規劃分析 470
20.1.1 功能描述 470
20.1.2 功能模塊分析 470
20.1.3 剖析執行流程 470
20.2 設計數據結構 472
20.3 規劃系統函數 472
20.4 具體編碼 475
20.4.1 預處理 475
20.4.2 初始化模塊—
遞歸算法 475
20.4.3 畫圖模塊—
試探算法 478
20.4.4 移動箱子模塊—試探、
分治、遞歸、枚舉算法 479
20.4.5 移動小人模塊—枚舉、
試探算法 482
20.4.6 功能控制模塊—遞歸、
分治算法 486
20.4.7 系統主函數—枚舉、
模擬、遞歸、試探算法 487
20.5 項目調試 488