本書是一本綜合講述數(shù)據(jù)結構及其算法的入門書,力求簡潔、清晰、嚴謹且易于學習和掌握。
本書從介紹計算思維與程序設計兩者之間的關系展開,談到如何培養(yǎng)計算思維的4個部分:分解、模式識別、模式概括與抽象、算法。接著介紹經(jīng)典算法的分類:分治法、遞歸法、動態(tài)規(guī)劃法、迭代法、枚舉法、回溯法及貪心法。學習了這些基礎之后,在接下來的各章中分別介紹排序算法、查找算法、數(shù)組與鏈表算法、安全性算法、堆棧與隊列算法、樹結構及其算法和圖結構及其算法,并搭配了C++語言實現(xiàn)的完整范例程序。
本書圖文并茂,敘述簡潔、清晰,范例豐富、可操作性強,適合想學習數(shù)據(jù)結構和算法的初學者使用,也適合作為高等院校計算機及相關專業(yè)的教材。
前 言
程序設計課程著重于計算思維的訓練,也就是分析與分解問題能力的培養(yǎng),同時借助程序設計語言實現(xiàn)具體的算法,從而訓練學生系統(tǒng)化的邏輯思維。C++語言是以C語言為基本的架構,再導入面向對象的概念,除了繼承C語言的優(yōu)點外,還保有C語言的兼容性。本書通過豐富的范例程序,在培養(yǎng)讀者養(yǎng)成計算思維習慣的同時進行算法邏輯的編程訓練。
對于第一次接觸計算思維與算法的初學者來說,使用大量的文字來說明算法邏輯常會造成初學者的學習障礙與挫折感。為了避免教學和閱讀上的不順暢,書中的算法不以偽代碼來說明,而是采用C++語言來實現(xiàn)這些算法。另外,本書以豐富的圖例和簡潔明了的文字來闡述各種計算思維與算法邏輯,讓初學者在建立計算思維的同時掌握算法邏輯的運用。
本書從介紹計算思維與程序設計兩者之間的關系展開,談到如何培養(yǎng)計算思維的4個部分:分解、模式識別、模式概括與抽象、算法。接著介紹經(jīng)典算法的分類:分治法、遞歸法、動態(tài)規(guī)劃法、迭代法、枚舉法、回溯法及貪心法。學習了這些基礎知識之后,在接下來的各章中分別介紹排序算法、查找算法、數(shù)組與鏈表算法、安全性算法、堆棧與隊列算法、樹結構及其算法和圖結構及其算法,并搭配了C++語言實現(xiàn)的完整范例程序。
本書范例程序的源代碼可通過掃描下方二維碼獲。
如果下載有問題,可通過電子郵件聯(lián)系booksaga@126.com,郵件主題為“圖解算法:使用C++范例程序代碼”。
為了檢驗學習者的學習成果,每一章的最后都安排了與本章重點內容相關的習題,讓讀者有更多實戰(zhàn)演練計算思維和算法的機會。
最后,希望所有學習者通過本書的學習都可以培養(yǎng)邏輯思維能力,進而應用在自己工作和生活的方方面面。
作者
2020年8月
吳燦銘,現(xiàn)任榮欽科技股份有限公司執(zhí)行長,美國Rochester Institute of Technology計算機科學研究所畢業(yè),長期從事信息教育及計算機圖書寫作的工作,計算機圖書著作包括計算器概論、數(shù)據(jù)結構、辦公室電子數(shù)據(jù)處理、互聯(lián)網(wǎng)等相關題材,并監(jiān)制過多套游戲以及教學軟件的研發(fā)。
目 錄
第1章 計算思維與程序設計 1
1.1 程序設計的速成攻略 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 時間復雜度O(f(n)) 10
1.3 程序設計邏輯簡介 11
1.3.1 結構化程序設計 11
1.3.2 面向對象程序設計 12
1.3.3 面向對象程序設計的其他概念 15
1.4 C++面向對象的基因 16
1.4.1 C++的面向對象功能 16
1.4.2 類的基本概念 16
1.4.3 訪問權限關鍵詞 18
1.4.4 繼承關系 18
1.4.5 多態(tài) 19
課后習題 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
課后習題 44
第3章 走入數(shù)據(jù)結構的奇妙世界 45
3.1 認識數(shù)據(jù)結構 46
3.2 常見的數(shù)據(jù)結構 48
3.2.1 數(shù)組 48
3.2.2 鏈表 51
3.2.3 堆棧 52
3.2.4 隊列 53
3.3 樹結構 54
3.3.1 樹的基本概念 55
3.3.2 二叉樹 56
3.4 圖論簡介 58
3.5 哈希表 60
課后習題 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
課后習題 94
第5章 查找算法 95
5.1 常見的查找算法 95
5.2 順序查找法 96
5.3 二分查找法 98
5.4 插值查找法 101
5.5 斐波那契查找法 103
課后習題 107
第6章 數(shù)組與鏈表算法 108
6.1 矩陣算法與深度學習 108
6.1.1 矩陣相加 111
6.1.2 矩陣相乘 112
6.1.3 轉置矩陣 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 對單向鏈表進行反轉的算法 133
6.3.4 單向鏈表串接的算法 136
6.4 鏈表與多項式 139
課后習題 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
課后習題 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
課后習題 188
第9章 樹結構及其算法 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
課后習題 226
第10章 圖結構及其算法 228
10.1 圖的數(shù)據(jù)表示法 228
10.1.1 鄰接矩陣法 229
10.1.2 鄰接鏈表法 230
10.1.3 鄰接復合鏈表法 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
課后習題 262
附錄A 課后習題與解答 265