本書首先介紹了JavaScript 語言的基礎知識以及ES6 和ES7 中引入的新功能,接下來討論了數組、棧、隊列、鏈表、集合、字典、散列表、樹、圖等數據結構,之后探討了各種排序和搜索算法,包括冒泡排序、選擇排序、插入排序、歸并排序、快速排序、堆排序、計數排序、桶排序、基數排序、順序搜索、二分搜索,然后介紹了動態規劃和貪心算法等常用的高-級算法以及函數式編程,zui后還介紹了如何計算算法的復雜度。
本書適用于前端Web 開發人員,以及所有對JavaScript 數據結構與算法感興趣的讀者。
數據結構是計算機為了高效地利用資源而組織數據的一種方式。數據結構和算法是解決一切編程問題的基礎。
本書首先介紹了JavaScript語言的基礎知識,接著討論了數組、棧、隊列和鏈表等重要的數據結構,隨后分析了集合、字典和散列表的工作原理,接下來闡述了什么是樹以及如何使用二叉樹和二叉搜索樹,然后介紹了圖、DFS和BFS算法,以及各種排序(冒泡排序、選擇排序、插入排序、歸并排序、快速排序等)和搜索(順序搜索、二分搜索)算法,zui后介紹了動態規劃和貪心算法等高ji算法。
相較上一版,這一版新增了ES6和ES7的新功能介紹,補充了ES6的當前實現。同時拓展了對樹、圖、排序算法、動態規劃和貪心算法的討論,增加了AVL樹、Dijkstra算法、Floyd-Warshall算法、Prim算法、Kruskal算法、堆排序、分布式排序、背包問題、矩陣鏈相乘等內容。此外還概述了函數式編程、NP完全理論。
如果你是計算機科學專業的學生,或是剛剛開啟職業生涯的技術人員,想探索JavaScript的zui佳能力,這本書一定適合你。
Loiane Groner 花旗銀行軟件開發經理,負責海外項目的開發和團隊管理;原IBM公司系統分析師及團隊負責人;巴西坎皮納斯Java用戶組(CampinasJUG)ling導者、圣埃斯皮里圖Java用戶組(ESJUG)協調人;巴西各大型技術會議特邀發言人;Sencha和Java技術布道者,通過博客(http://loianegroner.com)為軟件開發社區撰稿,發表關于IT職業發展和常用開發技術的文章和視頻。另著有《精通Ext JS》等書。
第1 章 JavaScript 簡介 1
1.1 JavaScript 數據結構與算法 1
1.2 環境搭建 2
1.2.1 最簡單的環境搭建 2
1.2.2 使用Web 服務器(XAMPP) 4
1.2.3 使用Node.js 搭建Web 服務器 5
1.3 JavaScript 基礎 6
1.3.1 變量 7
1.3.2 操作符 9
1.3.3 真值和假值 11
1.3.4 相等操作符(==和===) 12
1.4 控制結構 14
1.4.1 條件語句 14
1.4.2 循環 15
1.5 函數 16
1.6 JavaScript 面向對象編程 17
1.7 調試工具 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 箭頭函數 24
1.9.5 函數的參數默認值 24
1.9.6 聲明展開和剩余參數 25
1.9.7 使用類進行面向對象編程 27
1.10 ECMAScript 7 的功能 29
1.11 小結 30
第2 章 數組 31
2.1 為什么用數組 31
2.2 創建和初始化數組 32
2.3 添加元素 33
2.3.1 使用push 方法 33
2.3.2 插入元素到數組首位 34
2.4 刪除元素 34
2.5 在任意位置添加或刪除元素 36
2.6 二維和多維數組 36
2.6.1 迭代二維數組的元素 37
2.6.2 多維數組 38
2.7 JavaScript 的數組方法參考 39
2.7.1 數組合并 39
2.7.2 迭代器函數 40
2.7.3 ECMAScript 6 和數組的新功能 42
2.7.4 排序元素 46
2.7.5 搜索 48
2.7.6 輸出數組為字符串 49
2.8 類型數組 50
2.9 小結 51
第3 章 棧 52
3.1 棧數據結構 52
3.1.1 創建棧 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 小結 61
第4 章 隊列 62
4.1 隊列數據結構 62
4.2 創建隊列 63
4.2.1 向隊列添加元素 63
4.2.2 從隊列移除元素 63
4.2.3 查看隊列頭元素 64
4.2.4 檢查隊列是否為空 64
4.2.5 打印隊列元素 64
4.3 用ECMAScript 6 語法實現的Queue 類 66
4.4 優先隊列 66
4.5 循環隊列擊鼓傳花 68
4.6 JavaScript 任務隊列 70
4.7 小結 70
第5 章 鏈表 71
5.1 鏈表數據結構 71
5.2 創建鏈表 72
5.2.1 向鏈表尾部追加元素 73
5.2.2 從鏈表中移除元素 75
5.2.3 在任意位置插入元素 77
5.2.4 實現其他方法 79
5.3 雙向鏈表 82
5.3.1 在任意位置插入新元素 82
5.3.2 從任意位置移除元素 85
5.4 循環鏈表 87
5.5 小結 88
第6 章 集合 89
6.1 構建數據集合 89
6.2 創建集合 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 小結 101
第7 章 字典和散列表 102
7.1 字典 102
7.1.1 創建字典 102
7.1.2 使用Dictionary 類 105
7.2 散列表 106
7.2.1 創建散列表 106
7.2.2 使用HashTable 類 108
7.2.3 散列表和散列集合 109
7.2.4 處理散列表中的沖突 109
7.2.5 創建更好的散列函數 117
7.3 ES6Map 類 118
7.4 ES6WeakMap 類和WeakSet 類 118
7.5 小結 119
第8 章 樹 120
8.1 樹數據結構 120
8.2 樹的相關術語 121
8.3 二叉樹和二叉搜索樹 121
8.3.1 創建BinarySearchTree 類 122
8.3.2 向樹中插入一個鍵 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 搜索一個特定的值 131
8.5.3 移除一個節點 133
8.6 自平衡樹 137
8.6.1 Adelson-Velskii-Landi 樹(AVL 樹) 137
8.6.2 更多關于二叉樹的知識 143
8.7 小結 143
第9 章 圖 144
9.1 圖的相關術語 144
9.2 圖的表示 146
9.2.1 鄰接矩陣 146
9.2.2 鄰接表 147
9.2.3 關聯矩陣 148
9.3 創建Graph 類 148
9.4 圖的遍歷 150
9.4.1 廣度優先搜索 151
9.4.2 深度優先搜索 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 小結 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 計數排序、桶排序和基數排序(分布式排序) 186
10.2 搜索算法 187
10.2.1 順序搜索 187
10.2.2 二分搜索 187
10.3 小結 189
第11 章 算法模式 190
11.1 遞歸 190
11.1.1 JavaScript 調用棧大小的限制 191
11.1.2 斐波那契數列 191
11.2 動態規劃 193
11.2.1 最少硬幣找零問題 194
11.2.2 背包問題 196
11.2.3 最長公共子序列 198
11.2.4 矩陣鏈相乘 200
11.3 貪心算法 202
11.3.1 最少硬幣找零問題 203
11.3.2 分數背包問題 204
11.4 函數式編程簡介 205
11.4.1 函數式編程與命令式編程 205
11.4.2 ES2015 和函數式編程 206
11.4.3 JavaScript 函數式工具箱
map、filter 和reduce 207
11.4.4 JavaScript 函數式類庫和數據結構 209
11.5 小結 209
第12 章 算法復雜度 210
12.1 大O 表示法 210
12.1.1 理解大O 表示法 210
12.1.2 時間復雜度比較 212
12.1.3 NP 完全理論概述 214
12.2 用算法娛樂身心 216
12.3 小結 217