学习 JavaScript 数据结构与算法

🌙
手机阅读
本文目录结构

学习 JavaScript 数据结构与算法

编辑推荐

数据结构是计算机为了高效地利用资源而组织数据的一种方式。数据结构与算法是解决一切编程问题的基础。本书用 JavaScript 语言介绍了各种数据结构与算法,通俗易懂、循序渐进,有助于计算机科学专业的学生和刚刚开启职业生涯的技术人员探索 JavaScript。 相较于上一版,这一版新增了“ECMAScript 和 TypeScript 概述”“递归”“二叉堆和堆排序”和“算法设计与技巧”四章,介绍了 ECMAScript 2017 的新特性和 TypeScript 的基本功能,补充了双端队列、黑红树、堆排序算法,以及计数排序和基数排序等内容,另外还概述了 Fisher-Yates 随机算法和回溯算法(迷宫老鼠问题和数独解题器),等等。 - 在数组、栈和队列中声明、初始化、添加和删除元素 - 创建并使用链表、双向链表和循环链表 - 用散列表、字典和集合存储的元素 - 探索二叉树和二叉搜索树的用法 - 使用冒泡排序、选择排序、插入排序、归并排序和快速排序等算法排序数据结构 - 使用顺序搜索和二分搜索等算法搜索数据结构中的元素

内容简介

本书首先介绍了 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

AXIHE / 精选教程

浏览全部教程

HTML

CSS

JS

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

如果你加我的私人微信,麻烦写上您的 称呼,所在地区,职业,方便我备注,谢谢


本站的微信公众号

阿西河前端教程

Anbang

安邦的私人微信

微信号: yaolushan

Anbang

Bilibili(B站)

朱安邦

Anbang