學習 JavaScript 數據結構與算法, 3/e (Learning JavaScript Data Structures and Algorithms, 3/e)
內容描述
本書首先介紹了JavaScript語言的基礎知識(包括ECMAScript和TypeScript),其次討論了數組、棧、隊列、雙端隊列和鏈表等重要的數據結構,隨後分析了集合、字典和散列表的工作原理,接下來闡述了遞歸的原理、什麽是樹以及二叉堆和堆排序,然後介紹了圖、DFS和BFS算法、各種排序(冒泡排序、選擇排序、插入排序、歸並排序、快速排序、計數排序、桶排序和基數排序)和搜索(順序搜索、二分搜索和內插搜索)算法以及隨機算法,接著介紹了分而治之、動態規劃、貪心算法和回溯算法等高級算法以及函數式編程,最後還介紹瞭如何計算算法的復雜度。
目錄大綱
第1章JavaScript簡介1
1.1 JavaScript數據結構與算法1
1.2環境搭建2
1.2.1最簡單的環境搭建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循環15
1.5函數16
1.6 JavaScript面向對象編程17
1.7調試工具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箭頭函數27
2.2.4函數的參數默認值28
2.2.5聲明展開和剩餘參數29
2.2.6增強的對象屬性30
2.2.7使用類進行面向對象編程31
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章數組45
3.1為什麼用數組45
3.2創建和初始化數組46
3.3添加元素47
3.3.1在數組末尾插入元素47
3.3.2在數組開頭插入元素48
3.4刪除元素49
3.4.1從數組末尾刪除元素49
3.4.2從數組開頭刪除元素49
3.5在任意位置添加或刪除元素51
3.6二維和多維數組51
3.6.1迭代二維數組的元素52
3.6.2多維數組53
3.7 JavaScript的數組方法參考54
3.7.1數組合併55
3.7.2迭代器函數55
3.7.3 ECMAScript 6和數組的新功能57
3.7.4排序元素60
3.7.5搜索63
3.7.6輸出數組為字符串64
3.8類型數組64
3.9 TypeScript中的數組65
3.10小結66
第4章棧67
4.1創建一個JavaScript數據結構和算法庫67
4.2棧數據結構68
4.2.1創建一個基於數組的棧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創建一個基於JavaScript對象的Stack類73
4.3.1向棧中插入元素73
4.3.2驗證一個棧是否為空和它的大小74
4.3.3從棧中彈出元素74
4.3.4查看棧頂的值並將棧清空75
4.3.5創建toString方法75
4.4保護數據結構內部元素76
4.4.1下劃線命名約定76
4.4 .2用ES2015的限定作用域Symbol實現類77
4.4.3用ES2015的WeakMap實現類77
4.4.4 ECMAScript類屬性提案78
4.5用棧解決問題79
4.6小結81
第5章隊列和雙端隊列82
5.1隊列數據結構82
5.1.1創建隊列83
5.1.2使用Queue類86
5.2雙端隊列數據結構87
5.2.1創建Deque類87
5.2.2使用Deque類89
5.3使用隊列和雙端隊列來解決問題90
5.3.1循環隊列——擊鼓傳花遊戲90
5.3.2回文檢查器91
5.3.3 JavaScript任務隊列93
5.4小結93
第6章鍊錶94
6.1鍊錶數據結構94
6.2雙向鍊錶106
6.2.1在任意位置插入新元素107
6.2.2從任意位置移除元素109
6.3循環鍊錶111
6.3.1在任意位置插入新元素112
6.3.2從任意位置移除元素113
6.4有序鍊錶114
6.5創建StackLinkedList類116
6.6小結117
第7章集合118
7.1構建數據集合118
7.2創建集合類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創建字典類135
8.1.2使用Dictionary類141
8.2散列表142
8.2.1創建散列表143
8.2.2使用HashTable類146
8.2.3散列表和散列集合147
8.2.4處理散列表中的衝突147
8.2.5創建更好的散列函數158
8.3 ES2015 Map類159
8.4 ES2105 WeakMap類和WeakSet類159
8.5小結160
第9章遞歸161
9.1理解遞歸161
9.2計算一個數的階乘162
9.2.1迭代階乘162
9.2.2遞歸階乘163
9.3斐波那契數列165
9.3.1迭代求斐波那契數166
9.3.2遞歸求斐波那契數166
9.3.3記憶化斐波那契數167
9.4為什麼要用遞歸?它更快嗎167
9.5小結168
第10章樹169
10.1樹數據結構169
10.2樹的相關術語170
10.3二叉樹和二叉搜索樹170
10.3.1創建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移除一個節點182
10.6自平衡樹185
10.6.1 Adelson-Velskii-Landi樹(AVL樹) 185
10.6.2紅黑樹194
10.7小結200
第11章二叉堆和堆排序201
11.1二叉堆數據結構201
11.1.1創建最小堆類202
11.1.2創建最大堆類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關聯矩陣216
12.3創建Graph類216
12.4圖的遍歷219
12.4.1廣度優先搜索220
12.4.2深度優先搜索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計數排序251
13.1.7桶排序253
13.1.8基數排序255
13.2搜索算法257
13.2.1順序搜索257
13.2.2二分搜索258
13.2.3內插搜索260
13.3隨機算法261
13.4小結262
第14章算法設計與技巧263
14.1分而治之263
14.2動態規劃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分數背包問題275
14.4回溯算法276
14.4.1迷宮老鼠問題277
14.4.2數獨解題器279
14.5函數式編程簡介282
14.5.1函數式編程與命令式編程283
14.5.3 JavaScript函數式工具箱——map、filter和reduce 284
14.5.4 JavaScript函數式類庫和數據結構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
作者介紹
洛伊安妮·格羅納(Loiane Groner)
花旗銀行軟件開發經理,負責海外項目的開發和團隊管理;原IBM公司係統分析師及團隊負責人;巴西坎皮納斯Java用戶組(CampinasJUG)協調人;Sencha和Java技術推廣者,通過博客為軟件開發社區撰稿,發表關於IT職業發展和常用開發技術的文章和視頻,並經常受邀在各大技術會議上做報告。另著有《精通Ext JS》等書。