本書是一本綜合講述數(shù)據(jù)結(jié)構(gòu)及其算法的入門書,力求簡潔、清晰、嚴謹且易于學(xué)習(xí)和掌握。
本書從介紹計算思維與程序設(shè)計兩者之間的關(guān)系展開,談到如何培養(yǎng)計算思維的4個部分:分解、模式識別、模式概括與抽象、算法。接著介紹經(jīng)典算法的分類:分治法、遞歸法、動態(tài)規(guī)劃法、迭代法、枚舉法、回溯法及貪心法。學(xué)習(xí)了這些基礎(chǔ)之后,在接下來的各章中分別介紹排序算法、查找算法、數(shù)組與鏈表算法、安全性算法、堆棧與隊列算法、樹結(jié)構(gòu)及其算法和圖結(jié)構(gòu)及其算法,并搭配了C++語言實現(xiàn)的完整范例程序。
本書圖文并茂,敘述簡潔、清晰,范例豐富、可操作性強,適合想學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的初學(xué)者使用,也適合作為高等院校計算機及相關(guān)專業(yè)的教材。
前 言
程序設(shè)計課程著重于計算思維的訓(xùn)練,也就是分析與分解問題能力的培養(yǎng),同時借助程序設(shè)計語言實現(xiàn)具體的算法,從而訓(xùn)練學(xué)生系統(tǒng)化的邏輯思維。C++語言是以C語言為基本的架構(gòu),再導(dǎo)入面向?qū)ο蟮母拍,除了繼承C語言的優(yōu)點外,還保有C語言的兼容性。本書通過豐富的范例程序,在培養(yǎng)讀者養(yǎng)成計算思維習(xí)慣的同時進行算法邏輯的編程訓(xùn)練。
對于第一次接觸計算思維與算法的初學(xué)者來說,使用大量的文字來說明算法邏輯常會造成初學(xué)者的學(xué)習(xí)障礙與挫折感。為了避免教學(xué)和閱讀上的不順暢,書中的算法不以偽代碼來說明,而是采用C++語言來實現(xiàn)這些算法。另外,本書以豐富的圖例和簡潔明了的文字來闡述各種計算思維與算法邏輯,讓初學(xué)者在建立計算思維的同時掌握算法邏輯的運用。
本書從介紹計算思維與程序設(shè)計兩者之間的關(guān)系展開,談到如何培養(yǎng)計算思維的4個部分:分解、模式識別、模式概括與抽象、算法。接著介紹經(jīng)典算法的分類:分治法、遞歸法、動態(tài)規(guī)劃法、迭代法、枚舉法、回溯法及貪心法。學(xué)習(xí)了這些基礎(chǔ)知識之后,在接下來的各章中分別介紹排序算法、查找算法、數(shù)組與鏈表算法、安全性算法、堆棧與隊列算法、樹結(jié)構(gòu)及其算法和圖結(jié)構(gòu)及其算法,并搭配了C++語言實現(xiàn)的完整范例程序。
本書范例程序的源代碼可通過掃描下方二維碼獲。
如果下載有問題,可通過電子郵件聯(lián)系booksaga@126.com,郵件主題為“圖解算法:使用C++范例程序代碼”。
為了檢驗學(xué)習(xí)者的學(xué)習(xí)成果,每一章的最后都安排了與本章重點內(nèi)容相關(guān)的習(xí)題,讓讀者有更多實戰(zhàn)演練計算思維和算法的機會。
最后,希望所有學(xué)習(xí)者通過本書的學(xué)習(xí)都可以培養(yǎng)邏輯思維能力,進而應(yīng)用在自己工作和生活的方方面面。
作者
2020年8月
目 錄
第1章 計算思維與程序設(shè)計 1
1.1 程序設(shè)計的速成攻略 2
1.1.1 計算思維簡介 3
1.1.2 分解 3
1.1.3 模式識別 4
1.1.4 模式概括與抽象 5
1.1.5 算法 5
1.2 生活中到處都是算法 7
1.2.1 算法的條件 7
1.2.2 時間復(fù)雜度O(f(n)) 10
1.3 程序設(shè)計邏輯簡介 11
1.3.1 結(jié)構(gòu)化程序設(shè)計 11
1.3.2 面向?qū)ο蟪绦蛟O(shè)計 12
1.3.3 面向?qū)ο蟪绦蛟O(shè)計的其他概念 15
1.4 C++面向?qū)ο蟮幕?16
1.4.1 C++的面向?qū)ο蠊δ?16
1.4.2 類的基本概念 16
1.4.3 訪問權(quán)限關(guān)鍵詞 18
1.4.4 繼承關(guān)系 18
1.4.5 多態(tài) 19
課后習(xí)題 20
第2章 經(jīng)典算法介紹 22
2.1 分治法 22
2.2 遞歸法 23
2.3 動態(tài)規(guī)劃法 26
2.4 迭代法 28
2.5 枚舉法 31
2.6 回溯法 37
2.7 貪心法 43
課后習(xí)題 44
第3章 走入數(shù)據(jù)結(jié)構(gòu)的奇妙世界 45
3.1 認識數(shù)據(jù)結(jié)構(gòu) 46
3.2 常見的數(shù)據(jù)結(jié)構(gòu) 48
3.2.1 數(shù)組 48
3.2.2 鏈表 51
3.2.3 堆棧 52
3.2.4 隊列 53
3.3 樹結(jié)構(gòu) 54
3.3.1 樹的基本概念 55
3.3.2 二叉樹 56
3.4 圖論簡介 58
3.5 哈希表 60
課后習(xí)題 61
第4章 排序算法 62
4.1 認識排序 63
4.2 冒泡排序法 65
4.3 選擇排序法 69
4.4 插入排序法 72
4.5 希爾排序法 74
4.6 快速排序法 77
4.7 合并排序法 81
4.8 基數(shù)排序法 84
4.9 堆積樹排序法 87
課后習(xí)題 94
第5章 查找算法 95
5.1 常見的查找算法 95
5.2 順序查找法 96
5.3 二分查找法 98
5.4 插值查找法 101
5.5 斐波那契查找法 103
課后習(xí)題 107
第6章 數(shù)組與鏈表算法 108
6.1 矩陣算法與深度學(xué)習(xí) 108
6.1.1 矩陣相加 111
6.1.2 矩陣相乘 112
6.1.3 轉(zhuǎn)置矩陣 115
6.1.4 稀疏矩陣 116
6.2 數(shù)組與多項式 119
6.3 單向鏈表算法 121
6.3.1 單向鏈表插入節(jié)點的算法 124
6.3.2 單向鏈表刪除節(jié)點的算法 129
6.3.3 對單向鏈表進行反轉(zhuǎn)的算法 133
6.3.4 單向鏈表串接的算法 136
6.4 鏈表與多項式 139
課后習(xí)題 144
第7章 安全性算法 145
7.1 數(shù)據(jù)加密 146
7.1.1 對稱密鑰加密系統(tǒng) 147
7.1.2 非對稱密鑰加密系統(tǒng)與RSA算法 147
7.1.3 認證 148
7.1.4 數(shù)字簽名 149
7.2 哈希算法 150
7.2.1 除留余數(shù)法 150
7.2.2 平方取中法 151
7.2.3 折疊法 152
7.2.4 數(shù)字分析法 153
7.3 碰撞與溢出處理 153
7.3.1 線性探測法 153
7.3.2 平方探測法 155
7.3.3 再哈希法 156
7.3.4 鏈表 157
課后習(xí)題 162
第8章 堆棧與隊列算法 163
8.1 以數(shù)組來實現(xiàn)堆棧 163
8.2 以鏈表來實現(xiàn)堆棧 168
8.3 漢諾塔問題的求解算法 170
8.4 八皇后問題的求解算法 175
8.5 用數(shù)組來實現(xiàn)隊列 178
8.6 用鏈表來實現(xiàn)隊列 181
8.7 雙向隊列 183
8.8 優(yōu)先隊列 187
課后習(xí)題 188
第9章 樹結(jié)構(gòu)及其算法 189
9.1 用數(shù)組來實現(xiàn)二叉樹 190
9.2 用鏈表來實現(xiàn)二叉樹 193
9.3 二叉樹遍歷 195
9.4 二叉查找樹 201
9.5 二叉樹節(jié)點的插入 204
9.6 二叉樹節(jié)點的刪除 206
9.7 二叉運算樹 208
9.8 二叉排序樹 213
9.9 線索二叉樹 215
9.10 擴充二叉樹 220
9.11 哈夫曼樹 222
9.12 平衡樹 223
9.13 博弈樹 225
課后習(xí)題 226
第10章 圖結(jié)構(gòu)及其算法 228
10.1 圖的數(shù)據(jù)表示法 228
10.1.1 鄰接矩陣法 229
10.1.2 鄰接鏈表法 230
10.1.3 鄰接復(fù)合鏈表法 232
10.1.4 索引表格法 233
10.2 圖的遍歷 233
10.2.1 深度優(yōu)先遍歷法 234
10.2.2 廣度優(yōu)先遍歷法 237
10.3 生成樹 241
10.3.1 深度優(yōu)先生成樹和廣度優(yōu)先生成樹 241
10.3.2 最小成本生成樹 242
10.3.3 Prim算法 243
10.3.4 Kruskal算法 246
10.4 圖的最短路徑法 250
10.4.1 Dijkstra算法與A*算法 251
10.4.2 Floyd算法 258
課后習(xí)題 262
附錄A 課后習(xí)題與解答 265