學習JavaScript數(shù)據(jù)結構與算法 第3版
本書首先介紹了JavaScript語言的基礎知識(包括ECMAScript和TypeScript),其次討論了數(shù)組、棧、隊列、雙端隊列和鏈表等重要的數(shù)據(jù)結構,隨后分析了集合、字典和散列表的工作原理,接下來闡述了遞歸的原理、什么是樹以及二叉堆和堆排序,然后介紹了圖、DFS和BFS算法、各種排序(冒泡排序、選擇排序、插入排序、歸并排序、快速排序、計數(shù)排序、桶排序和基數(shù)排序)和搜索(順序搜索、二分搜索和內(nèi)插搜索)算法以及隨機算法,接著介紹了分而治之、動態(tài)規(guī)劃、貪心算法和回溯算法等高級算法以及函數(shù)式編程,最后還介紹了如何計算算法的復雜度。
數(shù)據(jù)結構是計算機為了高效地利用資源而組織數(shù)據(jù)的一種方式。數(shù)據(jù)結構與算法是解決一切編程問題的基礎。本書用JavaScript語言介紹了各種數(shù)據(jù)結構與算法,通俗易懂、循序漸進,有助于計算機科學專業(yè)的學生和剛剛開啟職業(yè)生涯的技術人員探索JavaScript。
相較于上一版,這一版新增了“ECMAScript和TypeScript概述”“遞歸”“二叉堆和堆排序”和“算法設計與技巧”四章,介紹了ECMAScript 2017的新特性和TypeScript的基本功能,補充了雙端隊列、黑紅樹、堆排序算法,以及計數(shù)排序和基數(shù)排序等內(nèi)容,另外還概述了Fisher-Yates隨機算法和回溯算法(迷宮老鼠問題和數(shù)獨解題器),等等。
- 在數(shù)組、棧和隊列中聲明、初始化、添加和刪除元素
- 創(chuàng)建并使用鏈表、雙向鏈表和循環(huán)鏈表
- 用散列表、字典和集合存儲的元素
- 探索二叉樹和二叉搜索樹的用法
- 使用冒泡排序、選擇排序、插入排序、歸并排序和快速排序等算法排序數(shù)據(jù)結構
- 使用順序搜索和二分搜索等算法搜索數(shù)據(jù)結構中的元素
洛伊安妮·格羅納(Loiane Groner)
花旗銀行軟件開發(fā)經(jīng)理,負責海外項目的開發(fā)和團隊管理;原IBM公司系統(tǒng)分析師及團隊負責人;巴西坎皮納斯Java用戶組(CampinasJUG)協(xié)調(diào)人;Sencha和Java技術推廣者,通過博客為軟件開發(fā)社區(qū)撰稿,發(fā)表關于IT職業(yè)發(fā)展和常用開發(fā)技術的文章和視頻,并經(jīng)常受邀在各大技術會議上做報告。另著有《精通Ext JS》等書。
第 1章 JavaScript簡介 1
1.1 JavaScript數(shù)據(jù)結構與算法 1
1.2 環(huán)境搭建 2
1.2.1 最簡單的環(huán)境搭建 2
1.2.2 使用Web服務器 3
1.2.3 Node.js http-server 5
1.3 JavaScript基礎 5
1.3.1 變量 6
1.3.2 運算符 8
1.3.3 真值和假值 11
1.3.4 相等運算符(==和===) 12
1.4 控制結構 14
1.4.1 條件語句 14
1.4.2 循環(huán) 15
1.5 函數(shù) 16
1.6 JavaScript面向?qū)ο缶幊獭?7
1.7 調(diào)試工具 18
1.8 小結 20
第 2章 ECMAScript和TypeScript概述 21
2.1 ECMAScript還是JavaScript 21
2.1.1 ES6、ES2015、ES7、ES2016、ES8、ES2017和ES.Next 21
2.1.2 使用Babel.js 23
2.2 ECMAScript 2015+的功能 24
2.2.1 用let替代var聲明變量 24
2.2.2 模板字面量 27
2.2.3 箭頭函數(shù) 27
2.2.4 函數(shù)的參數(shù)默認值 28
2.2.5 聲明展開和剩余參數(shù) 29
2.2.6 增強的對象屬性 30
2.2.7 使用類進行面向?qū)ο缶幊獭?1
2.2.8 乘方運算符 33
2.2.9 模塊 33
2.3 介紹TypeScript 39
2.3.1 類型推斷 40
2.3.2 接口 41
2.3.3 其他TypeScript功能 43
2.3.4 TypeScript中對JavaScript文件的編譯時檢查 43
2.4 小結 44
第3章 數(shù)組 45
3.1 為什么用數(shù)組 45
3.2 創(chuàng)建和初始化數(shù)組 46
3.3 添加元素 47
3.3.1 在數(shù)組末尾插入元素 47
3.3.2 在數(shù)組開頭插入元素 48
3.4 刪除元素 49
3.4.1 從數(shù)組末尾刪除元素 49
3.4.2 從數(shù)組開頭刪除元素 49
3.5 在任意位置添加或刪除元素 51
3.6 二維和多維數(shù)組 51
3.6.1 迭代二維數(shù)組的元素 52
3.6.2 多維數(shù)組 53
3.7 JavaScript的數(shù)組方法參考 54
3.7.1 數(shù)組合并 55
3.7.2 迭代器函數(shù) 55
3.7.3 ECMAScript 6和數(shù)組的新功能 57
3.7.4 排序元素 60
3.7.5 搜索 63
3.7.6 輸出數(shù)組為字符串 64
3.8 類型數(shù)組 64
3.9 TypeScript中的數(shù)組 65
3.10 小結 66
第4章 !67
4.1 創(chuàng)建一個JavaScript數(shù)據(jù)結構和算法庫 67
4.2 棧數(shù)據(jù)結構 68
4.2.1 創(chuàng)建一個基于數(shù)組的!69
4.2.2 向棧添加元素 69
4.2.3 從棧移除元素 70
4.2.4 查看棧頂元素 70
4.2.5 檢查棧是否為空 71
4.2.6 清空棧元素 71
4.2.7 使用Stack類 71
4.3 創(chuàng)建一個基于JavaScript對象的Stack類 73
4.3.1 向棧中插入元素 73
4.3.2 驗證一個棧是否為空和它的大小 74
4.3.3 從棧中彈出元素 74
4.3.4 查看棧頂?shù)闹挡G蹇铡?5
4.3.5 創(chuàng)建toString方法 75
4.4 保護數(shù)據(jù)結構內(nèi)部元素 76
4.4.1 下劃線命名約定 76
4.4.2 用ES2015的限定作用域Symbol實現(xiàn)類 77
4.4.3 用ES2015的WeakMap實現(xiàn)類 77
4.4.4 ECMAScript類屬性提案 78
4.5 用棧解決問題 79
4.6 小結 81
第5章 隊列和雙端隊列 82
5.1 隊列數(shù)據(jù)結構 82
5.1.1 創(chuàng)建隊列 83
5.1.2 使用Queue 類 86
5.2 雙端隊列數(shù)據(jù)結構 87
5.2.1 創(chuàng)建Deque類 87
5.2.2 使用Deque類 89
5.3 使用隊列和雙端隊列來解決問題 90
5.3.1 循環(huán)隊列——擊鼓傳花游戲 90
5.3.2 回文檢查器 91
5.3.3 JavaScript任務隊列 93
5.4 小結 93
第6章 鏈表 94
6.1 鏈表數(shù)據(jù)結構 94
6.2 雙向鏈表 106
6.2.1 在任意位置插入新元素 107
6.2.2 從任意位置移除元素 109
6.3 循環(huán)鏈表 111
6.3.1 在任意位置插入新元素 112
6.3.2 從任意位置移除元素 113
6.4 有序鏈表 114
6.5 創(chuàng)建StackLinkedList類 116
6.6 小結 117
第7章 集合 118
7.1 構建數(shù)據(jù)集合 118
7.2 創(chuàng)建集合類 119
7.2.1 has(element)方法 119
7.2.2 add方法 120
7.2.3 delete和clear方法 120
7.2.4 size方法 121
7.2.5 values方法 122
7.2.6 使用Set類 122
7.3 集合運算 123
7.3.1 并集 123
7.3.2 交集 125
7.3.3 差集 127
7.3.4 子集 128
7.4 ECMAScript 2015——Set類 130
7.5 多重集或袋 132
7.6 小結 133
第8章 字典和散列表 134
8.1 字典 134
8.1.1 創(chuàng)建字典類 135
8.1.2 使用Dictionary類 141
8.2 散列表 142
8.2.1 創(chuàng)建散列表 143
8.2.2 使用HashTable類 146
8.2.3 散列表和散列集合 147
8.2.4 處理散列表中的沖突 147
8.2.5 創(chuàng)建更好的散列函數(shù) 158
8.3 ES2015 Map類 159
8.4 ES2105 WeakMap類和WeakSet類 159
8.5 小結 160
第9章 遞歸 161
9.1 理解遞歸 161
9.2 計算一個數(shù)的階乘 162
9.2.1 迭代階乘 162
9.2.2 遞歸階乘 163
9.3 斐波那契數(shù)列 165
9.3.1 迭代求斐波那契數(shù) 166
9.3.2 遞歸求斐波那契數(shù) 166
9.3.3 記憶化斐波那契數(shù) 167
9.4 為什么要用遞歸?它更快嗎 167
9.5 小結 168
第 10章 樹 169
10.1 樹數(shù)據(jù)結構 169
10.2 樹的相關術語 170
10.3 二叉樹和二叉搜索樹 170
10.3.1 創(chuàng)建BinarySearchTree類 171
10.3.2 向二叉搜索樹中插入一個鍵 172
10.4 樹的遍歷 175
10.4.1 中序遍歷 175
10.4.2 先序遍歷 176
10.4.3 后序遍歷 177
10.5 搜索樹中的值 178
10.5.1 搜索最小值和最大值 178
10.5.2 搜索一個特定的值 180
10.5.3 移除一個節(jié)點 182
10.6 自平衡樹 185
10.6.1 Adelson-Velskii-Landi樹(AVL樹) 185
10.6.2 紅黑樹 194
10.7 小結 200
第 11章 二叉堆和堆排序 201
11.1 二叉堆數(shù)據(jù)結構 201
11.1.1 創(chuàng)建最小堆類 202
11.1.2 創(chuàng)建最大堆類 208
11.2 堆排序算法 209
11.3 小結 211
第 12章 圖 212
12.1 圖的相關術語 212
12.2 圖的表示 214
12.2.1 鄰接矩陣 215
12.2.2 鄰接表 215
12.2.3 關聯(lián)矩陣 216
12.3 創(chuàng)建Graph類 216
12.4 圖的遍歷 219
12.4.1 廣度優(yōu)先搜索 220
12.4.2 深度優(yōu)先搜索 225
12.5 最短路徑算法 231
12.5.1 Dijkstra算法 232
12.5.2 Floyd-Warshall算法 234
12.6 最小生成樹 235
12.6.1 Prim算法 236
12.6.2 Kruskal算法 237
12.7 小結 238
第 13章 排序和搜索算法 239
13.1 排序算法 239
13.1.1 冒泡排序 239
13.1.2 選擇排序 242
13.1.3 插入排序 244
13.1.4 歸并排序 245
13.1.5 快速排序 247
13.1.6 計數(shù)排序 251
13.1.7 桶排序 253
13.1.8 基數(shù)排序 255
13.2 搜索算法 257
13.2.1 順序搜索 257
13.2.2 二分搜索 258
13.2.3 內(nèi)插搜索 260
13.3 隨機算法 261
13.4 小結 262
第 14章 算法設計與技巧 263
14.1 分而治之 263
14.2 動態(tài)規(guī)劃 265
14.2.1 最少硬幣找零問題 266
14.2.2 背包問題 268
14.2.3 最長公共子序列 270
14.2.4 矩陣鏈相乘 272
14.3 貪心算法 274
14.3.1 最少硬幣找零問題 274
14.3.2 分數(shù)背包問題 275
14.4 回溯算法 276
14.4.1 迷宮老鼠問題 277
14.4.2 數(shù)獨解題器 279
14.5 函數(shù)式編程簡介 282
14.5.1 函數(shù)式編程與命令式編程 283
14.5.3 JavaScript函數(shù)式工具箱——map、filter和reduce 284
14.5.4 JavaScript函數(shù)式類庫和數(shù)據(jù)結構 286
14.6 小結 286
第 15章 算法復雜度 287
15.1 大O表示法 287
15.1.1 理解大O表示法 287
15.1.2 時間復雜度比較 289
15.1.3 NP完全理論概述 292
15.2 用算法娛樂身心 293
15.3 小結 294