前言
在过去的几年中,得益于Node.js和SpiderMonkey等平台,JavaScript越来越广泛地用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言(比如C++和Java)提供的工具。这些工具包括传统的数据结构(如链表、栈、队列、图等),也包括传统的排序和查找算法。本书讨论在使用JavaScript进行服务器端编程时,如何实现这些数据结构和算法。
JavaScript程序员会发现本书很有用,因为本书讨论了在JavaScript语言的限制下,如何实现数据结构和算法。这些限制包括:数组即对象、无处不在的全局变量、基于原型的对象模型等。JavaScript作为一种编程语言,名声有点“不大好”,但是本书展示了如何使用JavaScript语言中“好的一面”去实现高效的数据结构和算法,进而为JavaScript正名。
为什么要学习数据结构和算法
我假设本书的读者中,有很多人没接受过正规的计算机科学教育。如果你接受过,那么你已经知道了学习数据结构和算法为何如此重要。如果你没有计算机科学学位或者没有正规学习过计算机科学,那么请耐心读完本节。
计算机科学家尼克劳斯 ·沃思(Nicklaus Wirth)写过一本计算机程序设计教材,书名是《算法+数据结构=程序》(Algorithms+Data Structures=Programs, Prentice-Hall)。这个书名就概括了计算机编程的精要。除了“Hello world! ”等无关紧要的程序,任何一个有些规模的程序都需要某种类型的数据结构来保存程序中用到的数据,还需要一个或多个算法将数据从输入转换为输出。
对于那些没有在学校学习过计算机科学的程序员来说,唯一熟悉的数据结构就是数组。在处理一些问题时,数组无疑是很好的选择,但对于很多复杂的问题,数组就显得太过简陋了。大多数有经验的程序员都愿意承认这样一个事实:对于很多编程问题,当他们想出一个合适的数据结构,设计和实现解决这些问题的算法就变得手到擒来。
二叉查找树(BST)就是一个这样的例子。设计二叉查找树的目的是为了方便查找一组数据中的最小值和最大值,由这个数据结构自然引申出一个查找算法,该算法比目前最好的查找算法效率还要高。不熟悉二叉查找树的程序员可能会使用一个更简单的数据结构,但效率上就打了个折扣。
学习算法非常重要,因为解决同样的问题,往往可以使用多种算法。对于高效程序员来说,知道哪种算法效率最高非常重要。比如,现在至少有六七种排序算法,如果知道快速排序比选择排序效率更高,那么就会让排序过程变得高效。又比如,实现一个线性查找的算法很简单,但是如果知道有时二分查找可能比线性查找快两倍以上,那你势必会写出一个更好的程序。
深入学习数据结构和算法,不仅可以知道哪种数据结构和算法更高效,还会知道如何找出最适合解决手头问题的数据结构和算法。写程序,尤其是用JavaScript写程序时,经常需要权衡,知道了本书涵盖的数据结构和算法的优缺点,在解决具体的编程问题时就容易做出正确的选择。
阅读本书需要的工具
本书使用的编程环境是基于SpiderMonkey JavaScript引擎的JavaScript shell。第1章提供了该shell的下载说明。也可以使用其他一些JavaScript Shell,比如Node.js提供的JavaScript shell,你只需自己对书中的程序做一些转换,就能在Node.js上运行。除了JavaScript shell,再有一个用于编写JavaScript程序的文本编辑器就够了。
本书组织结构
· 第1章 简单概述JavaScript语言,至少介绍了本书用到的JavaScript特性。这一章还展示了贯穿全书的编程风格。
· 第2章 讨论计算机编程中最常见的数据结构:数组。数组是JavaScript原生的数据类型。
· 第3章 介绍我们实现的第一个数据结构:列表。
· 第4章 介绍栈。栈是一种贯穿计算机科学的数据结构,编译器和操作系统的实现都用到了栈。
· 第5章 讨论队列。队列是对你在银行或杂货店里所排队伍的一种抽象。队列广泛应用于处理数据之前,必须先把数据按顺序排成一队的模拟软件中。
· 第6章 介绍链表。链表是对列表的修改,链表里的每个元素都是一个单独的对象,该对象和它两边的元素相连。当程序中需要插入和删除多个元素时,使用链表非常高效。
· 第7章 展示如何实现和使用字典,字典是将数据存储为键值对的数据结构。
· 实现字典的一种方法是通过散列表,第8章讨论了如何实现散列表和在表中存储数据的散列算法。
· 第9章 介绍集合。和数据结构相关的书通常不会介绍集合,但是当某个数据集不允许有重复元素出现时,使用集合是一个很好的选择。
· 第10章 的重点是二叉树和二叉查找树。前面提到过,二叉查找树是一种存储有序元素的极佳选择。
· 第11章 介绍图和图的算法。图用来表示计算机网络节点或者地图上的城市等数据。
· 第12章 转向算法,讨论各种排序算法,包括简单易实现但处理大数据集时效率不高的算法,以及适合处理大数据集的复杂算法。
· 第13章 的主题还是算法,不过这回是查找算法,比如线性查找和二分查找。
· 第14章 是本书的最后一章,讨论两种更高级的算法——动态规划和贪心算法。这些算法能解决难题,通常的算法在面对这些问题时要么执行速度太慢,要么难于实现。我们会分析几个用动态规划和贪心算法解决的典型问题。
排版约定
本书使用的排版约定如下。
• 楷体
表示新的术语。
• 等宽字体
表示程序片段,也用于在正文中表示程序中使用的变量、函数名、命令行代码、环境变量、语句和关键字等元素。
• 等宽粗体
表示应该由用户逐字输入的命令或者其他文本。
• 等宽斜体
表示应该由用户输入的值或根据上下文决定的值替换的文本。
使用代码示例
可以在这里下载本书随附的资料(代码示例、练习题等):https://github.com/oreillymedia/data_structures_and_algorithms_using_javascript。
让本书助你一臂之力。也许你需要在自己的程序或文档中用到本书中的代码。除非大段大段地使用,否则不必与我们联系取得授权。例如,无需请求许可,就可以用本书中的几段代码写成一个程序。但是销售或者发布O'Reilly图书中代码的光盘则必须事先获得授权。引用书中的代码来回答问题也无需授权。将大段的示例代码整合到你自己的产品文档中则必须经过许可。
使用我们的代码时,希望你能标明它的出处,但不强求。出处一般包括书名、作者、出版商和ISBN,例如:Data Structure and Algorithms Using JavaScript , Michael McMillan著(O'Reilly,2014)。版权所有,978-1-449-36493-9。
如果还有关于使用代码的未尽事宜,可以随时与我们联系:permissions@oreilly.com。
Safari® Books Online
Safari Books Online(http://www.safaribooksonline.com)是应需而变的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。
Safari Books Online是技术专家、软件开发人员、Web设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的第一手资料。
对于组织团体、政府机构和个人,Safari Books Online提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O'Reilly Media、Prentice Hall Profes-sional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones &Bartlett、Course Technology以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online的更多信息,我们网上见。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
O'Reilly的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:
http://oreil.ly/data_structures_algorithms_JS。
对于本书的评论和技术性问题,请发送电子邮件到:
bookquestions@oreilly.com
要了解更多O'Reilly图书、培训课程、会议和新闻的信息,请访问以下网站:
我们在Facebook的地址如下:http://facebook.com/oreilly
请关注我们的Twitter动态:http://twitter.com/oreillymedia
我们的YouTube视频地址如下:http://www.youtube.com/oreillymedia
致谢
写成本书,需要感谢很多人。首先要感谢我的组稿编辑Simon St. Laurent,他对本书充满信心并鼓励我开始写作。Meghan Blanchette女士为了让我按时完成写作费尽心思,如果本书有过拖稿现象,那一定不是她的错。Brian MacDonald做了很多工作让本书变得通俗易懂,他编辑校订了本书的一些章节,文字比我当初的更清晰。我还要感谢技术审稿人,他们阅读了本书的全部文字和代码,并且指出了行文和代码表达不够清楚的地方。我的同事Cynthia Fehrenbach将我简陋的草图绘制成现在精美、清晰的插图,在本书将要出版的最后时刻,她还愿意重新绘制几幅插图,对此我要特别感谢她。最后,我要感谢在Mozilla工作的所有人,是他们设计了如此出色的JavaScript引擎和命令行工具,他们还为如何使用JavaScript语言和这个工具编写了非常棒的文档。