学习 JavaScript 数据结构与算法

学习 JavaScript 数据结构与算法
编辑推荐
数据结构是计算机为了高效地利用资源而组织数据的一种方式。数据结构与算法是解决一切编程问题的基础。本书用 JavaScript 语言介绍了各种数据结构与算法,通俗易懂、循序渐进,有助于计算机科学专业的学生和刚刚开启职业生涯的技术人员探索 JavaScript。 相较于上一版,这一版新增了“ECMAScript 和 TypeScript 概述”“递归”“二叉堆和堆排序”和“算法设计与技巧”四章,介绍了 ECMAScript 2017 的新特性和 TypeScript 的基本功能,补充了双端队列、黑红树、堆排序算法,以及计数排序和基数排序等内容,另外还概述了 Fisher-Yates 随机算法和回溯算法(迷宫老鼠问题和数独解题器),等等。
- 在数组、栈和队列中声明、初始化、添加和删除元素
- 创建并使用链表、双向链表和循环链表
- 用散列表、字典和集合存储的元素
- 探索二叉树和二叉搜索树的用法
- 使用冒泡排序、选择排序、插入排序、归并排序和快速排序等算法排序数据结构
- 使用顺序搜索和二分搜索等算法搜索数据结构中的元素
京东上购买
这本书,可以在京东买到,推荐你点击下面的图片进入到京东上购买;
之所以推荐点击上面的图片链接进行购买,是因为如果你通过我的链接购买这本书,我可以拿到1块钱左右的广告费;谢谢大家支持;
所有推广的收入,都用于本站(AXIHE.com)的维护和服务器支出。
内容简介
本书首先介绍了 JavaScript 语言的基础知识(包括 ECMAScript 和 TypeScript),其次讨论了数组、栈、队列、双端队列和链表等重要的数据结构,随后分析了集合、字典和散列表的工作原理,接下来阐述了递归的原理、什么是树以及二叉堆和堆排序,然后介绍了图、DFS 和 BFS 算法、各种排序(冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、桶排序和基数排序)和搜索(顺序搜索、二分搜索和内插搜索)算法以及随机算法,接着介绍了分而治之、动态规划、贪心算法和回溯算法等高级算法以及函数式编程,最后还介绍了如何计算算法的复杂度。
作者简介
洛伊安妮·格罗纳(Loiane Groner)
花旗银行软件开发经理,负责海外项目的开发和团队管理;原 IBM 公司系统分析师及团队负责人;巴西坎皮纳斯 Java 用户组(CampinasJUG)协调人;Sencha 和 Java 技术推广者,通过博客为软件开发社区撰稿,发表关于 IT 职业发展和常用开发技术的文章和视频,并经常受邀在各大技术会议上做报告。另著有《精通 Ext JS》等书。
目录
第 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