本書采用豐富的圖例來闡述基本概念,并以簡潔清晰的語言來詮釋重要的理論和算法,同時配合完整的范例程序代碼,使讀者可以通過實例 實踐來熟悉數(shù)據(jù)結(jié)構(gòu)。
本書內(nèi)容共9章,先從基本的數(shù)據(jù)結(jié)構(gòu)概念開始介紹,再以Python語言來實現(xiàn)數(shù)組、堆棧、鏈表、隊列、樹、圖、排序、查找等重要的數(shù)據(jù)結(jié)構(gòu)。在附錄A提供了Python語言的快速入門,附錄B是使用Python語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)程序時調(diào)試經(jīng)驗的分享,附錄C則提供了所有課后習(xí)題的答案。
本書以圖解的方式詮釋數(shù)據(jù)結(jié)構(gòu)復(fù)雜的概念。以熱門的Python語言來實現(xiàn)如下數(shù)據(jù)結(jié)構(gòu)及其算法:數(shù)組、堆棧、鏈表、隊列、樹、圖、排序、查找等。每章都有范例,用于詳解完整的算法及程序執(zhí)行過程,讀者可按照個人學(xué)習(xí)進(jìn)度進(jìn)行練習(xí)和實踐。此外,本書提供了大量符合各章教學(xué)內(nèi)容的習(xí)題,供讀者隨時檢驗自己的學(xué)習(xí)成果。附錄提供了Python語言的快速入門指南以及使用Python語言編寫范例時調(diào)試程序的經(jīng)驗和技巧。
現(xiàn)在無人不談大數(shù)據(jù)技術(shù)和人工智能技術(shù),而商業(yè)智能和機器學(xué)習(xí)等應(yīng)用的具體開發(fā)中又大量使用Python這門排名已經(jīng)上升到第5位的程序設(shè)計語言。另外,已經(jīng)有越來越多的大專院校采用Python語言來教授計算機程序設(shè)計課程,因而用Python語言來描述算法和講述數(shù)據(jù)結(jié)構(gòu)就成為順其自然的事情了。
數(shù)據(jù)結(jié)構(gòu)毫無疑問是計算機科學(xué)既經(jīng)典又核心的課程之一,只要從事計算機相關(guān)的開發(fā)工作,系統(tǒng)地學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是進(jìn)入這個行業(yè)的開山斧。數(shù)據(jù)結(jié)構(gòu)不僅講授數(shù)據(jù)的結(jié)構(gòu)以及在計算機內(nèi)存儲和組織數(shù)據(jù)的方式,它背后真正蘊含的是與之息息相關(guān)的算法,精心選擇的數(shù)據(jù)結(jié)構(gòu)配合恰如其分的算法就意味著數(shù)據(jù)或者信息在計算機內(nèi)被高效率地存儲和處理。算法其實就是數(shù)據(jù)結(jié)構(gòu)的靈魂,它既神秘又神奇好玩,可以說是聰明人在計算機上的游戲。
《圖解數(shù)據(jù)結(jié)構(gòu):使用Python》是一本綜合且全面講述數(shù)據(jù)結(jié)構(gòu)及其算法分析的教科書,為了便于高校的教學(xué)或者讀者自學(xué),作者在描述數(shù)據(jù)結(jié)構(gòu)原理和算法時文字清晰而嚴(yán)謹(jǐn),為每個算法及其數(shù)據(jù)結(jié)構(gòu)提供了演算的詳細(xì)圖解。另外,為了適合在教學(xué)中讓學(xué)生上機實踐或者自學(xué)者上機操練,本書為每個經(jīng)典的算法都提供了Python語言編寫的完整范例程序(包含完整的源代碼),每個范例程序都經(jīng)過了測試和調(diào)試,可以直接在標(biāo)準(zhǔn)的Python解釋器中運行,目的就是讓本書的學(xué)習(xí)者以這些范例程序作為參照,迅速掌握數(shù)據(jù)結(jié)構(gòu)和算法的要點。
學(xué)習(xí)《圖解數(shù)據(jù)結(jié)構(gòu):使用Python》需要有面向?qū)ο蟪绦蛟O(shè)計語言的基礎(chǔ),如果讀者沒有學(xué)習(xí)過任何面向?qū)ο蟮某绦蛟O(shè)計語言,那么建議讀者先學(xué)習(xí)一下Python語言再來學(xué)習(xí)本書。如果讀者已經(jīng)掌握了Java、C 、C#等任何一種面向?qū)ο蟮某绦蛟O(shè)計語言,而沒有學(xué)習(xí)過Python語言,只需快速瀏覽一下附錄APython語言快速入門,即可開始本書的學(xué)習(xí)。關(guān)于Python運行環(huán)境的簡單說明也在附錄A中講解,當(dāng)然讀者也可以從https://www.python.org/網(wǎng)站中下載適合自己的計算機及其操作系統(tǒng)的Python
版本,再安裝和設(shè)置好Python運行環(huán)境。
為了方便教學(xué)和讀者自學(xué),《圖解數(shù)據(jù)結(jié)構(gòu):使用Python》每章的最后都提供了豐富的課后習(xí)題,同時在整本書的附錄C也提供了所有課后習(xí)題的詳細(xì)解答,供讀者參考對照。
資深架構(gòu)師
趙軍
2018年1月
現(xiàn)任榮欽科技股份有限公司執(zhí)行長,美國Rochester Institute of Technology計算機科學(xué)研究所畢業(yè),長期從事信息教育及計算機圖書寫作的工作,計算機圖書著作包括計算器概論、數(shù)據(jù)結(jié)構(gòu)、辦公室電子數(shù)據(jù)處理、互聯(lián)網(wǎng)等相關(guān)題材,并監(jiān)制過多套游戲以及教學(xué)軟件的研發(fā)。
目 錄
第1章 數(shù)據(jù)結(jié)構(gòu)導(dǎo)論 1
1.1 數(shù)據(jù)結(jié)構(gòu)的定義 2
1.1.1
數(shù)據(jù)與信息 2
1.1.2
數(shù)據(jù)的特性 3
1.1.3
數(shù)據(jù)結(jié)構(gòu)的應(yīng)用 3
1.2 算法 5
1.3 認(rèn)識程序設(shè)計 7
1.3.1
程序開發(fā)流程 8
1.3.2
結(jié)構(gòu)化程序設(shè)計 8
1.3.3
面向?qū)ο蟪绦蛟O(shè)計 9
1.4 算法性能分析 11
1.4.1
Big-Oh 12
1.4.2
15
1.4.3
15
【課后習(xí)題】 15
第2章 數(shù)組結(jié)構(gòu) 17
2.1 線性表簡介 18
2.2 認(rèn)識數(shù)組 19
2.2.1
二維數(shù)組 21
2.2.2
三維數(shù)組 25
2.2.3
n維數(shù)組 27
2.3 矩陣 28
2.3.1
矩陣相加 28
2.3.2
矩陣相乘 29
2.3.3
轉(zhuǎn)置矩陣 31
2.3.4
稀疏矩陣 32
2.3.5
上三角形矩陣 35
2.3.6
下三角形矩陣 39
2.3.7
帶狀矩陣 43
2.4 數(shù)組與多項式 44
【課后習(xí)題】 46
第3章 鏈表 48
3.1 單向鏈表 49
3.1.1
建立單向鏈表 50
3.1.2
遍歷單向鏈表 51
3.1.3
在單向鏈表中插入新節(jié)點 53
3.1.4
在單向鏈表中刪除節(jié)點 58
3.1.5
單向鏈表的反轉(zhuǎn) 61
3.1.6
單向鏈表的連接功能 64
3.1.7
多項式鏈表表示法 69
3.2 環(huán)形鏈表 71
3.2.1
環(huán)形鏈表的建立與遍歷 72
3.2.2
在環(huán)形鏈表中插入新節(jié)點 74
3.2.3
在環(huán)形鏈表中刪除節(jié)點 78
3.2.4
環(huán)形鏈表的連接功能 82
3.2.5
環(huán)形鏈表與稀疏矩陣表示法 85
3.3 雙向鏈表 86
3.3.1
雙向鏈表的建立與遍歷 87
3.3.2
在雙向鏈表中插入新節(jié)點 91
3.3.3
在雙向鏈表中刪除節(jié)點 95
【課后習(xí)題】 99
第4章 堆棧 101
4.1 堆棧簡介 102
4.1.1
用列表實現(xiàn)堆棧 103
4.1.2
用鏈表實現(xiàn)堆棧 107
4.2 堆棧的應(yīng)用 110
4.2.1
遞歸算法 111
4.2.2
漢諾塔問題 115
4.2.3
老鼠走迷宮 120
4.2.4
八皇后問題 125
4.3 算術(shù)表達(dá)式的表示法 128
4.3.1
中序法轉(zhuǎn)為前序法與后序法 129
4.3.2
前序法與后序法轉(zhuǎn)為中序法 135
4.3.3
中序法表達(dá)式的求值運算 137
4.3.4
前序法表達(dá)式的求值運算 138
4.3.5
后序法表達(dá)式的求值運算 139
【課后習(xí)題】 140
第5章 隊列 143
5.1 認(rèn)識隊列 144
5.1.1
隊列的基本操作 144
5.1.2
用數(shù)組實現(xiàn)隊列 145
5.1.3
用鏈表實現(xiàn)隊列 148
5.2 隊列的應(yīng)用 151
5.2.1
環(huán)形隊列 151
5.2.2
雙向隊列 155
5.2.3
優(yōu)先隊列 159
【課后習(xí)題】 160
第6章 樹形結(jié)構(gòu) 161
6.1 樹的基本概念 162
6.2 二叉樹簡介 164
6.2.1
二叉樹的定義 165
6.2.2
特殊二叉樹簡介 166
6.3 二叉樹的存儲方式 167
6.3.1
一維數(shù)組表示法 167
6.3.2
鏈表表示法 170
6.4 二叉樹遍歷 172
6.4.1
中序遍歷 173
6.4.2
后序遍歷 173
6.4.3
前序遍歷 173
6.4.4
二叉樹節(jié)點的插入與刪除 178
6.4.5
二叉運算樹 184
6.5 線索二叉樹 189
6.6 樹的二叉樹表示法 195
6.6.1
樹轉(zhuǎn)化為二叉樹 195
6.6.2
二叉樹轉(zhuǎn)換成樹 196
6.6.3
森林轉(zhuǎn)換為二叉樹 197
6.6.4
二叉樹轉(zhuǎn)換成森林 198
6.6.5
樹與森林的遍歷 199
6.6.6
確定唯一二叉樹 201
6.7 優(yōu)化二叉查找樹 202
6.7.1
擴充二叉樹 202
6.7.2
霍夫曼樹 204
6.7.3
平衡樹 205
6.8
B樹 210
【課后習(xí)題】 212
第7章 圖形結(jié)構(gòu) 216
7.1 圖形簡介 217
7.1.1
歐拉環(huán)與歐拉鏈 217
7.1.2
圖形的定義 218
7.1.3
無向圖 218
7.1.4
有向圖 219
7.2 圖的數(shù)據(jù)表示法 220
7.2.1
鄰接矩陣法 220
7.2.2
鄰接表法 224
7.2.3
鄰接復(fù)合鏈表法 226
7.2.4
索引表格法 228
7.3 圖的遍歷 230
7.3.1
深度優(yōu)先遍歷法 230
7.3.2
廣度優(yōu)先遍歷法 233
7.4 生成樹 237
7.4.1
DFS生成樹和BFS生成樹 238
7.4.2
最小生成樹 239
7.4.3
Kruskal算法 239
7.5 圖的最短路徑 244
7.5.1
單點對全部頂點 244
7.5.2
兩兩頂點間的最短路徑 248
7.6
AOV網(wǎng)絡(luò)與拓?fù)渑判?251
7.7
AOE網(wǎng)絡(luò) 253
【課后習(xí)題】 255
第8章 排序 259
8.1 排序簡介 260
8.1.1
排序的分類 261
8.1.2
排序算法的分析 261
8.2 內(nèi)部排序法 262
8.2.1
冒泡排序法 262
8.2.2
選擇排序法 266
8.2.3
插入排序法 268
8.2.4
希爾排序法 270
8.2.5
合并排序法 272
8.2.6
快速排序法 275
8.2.7
堆積排序法 278
8.2.8
基數(shù)排序法 283
【課后習(xí)題】 286
第9章 查找 289
9.1 常見的查找方法 290
9.1.1
順序查找法 290
9.1.2
二分查找法 292
9.1.3
插值查找法 294
9.1.4
斐波拉契查找法 296
9.2 哈希查找法 300
9.3 常見的哈希函數(shù) 302
9.3.1
除留余數(shù)法 302
9.3.2
平方取中法 303
9.3.3
折疊法 303
9.3.4
數(shù)字分析法 304
9.4 碰撞與溢出問題的處理 305
9.4.1
線性探測法 305
9.4.2
平方探測法 307
9.4.3
再哈希法 307
9.4.4
鏈表法 307
【課后習(xí)題】 313
附錄A Python語言快速入門 315
A.1 輕松學(xué)Python程序 316
A.2 基本數(shù)據(jù)處理 317
A.2.1
數(shù)值數(shù)據(jù)類型 317
A.2.2
布爾數(shù)據(jù)類型 317
A.2.3
字符串?dāng)?shù)據(jù)類型 318
A.3 輸入input和輸出print 318
A.3.1
輸出print 318
A.3.2
輸出轉(zhuǎn)義字符 319
A.3.3
輸入input 319
A.4 運算符與表達(dá)式 321
A.4.1
算術(shù)運算符 321
A.4.2
復(fù)合賦值運算符 321
A.4.3
關(guān)系運算符 321
A.4.4
邏輯運算符 322
A.4.5
位運算符 322
A.5 流程控制 323
A.5.1
if語句 323
A.5.2
for循環(huán) 324
A.5.3
while循環(huán) 325
A.6 其他常用的類型 327
A.6.1
string字符串 327
A.6.2
list列表 329
A.6.3
tuple 元組和dict字典 331
A.7 函數(shù) 332
A.7.1
自定義無參數(shù)函數(shù) 332
A.7.2
有參數(shù)行的函數(shù) 333
A.7.3
函數(shù)返回值 333
A.7.4
參數(shù)傳遞 333
附錄B 數(shù)據(jù)結(jié)構(gòu)使用Python程序調(diào)試實錄 336
附錄C 課后習(xí)題與答案 352