前言

前言

JavaScript是当下最流行的编程语言之一。由于浏览器的原生支持(无须安装任何插件),JavaScript也被称作“互联网语言”。JavaScript的应用非常广泛,不仅用于前端开发,也被用到服务器(Node.js)环境、数据库(MongoDB)环境和移动设备中,同样还被用在嵌入式设备和物联网(IoT)设备中。

对任何专业技术人员来说,理解数据结构都非常重要。作为软件开发者,我们要能够借助编程语言来解决问题,而数据结构是这些问题的解决方案中不可或缺的一部分。如果选择了不恰当的数据结构,可能会影响所写程序的性能。因此,了解不同数据结构和它们的适用范围十分重要。

算法在计算机科学中扮演着非常重要的角色。解决一个问题有很多种方法,但有些方法会比其他方法更好。因此,了解一下最著名的算法也很重要。

本书为数据结构和算法初学者所写,也为熟悉数据结构和算法并想在JavaScript语言中使用它们的人所写。

快乐地编码吧!

读者对象

如果你是一名计算机专业的学生,或者正处于技术生涯的开端,想要探索JavaScript最强大的功能,那么本书正适合你。如果你已经对编程很熟悉,但是想要提升在算法和数据结构方面的技能,本书同样适合你。

你只需要懂得JavaScript的基础知识和编程逻辑,就可以开始享受算法的乐趣了。

本书结构

第1章“JavaScript简介”,讲述了JavaScript的基础知识,可以帮助你更好地学习数据结构和算法,同时还介绍了如何搭建开发环境来运行书中的代码示例。

第2章“ECMAScript和TypeScript概述”,介绍了2015年后新增的一些JavaScript功能,以及TypeScript的基本功能。TypeScript是JavaScript的一个超集。

第3章“数组”,介绍了如何使用数组这种最基础且最常用的数据结构。这一章演示了如何对数组声明、初始化、添加和删除其中的元素,还讲述了如何使用JavaScript语言本身支持的数组方法。

第4章“栈”,介绍了栈这种数据结构,演示了如何创建栈以及怎样添加和删除元素,还讨论了如何用栈解决计算机科学中的一些问题。

第5章“队列和双端队列”,详述了队列这种数据结构,演示了如何创建队列,以及如何添加和删除队列中的元素。此外,这一章也介绍了一种特殊的队列——双端队列数据结构。这一章还讨论了如何用队列解决计算机科学中的一些问题,以及栈和队列的主要区别。

第6章“链表”,讲解如何用对象和指针从头创建链表这种数据结构。这一章除了讨论如何声明、创建、添加和删除链表元素之外,还介绍了不同类型的链表,例如双向链表和循环链表。

第7章“集合”,介绍了集合这种数据结构,讨论了如何用集合存储非重复性的元素。此外,还详述了对集合的各种操作以及相应代码的实现。

第8章“字典和散列表”,深入讲解字典、散列表及它们之间的区别。这一章介绍了这两种数据结构是如何声明、创建和使用的,还探讨了如何解决散列冲突,以及如何创建更高效的散列函数。

第9章“递归”,介绍了递归的概念,描述了声明式和递归式算法之间的区别。

第10章“树”,讲解了树这种数据结构和它的相关术语,重点讨论了二叉搜索树,以及如何在树中搜索、遍历、添加和删除节点。这一章还介绍了自平衡树,包括AVL树和红黑树。

第11章“二叉堆和堆排序”,介绍了最小堆和最大堆数据结构,以及怎样使用堆作为一个优先队列,还讨论了著名的堆排序算法。

第12章“图”,介绍了图这种数据结构和它的适用范围。这一章讲述了图的常用术语和不同表示方式,探讨了如何使用深度优先搜索算法和广度优先搜索算法遍历图,以及它们的适用范围。

第13章“排序和搜索算法”,探讨了常用的排序算法,如冒泡排序(包括改进版)、选择排序、插入排序、归并排序和快速排序。这一章还介绍了计数排序和基数排序这两种分布式排序算法,搜索算法中的顺序搜索和二分搜索,以及怎样随机排列一个数组。

第14章“算法设计与技巧”,介绍了一些算法技巧和著名的算法,以及JavaScript函数式编程。

第15章“算法复杂度”,介绍了大O表示法的概念,以及本书实现算法的复杂度列表。这一章还介绍了NP完全问题和启发式算法。最后,讲解了提升算法能力的诀窍。

