在过去的几年中,得益于Node.js和SpiderMonkey这样的平台,JavaScript越来越多地被用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言,比如C++和Java提供的工具。这些工具包括经典的数据结构,如链表、栈、队列、图等,也包括经典的排序和查找算法。本书即讨论了在使用JavaScript进行服务器端编程时,如何实现这些经典的数据结构和算法。
JavaScript程序员会发现本书很有用,因为本书讨论了在JavaScript语言的限制之下,如何实现经典的数据结构和算法。这些限制包括:数组即对象、无处不在的全局变量、基于原型的对象模型等。JavaScript作为一种编程语言,名声有点“不大好”,但是本书展示了如何使用JavaScript语言中“好的一面”去实现高效的数据结构和算法。
我假设本书的读者中,有很多人没接受过正规的计算机科学教育。如果你接受过正规的计算机科学教育,那么,你已经知道了学习数据结构和算法为何如此重要。如果你没有一个计算机科学的学位或者没有正规学习过计算机科学,那么请耐心读完本节。
计算机科学家Nicklaus Wirth写过一本书,书名叫:算法 + 数据结构 = 程序 (Prentice-Hall)。这个书名就概括了计算机编程的精要。除过那些儿戏式的程序,比如“Hello world!”,任何一个有些规模的程序都需要某种形式的数据结构来保存程序中用到的数据,还需要一个或多个算法将数据从输入转换为输出。
对于那些没有在学校学习过计算机科学的程序员来说,唯一熟悉的数据结构就是数组。在处理一些问题时,数组无疑是很好的,但对于很多复杂的问题,数组就显得太过简陋了。大多数有经验的程序员都愿意承认这样一个事实:对于很多编程问题,当他们想出一个合适的数据结构,设计和实现解决这些问题的算法就变得手到擒来。
二叉查找树(BST)就是一个这样的例子。设计二叉查找树的目的是为了方便查找一组数据中的最小值和最大值,由这个数据结构自然引申出一个查找算法,该算法比市面上最好的查找算法效率还要高。不熟悉二叉查找树(BST)的程序员可能会使用一个更简单的数据结构,效率上就打了个折扣。
学习算法非常重要,因为解决同样的问题,往往存在多种算法,知道哪种算法效率最高对一个高效的程序员非常重要。比如,现在至少有六、七种排序算法,如果知道快速排序比选择排序效率更高,那么就会让排序过程变得高效。又比如,实现一个线性查找的算法很简单,但是如果知道有时二分查找可能比线性查找快两倍以上,势必会写出一个更好的程序。
深入学习数据结构和算法,不仅是学习哪种数据结构或算法更高效,还要学习在数据结构和算法之间做出选择,哪种数据结构和算法对你手头上的问题是最合适的?写程序,尤其是拿JavaScript写程序时,经常会面临这样的权衡,知道了本书覆盖到的数据结构和算法的优缺点,可以在解决任何特定问题时帮助你做出正确的选择。
本书使用的编程环境是基于SpiderMonkey JavaScript引擎提供的JavaScript Shell。第一章提供了下载和安装该shell的说明。也可以使用其他一些JavaScript Shell,比如Node.js提供的JavaScript Shell,但是你需要自己对书中的程序做一些转换,以便可以运行在Node.js上。除了JavaScript Shell,再有一个文本编辑器就够了,你将使用文本编辑器编写JavaScript程序。