數據結構基礎及實踐
郭煒
商品描述
"本書內容全面、細致、通俗易懂,涵蓋線性表、棧和隊列、樹和二叉樹、堆、哈夫曼樹、並查集、AVL樹、紅黑樹、B樹和B+樹、串、圖、散列表等數據結構,以及遞歸、分治、深搜、廣搜、最短路、最小生成樹、拓撲排序、關鍵路徑、內外排序等算法。 對各類數據結構和算法,不但要掌握理論,還應熟練地編程實現。本書的**特點是高標準的實踐性。除了少數幾個特別復雜的數據結構,95%的數據結構和算法都給出了完整可運行的代碼,一共100多份,並且這些代碼幾乎都出現在具體的例題中。 本書的例題和編程習題,都可以在北京大學在線程序評測平臺OpenJudge上提交解題程序並自動評判對錯。 本書內容和習題按難度做了明確分級,因此不論是電腦專業還是非電腦專業的師生,都可以從中各取所需用於教學。本書既可以用作高等學校數據結構和算法的入門教材,也可以作為考研、找工作面試的秘籍,還可以用於程序設計競賽的基礎培訓。 "
目錄大綱
目錄
第1章緒論1
1.1算法和算法分析1
1.1.1什麽是算法1
1.1.2算法的時間復雜度及其表示法3
1.2數據結構6
1.2.1數據的邏輯結構6
1.2.2數據的存儲結構7
1.2.3數據結構上的操作7
小結8
習題8
第2章Java語言鞏固與提高10
2.1接口和多態10
2.2內部類和內部接口12
2.3匿名類、Lambda表達式和函數式接口13
2.4泛型16
2.4.1泛型的概念和作用16
2.4.2泛型類、泛型接口和泛型函數17
2.4.3泛型數組22
2.5迭代器22
第3章線性表25
3.1順序表25
3.1.1順序表的概念和操作25
3.1.2Java中的順序表28
3.2鏈表28
3.2.1單鏈表29
3.2.2循環單鏈表32
3.2.3雙鏈表33
3.2.4靜態鏈表36
★★3.2.5Java中的鏈表37
3.3順序表和鏈表的選擇39
小結40
習題40
第4章數組和矩陣42
4.1數組42
4.2特殊矩陣的壓縮存儲45
4.3小結47
4.4習題47
第5章遞歸和分治49
5.1用遞歸進行枚舉50
5.1.1案例: N皇後問題(P0230)50
5.1.2案例: 全排列(P0240)52
5.2解決用遞歸形式定義的問題54
5.2.1案例: 波蘭表達式(P0250)55
★★5.2.2案例: 繪制雪花曲線56
5.3用遞歸進行問題分解58
5.3.1案例: 上臺階(P0260)58
5.3.2案例: 數字三角形(P0265)60
5.3.3案例: 算24(P0270)61
5.4分治63
5.4.1案例: 漢諾塔問題(P0310)63
5.4.2案例: 快速冪64
小結65
習題65
第6章棧和隊列67
6.1棧67
6.1.1棧的概念和Java中的棧67
6.1.2案例: 括號配對(P0410)68
6.1.3案例: 後序表達式求值(P0420)69
★6.1.4案例: 四則運算表達式求值(P0440)71
6.1.5案例: 合法出棧序列(P0450)73
★★6.2棧和遞歸的關系75
6.3隊列76
6.3.1基本實現76
6.3.2循環隊列77
6.3.3Java中的隊列80
★6.3.4案例: 用兩個棧模擬一個隊列81
★★6.3.5案例: 滑動窗口(P0460)82
6.4用鏈表實現棧和隊列84
小結84
習題85
第7章二叉樹87
7.1二叉樹的概念87
7.2二叉樹的性質89
7.3二叉樹的表示91
7.3.1用類表示二叉樹91
7.3.2完全二叉樹的表示92
7.4二叉樹的遍歷92
7.4.1二叉樹的前序、後序、中序和按層次遍歷92
7.4.2案例: 根據二叉樹前中序序列建樹(P0570)95
★7.4.3案例: 求二叉樹的寬度(P0630)97
7.4.4案例: 擴展二叉樹 (P0700)99
★7.4.5非遞歸方式遍歷二叉樹100
★7.5線索二叉樹101
7.6堆104
7.6.1堆的概念104
7.6.2堆的操作105
7.6.3建堆107
7.6.4堆的實現和優先隊列107
7.7哈夫曼樹110
7.7.1哈夫曼樹的概念和構造110
7.7.2案例: 柵欄修補(P0590)111
7.7.3哈夫曼編碼113
小結115
習題116
第8章樹、森林和並查集119
8.1樹的概念119
8.2樹的實現120
8.2.1樹的直觀表示法120
8.2.2案例: 括號嵌套樹(P0740)121
8.2.3樹的兒子兄弟表示法122
8.2.4案例: 樹轉兒子兄弟樹(P0750)123
8.2.5樹的父結點表示法125
8.3森林125
8.4並查集126
8.4.1並查集的概念和用途126
8.4.2案例: The Suspects——疑似病人(P0760)128
小結130
習題130
第9章字符串132
9.1字符串的編碼132
9.2字符串的實現133
9.3字符串的匹配算法134
9.3.1暴力匹配算法134
★★9.3.2KMP字符串匹配算法135
小結140
習題140
第10章圖的遍歷和搜索142
10.1圖的定義和術語142
10.2圖的表示144
10.2.1鄰接矩陣144
10.2.2鄰接表145
10.2.3鄰接表和鄰接矩陣的對比146
10.3圖的遍歷146
10.3.1深度優先遍歷146
10.3.2案例: 輸出無向圖深度優先遍歷序列(P1020)148
10.3.3案例: 城堡的房間(P1030)151
10.3.4案例: 判斷無向圖是否連通及是否有迴路(P1040)153
10.3.5廣度優先遍歷155
10.4圖的搜索157
10.4.1概述157
10.4.2深度優先搜索159
10.4.3案例: 走迷宮之一(P1050)162
10.4.4案例: 走迷宮之二(P1060)164
10.4.5案例: 走迷宮之三(P1070)164
10.4.6廣度優先搜索166
10.4.7案例: 抓住那頭牛(P1080)166
10.4.8案例: “走迷宮之三”的廣搜解法(P1070)168
★★10.4.9案例: 拯救行動(P1100)170
10.5深搜和廣搜的選擇172
小結172
習題173
第11章圖論基礎應用算法176
11.1最短路176
11.1.1單源最短路問題的Dijkstra算法176
11.1.2案例: 簡單的糖果分配(P1220)178
★11.1.3求每對頂點之間最短路的Floyd算法182
★11.1.4案例: 奶牛比賽(P1230)184
11.2最小生成樹185
11.2.1概述185
11.2.2最小生成樹的性質187
11.2.3Prim算法189
11.2.4Kruskal算法190
★11.2.5案例: 團結真的就是力量(P1235)192
★★11.2.6案例: 北極網絡(P1240)196
11.3拓撲排序197
11.3.1拓撲排序的定義和算法197
11.3.2案例: 火星人家族樹(P1250)199
★11.4關鍵路徑200
11.4.1關鍵路徑的定義和算法200
★★11.4.2案例: 火星大工程(P1260)203
小結205
習題206
第12章排序208
12.1插入排序209
12.1.1直接插入排序209
12.1.2折半插入排序211
12.1.3希爾排序212
12.2選擇排序213
12.2.1簡單選擇排序213
12.2.2堆排序215
12.3歸並排序217
12.4交換排序220
12.4.1冒泡排序220
12.4.2快速排序222
12.5分配排序226
12.5.1桶排序226
12.5.2計數排序227
12.5.3基數排序228
★12.6外排序231
12.6.1置換選擇排序231
12.6.2多路歸並和敗者樹235
小結240
習題240
第13章查找243
13.1線性表查找243
13.1.1順序查找243
13.1.2二分查找244
13.1.3分塊查找250
13.2樹表查找251
13.2.1二叉查找樹251
★13.2.2平衡二叉樹(AVL樹)259
★13.2.3紅黑樹264
★13.2.4外存查找: B樹和B+樹266
13.2.5Java中的二叉查找樹274
13.3散列表278
13.3.1散列函數設計279
13.3.2散列表的插入和沖突消解281
13.3.3散列表的刪除和查找283
13.3.4散列表的效率分析284
13.3.5Java中的散列表285
小結288
習題290
參考文獻294