阅读须知

尽管本书第1章对JavaScript进行了简单介绍,你仍然需要了解基本的JavaScript知识和编程逻辑。

要测试本书提供的代码示例,你需要一个代码编辑器(例如Atom或Visual Studio Code)以便阅读代码,还需要一个浏览器(Chrome、Firefox或Edge)。

你也可以访问https://javascript-ds-algorithms-book.firebaseapp.com/,在线测试代码。同样,记得打开浏览器中的开发者工具,这样你就可以看到控制台上的输出结果了。

下载示例代码

你可以用你的账户从http://www.packtpub.com下载所有已购买Packt图书的示例代码文件。如果你从其他地方购买了本书,可以访问http://www.packtpub.com/support并注册,我们将通过电子邮件把文件发送给你。

下载代码文件的步骤如下:

(1) 在www.packtpub.com登录或注册;

(2) 选择SUPPORT标签页;

(3) 点击Code Downloads & Errata

(4) 在Search框中输入书名并根据屏幕上的指示操作。

文件下载后,请使用以下软件的最新版本解压:

  • Windows系统请使用WinRAR或7-Zip
  • Mac系统请使用Zipeg、iZip或UnRarX
  • Linux系统请使用7-Zip或PeaZip

本书的代码包在GitHub的托管地址是https://github.com/PacktPublishing/Learning-JavaScript-Data-Structures-and-Algorithms-Third-Edition。只要代码有更新,它就会被更新到GitHub仓库中去。

其他图书或视频的代码包也可以到https://github.com/PacktPublishing/查阅。别错过!

排版约定

在本书中,你会发现一些不同的文本样式。

正文中的代码这样表示:“可能你在网上的一些例子里看到过JavaScript的include语句,或者放在head标签中的JavaScript代码。”

代码段的格式如下:

class Stack {
  constructor() {
    this.items = []; // {1}
  }
}

如果我们想让你重点关注代码段中的某个部分,会加粗显示:

const stack = new Stack();
console.log(stack.isEmpty()); // outputs true

所有的命令行输入或输出的格式如下:

npm install http-server -g

新术语、重点词汇,以及你可以在屏幕上看到的词(例如,菜单或对话框里的词)以黑体标示。举个例子:“从Administration面板中选择System info。”

 此图标表示警告或需要特别注意的内容。

 此图标表示提示或者技巧。

联系我们

欢迎提出反馈。

一般反馈:请发送电子邮件至feedback@packtpub.com,并在邮件主题中注明书名。如果你对本书任何方面有疑问,请发送邮件至questions@packtpub.com

勘误:尽管我们会尽力确保内容准确,错误还是在所难免。如果你发现了书中的错误,希望你能告知我们,我们不胜感激。请访问www.packtpub.com/submit-errata,选择你的书,点击勘误提交表单的链接,并输入详情。1

1针对本书中文版的勘误,请到http://www.ituring.com.cn/book/2653查看和提交。——编者注

反盗版:如果你在互联网上发现我们的作品被非法复制,我们会非常感激你将地址和网站名称提供给我们。请将盗版材料的链接发送到copyright@packtpub.com

如果你有兴趣成为作者:如果你有某个主题的专业知识,并且有兴趣写成或帮助促成一本书,请参考我们的作者指南www.packtpub.com/authors

评论

请留下一条评论。当你阅读并使用本书后,何不在你购买本书的网站上留下一条评论呢?潜在的读者可通过你公正的评论来决定是否购买,Packt的工作人员可以知道你对我们产品的看法,我们的作者能看到你对他们的反馈。谢谢!

要了解更多有关Packt的信息,请访问packtpub.com

电子书

扫描如下二维码,即可购买本书电子版。

{%}

目录

  • 版权声明
  • 致谢
  • 前言
  • 第 1 章 JavaScript简介
  • 第 2 章 ECMAScript和TypeScript概述
  • 第 3 章 数组
  • 第 4 章 栈
  • 第 5 章 队列和双端队列
  • 第 6 章 链表
  • 第 7 章 集合
  • 第 8 章 字典和散列表
  • 第 9 章 递归
  • 第 10 章 树
  • 第 11 章 二叉堆和堆排序
  • 第 12 章 图
  • 第 13 章 排序和搜索算法
  • 第 14 章 算法设计与技巧
  • 第 15 章 算法复杂度