本書是一本綜合講述數(shù)據(jù)結(jié)構(gòu)及其算法的入門書,力求簡(jiǎn)潔、清晰、嚴(yán)謹(jǐn)且易于學(xué)習(xí)和掌握。
本書從介紹計(jì)算思維與程序設(shè)計(jì)兩者之間的關(guān)系展開,談到如何培養(yǎng)計(jì)算思維的4個(gè)部分:分解、模式識(shí)別、模式概括與抽象、算法。接著介紹經(jīng)典算法的分類:分治法、遞歸法、動(dòng)態(tài)規(guī)劃法、迭代法、枚舉法、回溯法及貪心法。學(xué)習(xí)了這些基礎(chǔ)之后,在接下來的各章中分別介紹排序算法、查找算法、數(shù)組與鏈表算法、安全性算法、堆棧與隊(duì)列算法、樹結(jié)構(gòu)及其算法和圖結(jié)構(gòu)及其算法,并搭配了C++語言實(shí)現(xiàn)的完整范例程序。
本書圖文并茂,敘述簡(jiǎn)潔、清晰,范例豐富、可操作性強(qiáng),適合想學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的初學(xué)者使用,也適合作為高等院校計(jì)算機(jī)及相關(guān)專業(yè)的教材。
前 言
程序設(shè)計(jì)課程著重于計(jì)算思維的訓(xùn)練,也就是分析與分解問題能力的培養(yǎng),同時(shí)借助程序設(shè)計(jì)語言實(shí)現(xiàn)具體的算法,從而訓(xùn)練學(xué)生系統(tǒng)化的邏輯思維。C++語言是以C語言為基本的架構(gòu),再導(dǎo)入面向?qū)ο蟮母拍,除了繼承C語言的優(yōu)點(diǎn)外,還保有C語言的兼容性。本書通過豐富的范例程序,在培養(yǎng)讀者養(yǎng)成計(jì)算思維習(xí)慣的同時(shí)進(jìn)行算法邏輯的編程訓(xùn)練。
對(duì)于第一次接觸計(jì)算思維與算法的初學(xué)者來說,使用大量的文字來說明算法邏輯常會(huì)造成初學(xué)者的學(xué)習(xí)障礙與挫折感。為了避免教學(xué)和閱讀上的不順暢,書中的算法不以偽代碼來說明,而是采用C++語言來實(shí)現(xiàn)這些算法。另外,本書以豐富的圖例和簡(jiǎn)潔明了的文字來闡述各種計(jì)算思維與算法邏輯,讓初學(xué)者在建立計(jì)算思維的同時(shí)掌握算法邏輯的運(yùn)用。
本書從介紹計(jì)算思維與程序設(shè)計(jì)兩者之間的關(guān)系展開,談到如何培養(yǎng)計(jì)算思維的4個(gè)部分:分解、模式識(shí)別、模式概括與抽象、算法。接著介紹經(jīng)典算法的分類:分治法、遞歸法、動(dòng)態(tài)規(guī)劃法、迭代法、枚舉法、回溯法及貪心法。學(xué)習(xí)了這些基礎(chǔ)知識(shí)之后,在接下來的各章中分別介紹排序算法、查找算法、數(shù)組與鏈表算法、安全性算法、堆棧與隊(duì)列算法、樹結(jié)構(gòu)及其算法和圖結(jié)構(gòu)及其算法,并搭配了C++語言實(shí)現(xiàn)的完整范例程序。
本書范例程序的源代碼可通過掃描下方二維碼獲。
如果下載有問題,可通過電子郵件聯(lián)系booksaga@126.com,郵件主題為“圖解算法:使用C++范例程序代碼”。
為了檢驗(yàn)學(xué)習(xí)者的學(xué)習(xí)成果,每一章的最后都安排了與本章重點(diǎn)內(nèi)容相關(guān)的習(xí)題,讓讀者有更多實(shí)戰(zhàn)演練計(jì)算思維和算法的機(jī)會(huì)。
最后,希望所有學(xué)習(xí)者通過本書的學(xué)習(xí)都可以培養(yǎng)邏輯思維能力,進(jìn)而應(yīng)用在自己工作和生活的方方面面。
作者
2020年8月
目 錄
第1章 計(jì)算思維與程序設(shè)計(jì) 1
1.1 程序設(shè)計(jì)的速成攻略 2
1.1.1 計(jì)算思維簡(jiǎn)介 3
1.1.2 分解 3
1.1.3 模式識(shí)別 4
1.1.4 模式概括與抽象 5
1.1.5 算法 5
1.2 生活中到處都是算法 7
1.2.1 算法的條件 7
1.2.2 時(shí)間復(fù)雜度O(f(n)) 10
1.3 程序設(shè)計(jì)邏輯簡(jiǎn)介 11
1.3.1 結(jié)構(gòu)化程序設(shè)計(jì) 11
1.3.2 面向?qū)ο蟪绦蛟O(shè)計(jì) 12
1.3.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的其他概念 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 動(dòng)態(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 認(rèn)識(shí)數(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 隊(duì)列 53
3.3 樹結(jié)構(gòu) 54
3.3.1 樹的基本概念 55
3.3.2 二叉樹 56
3.4 圖論簡(jiǎn)介 58
3.5 哈希表 60
課后習(xí)題 61
第4章 排序算法 62
4.1 認(rèn)識(shí)排序 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ù)組與多項(xiàng)式 119
6.3 單向鏈表算法 121
6.3.1 單向鏈表插入節(jié)點(diǎn)的算法 124
6.3.2 單向鏈表刪除節(jié)點(diǎn)的算法 129
6.3.3 對(duì)單向鏈表進(jìn)行反轉(zhuǎn)的算法 133
6.3.4 單向鏈表串接的算法 136
6.4 鏈表與多項(xiàng)式 139
課后習(xí)題 144
第7章 安全性算法 145
7.1 數(shù)據(jù)加密 146
7.1.1 對(duì)稱密鑰加密系統(tǒng) 147
7.1.2 非對(duì)稱密鑰加密系統(tǒng)與RSA算法 147
7.1.3 認(rèn)證 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 線性探測(cè)法 153
7.3.2 平方探測(cè)法 155
7.3.3 再哈希法 156
7.3.4 鏈表 157
課后習(xí)題 162
第8章 堆棧與隊(duì)列算法 163
8.1 以數(shù)組來實(shí)現(xiàn)堆棧 163
8.2 以鏈表來實(shí)現(xiàn)堆棧 168
8.3 漢諾塔問題的求解算法 170
8.4 八皇后問題的求解算法 175
8.5 用數(shù)組來實(shí)現(xiàn)隊(duì)列 178
8.6 用鏈表來實(shí)現(xiàn)隊(duì)列 181
8.7 雙向隊(duì)列 183
8.8 優(yōu)先隊(duì)列 187
課后習(xí)題 188
第9章 樹結(jié)構(gòu)及其算法 189
9.1 用數(shù)組來實(shí)現(xiàn)二叉樹 190
9.2 用鏈表來實(shí)現(xiàn)二叉樹 193
9.3 二叉樹遍歷 195
9.4 二叉查找樹 201
9.5 二叉樹節(jié)點(diǎn)的插入 204
9.6 二叉樹節(jié)點(diǎn)的刪除 206
9.7 二叉運(yùn)算樹 208
9.8 二叉排序樹 213
9.9 線索二叉樹 215
9.10 擴(kuò)充二叉樹 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