本書首先介紹了JavaScript 語(yǔ)言的基礎(chǔ)知識(shí)以及ES6 和ES7 中引入的新功能,接下來討論了數(shù)組、棧、隊(duì)列、鏈表、集合、字典、散列表、樹、圖等數(shù)據(jù)結(jié)構(gòu),之后探討了各種排序和搜索算法,包括冒泡排序、選擇排序、插入排序、歸并排序、快速排序、堆排序、計(jì)數(shù)排序、桶排序、基數(shù)排序、順序搜索、二分搜索,然后介紹了動(dòng)態(tài)規(guī)劃和貪心算法等常用的高-級(jí)算法以及函數(shù)式編程,zui后還介紹了如何計(jì)算算法的復(fù)雜度。
本書適用于前端Web 開發(fā)人員,以及所有對(duì)JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法感興趣的讀者。
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)為了高效地利用資源而組織數(shù)據(jù)的一種方式。數(shù)據(jù)結(jié)構(gòu)和算法是解決一切編程問題的基礎(chǔ)。
本書首先介紹了JavaScript語(yǔ)言的基礎(chǔ)知識(shí),接著討論了數(shù)組、棧、隊(duì)列和鏈表等重要的數(shù)據(jù)結(jié)構(gòu),隨后分析了集合、字典和散列表的工作原理,接下來闡述了什么是樹以及如何使用二叉樹和二叉搜索樹,然后介紹了圖、DFS和BFS算法,以及各種排序(冒泡排序、選擇排序、插入排序、歸并排序、快速排序等)和搜索(順序搜索、二分搜索)算法,zui后介紹了動(dòng)態(tài)規(guī)劃和貪心算法等高ji算法。
相較上一版,這一版新增了ES6和ES7的新功能介紹,補(bǔ)充了ES6的當(dāng)前實(shí)現(xiàn)。同時(shí)拓展了對(duì)樹、圖、排序算法、動(dòng)態(tài)規(guī)劃和貪心算法的討論,增加了AVL樹、Dijkstra算法、Floyd-Warshall算法、Prim算法、Kruskal算法、堆排序、分布式排序、背包問題、矩陣鏈相乘等內(nèi)容。此外還概述了函數(shù)式編程、NP完全理論。
如果你是計(jì)算機(jī)科學(xué)專業(yè)的學(xué)生,或是剛剛開啟職業(yè)生涯的技術(shù)人員,想探索JavaScript的zui佳能力,這本書一定適合你。
Loiane Groner 花旗銀行軟件開發(fā)經(jīng)理,負(fù)責(zé)海外項(xiàng)目的開發(fā)和團(tuán)隊(duì)管理;原IBM公司系統(tǒng)分析師及團(tuán)隊(duì)負(fù)責(zé)人;巴西坎皮納斯Java用戶組(CampinasJUG)ling導(dǎo)者、圣埃斯皮里圖Java用戶組(ESJUG)協(xié)調(diào)人;巴西各大型技術(shù)會(huì)議特邀發(fā)言人;Sencha和Java技術(shù)布道者,通過博客(http://loianegroner.com)為軟件開發(fā)社區(qū)撰稿,發(fā)表關(guān)于IT職業(yè)發(fā)展和常用開發(fā)技術(shù)的文章和視頻。另著有《精通Ext JS》等書。
第1 章 JavaScript 簡(jiǎn)介 1
1.1 JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法 1
1.2 環(huán)境搭建 2
1.2.1 最簡(jiǎn)單的環(huán)境搭建 2
1.2.2 使用Web 服務(wù)器(XAMPP) 4
1.2.3 使用Node.js 搭建Web 服務(wù)器 5
1.3 JavaScript 基礎(chǔ) 6
1.3.1 變量 7
1.3.2 操作符 9
1.3.3 真值和假值 11
1.3.4 相等操作符(==和===) 12
1.4 控制結(jié)構(gòu) 14
1.4.1 條件語(yǔ)句 14
1.4.2 循環(huán) 15
1.5 函數(shù) 16
1.6 JavaScript 面向?qū)ο缶幊? 17
1.7 調(diào)試工具 18
1.8 ECMAScript 概述 19
1.9 ECMAScript 6 的功能 21
1.9.1 用let 替代var 聲明變量 21
1.9.2 常量 23
1.9.3 模板字面量 23
1.9.4 箭頭函數(shù) 24
1.9.5 函數(shù)的參數(shù)默認(rèn)值 24
1.9.6 聲明展開和剩余參數(shù) 25
1.9.7 使用類進(jìn)行面向?qū)ο缶幊? 27
1.10 ECMAScript 7 的功能 29
1.11 小結(jié) 30
第2 章 數(shù)組 31
2.1 為什么用數(shù)組 31
2.2 創(chuàng)建和初始化數(shù)組 32
2.3 添加元素 33
2.3.1 使用push 方法 33
2.3.2 插入元素到數(shù)組首位 34
2.4 刪除元素 34
2.5 在任意位置添加或刪除元素 36
2.6 二維和多維數(shù)組 36
2.6.1 迭代二維數(shù)組的元素 37
2.6.2 多維數(shù)組 38
2.7 JavaScript 的數(shù)組方法參考 39
2.7.1 數(shù)組合并 39
2.7.2 迭代器函數(shù) 40
2.7.3 ECMAScript 6 和數(shù)組的新功能 42
2.7.4 排序元素 46
2.7.5 搜索 48
2.7.6 輸出數(shù)組為字符串 49
2.8 類型數(shù)組 50
2.9 小結(jié) 51
第3 章 棧 52
3.1 棧數(shù)據(jù)結(jié)構(gòu) 52
3.1.1 創(chuàng)建棧 53
3.1.2 向棧添加元素 53
3.1.3 從棧移除元素 53
3.1.4 查看棧頂元素 54
3.1.5 檢查棧是否為空 54
3.1.6 清空和打印棧元素 54
3.2 ECMAScript 6 和Stack 類 56
3.3 用棧解決問題 59
3.4 小結(jié) 61
第4 章 隊(duì)列 62
4.1 隊(duì)列數(shù)據(jù)結(jié)構(gòu) 62
4.2 創(chuàng)建隊(duì)列 63
4.2.1 向隊(duì)列添加元素 63
4.2.2 從隊(duì)列移除元素 63
4.2.3 查看隊(duì)列頭元素 64
4.2.4 檢查隊(duì)列是否為空 64
4.2.5 打印隊(duì)列元素 64
4.3 用ECMAScript 6 語(yǔ)法實(shí)現(xiàn)的Queue 類 66
4.4 優(yōu)先隊(duì)列 66
4.5 循環(huán)隊(duì)列擊鼓傳花 68
4.6 JavaScript 任務(wù)隊(duì)列 70
4.7 小結(jié) 70
第5 章 鏈表 71
5.1 鏈表數(shù)據(jù)結(jié)構(gòu) 71
5.2 創(chuàng)建鏈表 72
5.2.1 向鏈表尾部追加元素 73
5.2.2 從鏈表中移除元素 75
5.2.3 在任意位置插入元素 77
5.2.4 實(shí)現(xiàn)其他方法 79
5.3 雙向鏈表 82
5.3.1 在任意位置插入新元素 82
5.3.2 從任意位置移除元素 85
5.4 循環(huán)鏈表 87
5.5 小結(jié) 88
第6 章 集合 89
6.1 構(gòu)建數(shù)據(jù)集合 89
6.2 創(chuàng)建集合 89
6.2.1 has(value)方法 90
6.2.2 add 方法 91
6.2.3 remove 和clear 方法 91
6.2.4 size 方法 92
6.2.5 values 方法 93
6.2.6 使用Set 類 93
6.3 集合操作 94
6.3.1 并集 94
6.3.2 交集 95
6.3.3 差集 97
6.3.4 子集 98
6.4 ES6Set 類 99
6.5 小結(jié) 101
第7 章 字典和散列表 102
7.1 字典 102
7.1.1 創(chuàng)建字典 102
7.1.2 使用Dictionary 類 105
7.2 散列表 106
7.2.1 創(chuàng)建散列表 106
7.2.2 使用HashTable 類 108
7.2.3 散列表和散列集合 109
7.2.4 處理散列表中的沖突 109
7.2.5 創(chuàng)建更好的散列函數(shù) 117
7.3 ES6Map 類 118
7.4 ES6WeakMap 類和WeakSet 類 118
7.5 小結(jié) 119
第8 章 樹 120
8.1 樹數(shù)據(jù)結(jié)構(gòu) 120
8.2 樹的相關(guān)術(shù)語(yǔ) 121
8.3 二叉樹和二叉搜索樹 121
8.3.1 創(chuàng)建BinarySearchTree 類 122
8.3.2 向樹中插入一個(gè)鍵 123
8.4 樹的遍歷 126
8.4.1 中序遍歷 126
8.4.2 先序遍歷 127
8.4.3 后序遍歷 128
8.5 搜索樹中的值 129
8.5.1 搜索最小值和最大值 130
8.5.2 搜索一個(gè)特定的值 131
8.5.3 移除一個(gè)節(jié)點(diǎn) 133
8.6 自平衡樹 137
8.6.1 Adelson-Velskii-Landi 樹(AVL 樹) 137
8.6.2 更多關(guān)于二叉樹的知識(shí) 143
8.7 小結(jié) 143
第9 章 圖 144
9.1 圖的相關(guān)術(shù)語(yǔ) 144
9.2 圖的表示 146
9.2.1 鄰接矩陣 146
9.2.2 鄰接表 147
9.2.3 關(guān)聯(lián)矩陣 148
9.3 創(chuàng)建Graph 類 148
9.4 圖的遍歷 150
9.4.1 廣度優(yōu)先搜索 151
9.4.2 深度優(yōu)先搜索 156
9.5 最短路徑算法 162
9.5.1 Dijkstra 算法 163
9.5.2 Floyd-Warshall 算法 165
9.6 最小生成樹 166
9.6.1 Prim 算法 166
9.6.2 Kruskal 算法 168
9.7 小結(jié) 169
第10 章 排序和搜索算法 170
10.1 排序算法 170
10.1.1 冒泡排序 171
10.1.2 選擇排序 174
10.1.3 插入排序 175
10.1.4 歸并排序 176
10.1.5 快速排序 179
10.1.6 堆排序 183
10.1.7 計(jì)數(shù)排序、桶排序和基數(shù)排序(分布式排序) 186
10.2 搜索算法 187
10.2.1 順序搜索 187
10.2.2 二分搜索 187
10.3 小結(jié) 189
第11 章 算法模式 190
11.1 遞歸 190
11.1.1 JavaScript 調(diào)用棧大小的限制 191
11.1.2 斐波那契數(shù)列 191
11.2 動(dòng)態(tài)規(guī)劃 193
11.2.1 最少硬幣找零問題 194
11.2.2 背包問題 196
11.2.3 最長(zhǎng)公共子序列 198
11.2.4 矩陣鏈相乘 200
11.3 貪心算法 202
11.3.1 最少硬幣找零問題 203
11.3.2 分?jǐn)?shù)背包問題 204
11.4 函數(shù)式編程簡(jiǎn)介 205
11.4.1 函數(shù)式編程與命令式編程 205
11.4.2 ES2015 和函數(shù)式編程 206
11.4.3 JavaScript 函數(shù)式工具箱
map、filter 和reduce 207
11.4.4 JavaScript 函數(shù)式類庫(kù)和數(shù)據(jù)結(jié)構(gòu) 209
11.5 小結(jié) 209
第12 章 算法復(fù)雜度 210
12.1 大O 表示法 210
12.1.1 理解大O 表示法 210
12.1.2 時(shí)間復(fù)雜度比較 212
12.1.3 NP 完全理論概述 214
12.2 用算法娛樂身心 216
12.3 小結(jié) 217