编辑推荐
数据结构是计算机为了高效地利用资源而组织数据的一种方式。数据结构和算法是解决一切编程问题的基础。本书首先介绍了JavaScript语言的基础知识,接着讨论了数组、栈、队列和链表等重要的数据结构,随后分析了集合、字典和散列表的工作原理,接下来阐述了什么是树以及如何使用二叉树和二叉搜索树,然后介绍了图、DFS和BFS算法,以及各种排序(冒泡排序、选择排序、插入排序、归并排序、快速排序等)和搜索(顺序搜索、二分搜索)算法,zui后介绍了动态规划和贪心算法等高ji算法。相较上一版,这一版新增了ES6和ES7的新功能介绍,补充了ES6的当前实现。同时拓展了对树、图、排序算法、动态规划和贪心算法的讨论,增加了AVL树、Dijkstra算法、Floyd-Warshall算法、Prim算法、Kruskal算法、堆排序、分布式排序、背包问题、矩阵链相乘等内容。此外还概述了函数式编程、NP完全理论。如果你是计算机科学专业的学生,或是刚刚开启职业生涯的技术人员,想探索JavaScript的zui佳能力,这本书一定适合你。
内容简介
本书首先介绍了JavaScript 语言的基础知识以及ES6 和ES7 中引入的新功能,接下来讨论了数组、栈、队列、链表、集合、字典、散列表、树、图等数据结构,之后探讨了各种排序和搜索算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序、顺序搜索、二分搜索,然后介绍了动态规划和贪心算法等常用的高-级算法以及函数式编程,zui后还介绍了如何计算算法的复杂度。本书适用于前端Web 开发人员,以及所有对JavaScript 数据结构与算法感兴趣的读者。
目录
- 第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 ES6——Set 类 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 ES6——Map 类 118
- 7.4 ES6——WeakMap 类和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