《数据结构(第2版)》的主要任务是介绍并探讨有关数据组织、算法设计、时间和空间效率的概念和通用分析方法,帮助读者学会数据的组织方法和现实世界问题在计算机内部的表示方法,针对问题的应用背景分析,选择合适的数据结构,从而培养高级程序设计技能。 《数据结构(第2版)》第1章介绍了数据结构与算法的基本概念;第2章是对C语言关键内容的复习,为后续章节理解数据结构的实现做准备;第3章至第7章分别介绍了线性表、树、散列表、图、排序算法等经典数据结构与算法;最后在第8章通过对两个实际生活中提炼出的问题的解答,帮助读者更深刻地体会数据结构的应用。 《数据结构(第2版)》可作为高等学校计算机类专业“数据结构”课程的教材。
《数据结构(第2版)》特色:
《数据结构(第2版)》的主要任务是介绍并探讨有关数据组织、算法设计、时间和空间效率的概念和通用分析方法,帮助读者学会数据的组织方法和现实世界问题在计算机内部的表示方法,针对问题的应用背景分析,选择合适的数据结构,从而培养高级程序设计技能。
从实际应用问题出发,导出各种经典数据结构的定义、实现(存储)方法以及操作实现,并以更丰富的综合应用案例帮助读者增强对理论的感性认识,从而明白这些数据结构为什么存在、以及在什么情况下可以解决什么样的问题。
提供了丰富的学习资源,包括源代码及配套电子课件、浙江大学提供的在线系统PTA、《数据结构学习与实验指导(第2版)》等。读者可以通过使用这些学习资源随时检测自己的学习效果与编程能力。
“数据结构”是计算机类专业的重要专业基础课。它所讨论的知识内容和提倡的技术方法,无论对进一步学习计算机相关领域的其他课程,还是对从事大型信息工程的开发,都有着枢纽的作用。
解决问题往往有多种方法,且不同方法之间的效率可能相差甚远。解决问题方法的效率,与数据的组织方式有关,与空间的利用效率有关,也与方法的巧妙程度有关。本书的主要任务是介绍并探讨有关数据组织、算法设计、时间和空间效率的概念和通用分析方法,帮助读者学会数据的组织方法和现实世界问题在计算机内部的表示方法,针对问题的应用背景分析,选择合适的数据结构,从而培养高级程序设计技能。
本书的特点是从实际应用问题出发,导出各种经典数据结构的定义、实现(存储)方法以及操作实现,并以更丰富的综合应用案例帮助读者增强对理论的感性认识,从而明白这些数据结构为什么存在,以及在什么情况下可以最好地解决什么样的问题。
数据结构的思想和原理是不依赖于编程语言的,但对于每一个抽象概念的具体实现和应用则需要一种编程语言作为载体。本书根据国内多数学校计算机专业教学的实际情况,选择了C语言作为具体实现的语言,并提供了大量可以直接编译运行的源代码。不仅使得学生在学习时容易起步,可以在现有源代码的基础上不断修改扩充,从而解决更为复杂的问题,而且也为IT专业人士提供了方便的经典代码库。
本书第1章介绍了数据结构与算法的基本概念和两者的关联,重点介绍了抽象数据类型和算法复杂度的概念;第2章基本上是对C语言关键内容的复习,为后续章节理解数据结构的实现做准备;第3章介绍了线性表以及最基本的两种应用——堆栈和队列;第4章讨论一种重要的非线性结构——树,重点介绍了二叉树和搜索树,并将查找、哈夫曼树和集合表示等作为树形结构的应用进行了讨论;第5章通过对从海量信息中高效查找关键字问题的再思考,引出对散列表和经典哈希映射技术的讨论;第6章介绍图的各种表示方法和相关算法;第7章讨论了各种经典的排序算法;最后在第8章通过对两个实际生活中提炼出的问题的求解,帮助读者更深刻体会数据结构的应用。
读者可以根据自身的基础选择相应章节进行阅读,熟悉C语言的读者完全可以跳过第2章有关C语言基础的部分。目录中带*号的章节及习题中带*号的题目,是本书的扩展内容,读者可以在学习基础内容之后再阅读扩展内容。
本书作为第2版,除了修订第1版的错误外,还重新整理了全部源代码,提供了部分微视频,并提供了新的在线练习资源。希望读者能通过本书的学习提高实践能力,使数据结构与算法成为用计算机解决实际问题的有效工具。
陈越,浙江大学计算机科学与技术学院教授,教育部高等学校软件工程专业教学指导委员会委员。为程序设计能力标准化测试(PAT)系统的创始人。与何钦铭教授共同在“中国大学MOOC”和网易“云课程”平台开设在线开放课程“数据结构”,注册人数累计超过8万人。为国家精品课程“软件工程”、国家双语示范课程“数据结构与算法”、国家教学团队“程序设计系列课程教学团队”的负责人。曾获教学成果二等奖、浙江省教学成果一等奖、宝钢优秀教师奖等。
第1章 概论
1.1 引子
1.2 数据结构
1.2.1 定义
1.2.2 抽象数据类型
1.3 算法
1.3.1 定义
1.3.2 算法复杂度
1.3.3 渐进表示法
1.4 应用实例:最大子列和问题
本章小结
习题
第2章 数据结构实现基础
2.1 引子
2.2 数据存储基础
2.2.1 数组
2.2.2 类型定义typedef
2.2.3 指针
2.2.4 结构
2.2.5 链表
2.3 流程控制基础
2.3.1 分支控制
2.3.2 循环控制
2.3.3 函数与递归
本章小结
习题
第3章 线性结构
3.1 引子
3.2 线性表的定义与实现
3.2.1 线性表的定义
3.2.2 线性表的顺序存储实现
3.2.3 线性表的链式存储实现
3.2.4 广义表与多重链表
3.3 堆栈
3.3.1 堆栈的定义
3.3.2 堆栈的实现
3.3.3 堆栈应用:表达式求值
3.4 队列
3.4.1 队列的定义
3.4.2 队列的实现
3.5 应用实例
3.5.1 多项式加法运算
3.5.2 迷宫问题
本章小结
习题
第4章 树
4.1 引子
4.1.1 问题的提出
4.1.2 查找
4.2 树的定义、表示和术语
4.3 二叉树
4.3.1 二叉树的定义及其逻辑表示
4.3.2 二叉树的性质
4.3.3 二叉树的存储结构
4.3.4 二叉树的操作
4.4 二叉搜索树
4.4.1 二叉搜索树的定义
4.4.2 二叉搜索树的动态查找
4.4.3 二叉搜索树的插入
4.4.4 二叉搜索树的删除
4.5 平衡二叉树
4.5.1 平衡二叉树的定义
4.5.2 平衡二叉树的调整
4.6 树的应用
4.6.1 堆及其操作
4.6.2 哈夫曼树
4.6.3 集合及其运算
本章小结
习题
第5章 散列查找
5.1 引子
5.2 基本概念
5.3 散列函数的构造方法
5.3.1 数字关键词的散列函数构造
5.3.2 字符串关键词的散列函数构造
5.4 处理冲突的方法
5.4.1 开放定址法
5.4.2 分离链接法
5.5 散列表的性能分析
5.6 应用实例
本章小结
习题
第6章 图
6.1 引子
6.2 图的基本概念
6.2.1 图的定义和术语
6.2.2 图的抽象数据类型
6.3 图的存储结构
6.3.1 邻接矩阵
6.3.2 邻接表
6.4 图的遍历
6.4.1 迷宫探索
6.4.2 深度优先搜索
6.4.3 广度优先搜索
6.5 最小生成树
6.5.1 生成树的构建与最小生成树的概念
6.5.2 构造最小生成树的Prim算法
6.5.3 构造最小生成树的Kruskal算法
6.6 最短路径
6.6.1 单源最短路径
6.6.2 每一对顶点之间的最短路径
6.7 拓扑排序
6.8 关键路径计算
6.9 应用实例
6.9.1 六度空间理论
6.9.2 六度分隔理论的验证
本章小结
习题
第7章 排序
7.1 引子
7.2 选择排序
7.2.1 简单选择排序
7.2.2 堆排序
7.3 插入排序
7.3.1 简单插入排序
7.3.2 希尔排序
7.4 交换排序
7.4.1 冒泡排序
7.4.2 快速排序
7.5 归并排序
7.6 基数排序
7.6.1 桶排序
7.6.2 基数排序
7.6.3 单关键字的基数分解
7.7 外部排序
7.8 排序的比较和应用
7.8.1 排序算法的比较
7.8.2 排序算法应用案例
本章小结
习题
第8章 综合应用案例分析
8.1 银行排队问题
8.1.1 单队列多窗口服务
8.1.2 单队列多窗口+VIP服务
8.2 畅通工程问题
8.2.1 建设道路数量问题
8.2.2 最低成本建设问题
本章小结
习题
附录PTA使用说明
参考文献