编辑推荐
随着JavaScript成功走出客户端,在服务器端编程中得到日益广泛的应用,JavaScript程序员需要实现与C#或Java等传统面向对象编程语言相似的数据结构与算法。本书是用JavaScript描述数据结构与算法的开山之作,汇聚了作者多年的实战经验。这本实战指南通过丰富的示例,向读者透彻讲解了在JavaScript环境下,如何通过一系列存储机制(包括链表、栈、队列和图)高效地达到编程目的。
内容简介
在过去几年中,JavaScript凭借Node.js和SpiderMonkey等平台,在服务器端编程中得到了广泛应用。JavaScript程序员因而迫切需要使用传统语言(比如C++和Java)提供的工具,包括传统的数据结构以及传统的排序和查找算法。《图灵程序设计丛书:数据结构与算法JavaScript描述》讨论在数组即对象、无处不在的全局变量、基于原型的对象模型等JavaScript语言的环境下,如何实现高效的数据结构和算法。
《图灵程序设计丛书:数据结构与算法JavaScript描述》适合JavaScript程序员以及对JavaScript语言感兴趣的学习者,特别是在学校中没有系统学习过计算机科学相关课程的“跨界”程序员。
作者简介
麦克米伦(Michael McMillan),作为大学老师和程序员,曾编写过多部受到好评的数据结构与算法图书,包括Data Structures and Algorithms Using C#、Data Structures and Algorithms Using Visual Basic.NET,以及其他计算机教程,如Object-Oriented Programming with Visual Basic.NET、C++ Programming: An Introduction、Java Programming Tutorial、Perl from the Ground Up等。Michael现在阿肯色州北小石城普瓦斯基技术学院当讲师,教授计算机信息系统。他还是北小石城阿肯色大学的兼职讲师,教授信息科学。在做讲师之前,他曾是阿肯色儿童医院的一名程序设计师/分析师,负责统计计算和数据分析。
王群锋,1981年生于陕西省富平县桥西大队三里村,2004年毕业于西安电子科技大学。毕业后当了一名程序员,现居西安,在IBM西安研发中心从事下一代统计预测软件的开发工作。
杜欢,淘宝网高级技术专家,2012年加入淘宝,曾就职于雅虎台湾及CISCO。对前端架构、前后端协作有自己的见解,专注于Web产品设计、可用性实施,热爱标准化。
内页插图
精彩书评
★本书对前端工程师是非常好的数据结构与算法入门书籍,它的难度非常适合前端工程师来补习基础知识。
——程劭非,阿里无线事业部高级技术专家
目录
推荐序
前言
第1章 JavaScript的编程环境和模型
1.1 JavaScript环境
1.2 JavaScript编程实践
1.2.1 声明和初始化变量
1.2.2 JavaScript中的算术运算和数学库函数
1.2.3 判断结构
1.2.4 循环结构
1.2.5 函数
1.2.6 变量作用域
1.2.7 递归
1.3 对象和面向对象编程
1.4 小结
第2章 数组
2.1 JavaScript中对数组的定义
2.2 使用数组
2.2.1 创建数组
2.2.2 读写数组
2.2.3 由字符串生成数组
2.2.4 对数组的整体性操作
2.3 存取函数
2.3.1 查找元素
2.3.2 数组的字符串表示
2.3.3 由已有数组创建新数组
2.4 可变函数
2.4.1 为数组添加元素
2.4.2 从数组中删除元素
2.4.3 从数组中间位置添加和删除元素
2.4.4 为数组排序
2.5 迭代器方法
2.5.1 不生成新数组的迭代器方法
2.5.2 生成新数组的迭代器方法
2.6 二维和多维数组
2.6.1 创建二维数组
2.6.2 处理二维数组的元素
2.6.3 参差不齐的数组
2.7 对象数组
2.8 对象中的数组
2.9 练习
第3章 列表
3.1 列表的抽象数据类型定义
3.2 实现列表类
3.2.1 append:给列表添加元素
3.2.2 remove:从列表中删除元素
3.2.3 find:在列表中查找某一元素
3.2.4 length:列表中有多少个元素
3.2.5 toString:显示列表中的元素
3.2.6 insert:向列表中插入一个元素
3.2.7 clear:清空列表中所有的元素
3.2.8 contains:判断给定值是否在列表中
3.2.9 遍历列表
3.3 使用迭代器访问列表
3.4 一个基于列表的应用
3.4.1 读取文本文件
3.4.2 使用列表管理影碟租赁
3.5 练习
第4章 栈
4.1 对栈的操作
4.2 栈的实现
4.3 使用Stack类
4.3.1 数制间的相互转换
4.3.2 回文
4.3.3 递归演示
4.4 练习
第5章 队列
5.1 对队列的操作
5.2 一个用数组实现的队列
5.3 使用队列:方块舞的舞伴分配问题
5.4 使用队列对数据进行排序
5.5 优先队列
5.6 练习
第6章 链表
6.1 数组的缺点
6.2 定义链表
6.3 设计一个基于对象的链表
6.3.1 Node类
6.3.2 LinkedList类
6.3.3 插入新节点
6.3.4 从链表中删除一个节点
6.4 双向链表
6.5 循环链表
6.6 链表的其他方法
6.7 练习
第7章 字典
7.1 Dictionary类
7.2 Dictionary类的辅助方法
7.3 为Dictionary类添加排序功能
7.4 练习
第8章 散列
8.1 散列概览
8.2 HashTable类
8.2.1 选择一个散列函数
8.2.2 一个更好的散列函数
8.2.3 散列化整型键
8.2.4 对散列表排序、从散列表中取值
8.3 碰撞处理
8.3.1 开链法
8.3.2 线性探测法
8.4 练习
第9章 集合
9.1 集合的定义、操作和属性
9.1.1 集合的定义
9.1.2 对集合的操作
9.2 Set类的实现
9.3 更多集合操作
9.4 练习
第10章 二叉树和二叉查找树
10.1 树的定义
10.2 二叉树和二叉查找树
10.2.1 实现二叉查找树
10.2.2 遍历二叉查找树
10.3 在二叉查找树上进行查找
10.3.1 查找最小值和最大值
10.3.2 查找给定值
10.4 从二叉查找树上删除节点
10.5 计数
10.6 练习
第11章 图和图算法
11.1 图的定义
11.2 用图对现实中的系统建模
11.3 图类
11.3.1 表示顶点
11.3.2 表示边
11.3.3 构建图
11.4 搜索图
11.4.1 深度优先搜索
11.4.2 广度优先搜索
11.5 查找最短路径
11.5.1 广度优先搜索对应的最短路径
11.5.2 确定路径
11.6 拓扑排序
11.6.1 拓扑排序算法
11.6.2 实现拓扑排序算法
11.7 练习
第12章 排序算法
12.1 数组测试平台
12.2 基本排序算法
12.2.1 冒泡排序
12.2.2 选择排序
12.2.3 插入排序
12.2.4 基本排序算法的计时比较
12.3 高级排序算法
12.3.1 希尔排序
12.3.2 归并排序
12.3.3 快速排序
12.4 练习
第13章 检索算法
13.1 顺序查找
13.1.1 查找最小值和最大值
13.1.2 使用自组织数据
13.2 二分查找算法
13.3 查找文本数据
13.4 练习
第14章 高级算法
14.1 动态规划
14.1.1 动态规划实例:计算斐波那契数列
14.1.2 寻找最长公共子串
14.1.3 背包问题:递归解决方案
14.1.4 背包问题:动态规划方案
14.2 贪心算法
14.2.1 第一个贪心算法案例:找零问题
14.2.2 背包问题的贪心算法解决方案
14.3 练习
封面介绍
前言/序言
在过去的几年中,得益于Node.js和SpiderMonkey等平台,JavaScript越来越广泛地用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言(比如C++和Java)提供的工具。这些工具包括传统的数据结构(如链表、栈、队列、图等),也包括传统的排序和查找算法。《图灵程序设计丛书:数据结构与算法JavaScript描述》讨论在使用JavaScript进行服务器端编程时,如何实现这些数据结构和算法。
JavaScript程序员会发现《图灵程序设计丛书:数据结构与算法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章 实现字典的一种方法是通过散列表,第8章讨论了如何实现散列表和在表中存储数据的散列算法。
第9章 介绍集合。和数据结构相关的书通常不会介绍集合,但是当某个数据集不允许有重复元素出现时,使用集合是一个很好的选择。
第10章 重点是二叉树和二叉查找树。前面提到过,二叉查找树是一种存储有序元素的极佳选择。
第11章 介绍图和图的算法。图用来表示计算机网络节点或者地图上的城市等数据。
第12章 转向算法,讨论各种排序算法,包括简单易实现但处理大数据集时效率不高的算法,以及适合处理大数据集的复杂算法。
第13章 主题还是算法,不过这回是查找算法,比如线性查找和二分查找。
第14章 本书的最后一章,讨论两种更高级的算法——动态规划和贪心算法。
这些算法能解决难题,通常的算法在面对这些问题时要么执行速度太慢,要么难于实现。我们会分析几个用动态规划和贪心算法解决的典型问题。
图灵程序设计丛书:数据结构与算法JavaScript描述 电子书 下载 mobi epub pdf txt