数据结构与算法是计算机、软件工程等相关专业一门非常重要的专业基础和核心课程。《深入浅出数据结构与算法:微课视频版》内容全面,语言通俗易懂,所选案例典型、丰富,结构清晰,重难点突出,所有算法均已实现,可直接运行。《深入浅出数据结构与算法:微课视频版》共分为四篇,内容包括数据结构概述,数据结构与算法基础,线性表,栈和队列,串、数组与广义表,树,图,查找,排序,回溯算法,贪心算法,分治算法,实用算法等。另外,《深入浅出数据结构与算法:微课视频版》赠送同步微视频、教学大纲、案例源代码和PPT课件,方便读者学习和使用。 《深入浅出数据结构与算法:微课视频版》可作为计算机软件开发、准备考取计算机专业研究生和参加软考人员学习数据结构与算法的参考书,也可作为计算机、软件工程及相关专业的教材。
读者对象
《深入浅出数据结构与算法:微课视频版》可作为计算机软件开发、准备考取计算机专业研究生和参加软考人员学习数据结构与算法的参考书,也可作为计算机、软件工程及相关专业的教材。
本书特色
★★内容全面:涵盖数据结构所有知识点,所有算法采用C语言实现,其代码均在Visual Studio环境下调试通过,所有案例均提供完整的程序,无须修改就能直接运行。
★★重难点突出:每一章均给出了重点和难点提示,针对重点和难点问题,通过理论讲解、示例、算法实现和丰富的图表进行展示。
★★案例丰富、典型:针对每部分学习内容,精选了全国重点高校和全国统考试题、软考试题进行讲解,每个案例均提供算法思想讲解和源码。
★★语言通俗易懂:深入剖析了C语言中难点:指针、链表、函数传值调用和传地址调用等,常用算法实现。采用通俗的语言讲解数据结构中抽象的概念,通过以图表和案例的方式分析算法思想,便于读者真正理解和掌握。在内容的讲解上,语言描述通俗易懂、循序渐进。
★★资源丰富:配套微课视频、例题代码、PPT课件和教学大纲。
在讲授数据结构时,常常发现不少学生对于C语言掌握得不扎实,导致学习数据结构与算法时比较困难,对教材中的算法一知半解,甚至不去关注算法的实现,至于独立设计与实现算法更是一件困难的事情。平时仅满足于大致思想的理解,到考研时,才不得不花大量的时间去学习算法,但这时未必能快速领会其中的算法思想。若有一本涵盖C语言基础、数据结构及算法实现的图书,由浅入深地讲解C语言难点,并详细分析算法,可能对读者理解和掌握数据结构非常有帮助。
数据结构与算法是计算机、软件工程等相关专业的一门非常重要的核心课程和专业基础课程,是继续深入学习后续课程(如算法设计与分析、操作系统、编译原理、人工智能、机器学习等)的重要基础。随着计算机应用领域的不断发展和与日俱增的海量数据信息,数据结构在系统软件设计和应用软件设计方面的重要作用更加突出。因此,掌握扎实的数据结构与算法的基本知识和技能对于今后的专业学习和软件开发显得格外重要。在学习数据结构与算法时,不仅要学会如何抽象建模、理解数据元素之间的关系、算法思想,还要能将算法用C/C /Java等高级语言实现。
在学习数据结构与算法的过程中,许多专业术语较为抽象,对于初学者来说,有些概念及算法不容易理解和掌握,若语言掌握得不够深入,更增加了学习的难度。《深入浅出数据结构与算法:微课视频版》深入剖析了C语言中的难点:指针、链表、函数传值调用和传地址调用等,常用算法实现。《深入浅出数据结构与算法:微课视频版》采用通俗易懂的语言讲解数据结构中抽象的概念,通过以图表和案例的方式分析算法思想,便于读者真正理解和掌握。《深入浅出数据结构与算法:微课视频版》内容全面,涵盖数据结构所有知识点,所有算法采用C语言实现,其代码均在Visual Studio环境下调试通过,所有案例均提供完整的程序,无须修改就能直接运行。
《深入浅出数据结构与算法:微课视频版》凝结了作者多年来的数据结构与算法学习与教学实践经验,针对每一部分内容,精选了涵盖所有知识点的典型案例,这些案例有的来自各重点高校和全国统考试题,有的来自于软考、各大公司笔试面试题目。在内容的讲解上,语言描述通俗易懂、循序渐进,另外还配套了微课视频讲解,视频讲解更加针对重点、难点进行分析,以便读者理解和掌握。所有算法均提供了完整代码实现,最后还提供了C语言程序调试技术的讲解。通过学习《深入浅出数据结构与算法:微课视频版》,不仅能帮助读者掌握数据结构与算法理论知识,还能提高C语言编程和调试技术,培养解决复杂工程问题的能力。
《深入浅出数据结构与算法:微课视频版》赠送同步微视频、案例源代码、教学大纲和PPT课件,方便读者学习和使用,读者可扫描下方二维码下载获取相关资源。
PPT课件
《深入浅出数据结构与算法:微课视频版》适用于想全面系统地掌握数据结构与算法的读者,特别是学习数据结构与算法时感到困惑的读者。可作为学习数据结构的自学教材,也可作为计算机、软件工程等相关专业学生的考研辅导用书和参加软考人员的辅导用书。
有这么多热心读者关心和支持《深入浅出数据结构与算法:微课视频版》的出版,我感到非常欣慰,在此也对所有关注《深入浅出数据结构与算法:微课视频版》的朋友们说声谢谢!希望今后能有更多的朋友关注《深入浅出数据结构与算法:微课视频版》,提出更多的改进建议。
为什么要学习数据结构与算法
如果你打算今后从事软件开发,或从事计算机科研、教学等工作,必须学好数据结构与算法。首先,数据结构与算法作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你必须学好它;其次,数据结构与算法是计算机软考、计算机等级考试等相关考试的必考内容之一,要是想顺利通过这些专业考试,你也必须学好它;最后,数据结构与算法还是你今后毕业,进入各软件公司、事业单位的必考内容之一,如果你想获得一份满意的工作,同样必须学好它。
即使你没有以上考虑,作为一名计算机从业人员和爱好者,数据结构与算法是其他后续计算机专业课程的基础,人工智能、机器学习等许多课程都会用到数据结构与算法方面的知识。要想学好计算机,数据结构与算法是必须掌握的内容。
如何学好数据结构与算法
经常有学生问我诸如如何学好C语言如何学好Java程序设计如何学好数据结构与算法这样的问题,我总是会告诉他们多看书,多上机。尽管在上课时我反复强调看书和上机的重要性,学习这些语言、数据结构与算法并没有什么所谓的捷径,但还是有不少学生依然想要寻求所谓的技巧。
对于初学者来说,数据结构这门课有许多抽象的概念,不太容易掌握。万事开头难,只要你掌握了学习方法和技巧,学任何东西就会变得很容易,学习数据结构也是如此。要想学好数据结构,首先应该有信心,要有战胜困难的决心,不要有畏惧心理,一开始每个人都会遇到困难,重要的是坚持。路虽远,行则将至;事虽难,做则必成。腾讯原副总裁吴军博士曾这样说过:成功的道路并不像想象的那么拥挤,因为在人生的马拉松长路上,绝大多数人跑不到一半就主动退下来了。到后来,剩下的少数人不是嫌竞争对手太多,而是发愁怎样找一个同伴陪自己一同跑下去。因此,我们能够跑得更远,仅仅是因为我们还在跑,如此而已。任何事情都是这样,学习亦如此。其次就是要掌握好C语言,C语言是基础,因为《深入浅出数据结构与算法:微课视频版》中的算法都是用C语言描述的(其他大多数数据结构图书也采用C语言描述),即使之前没有掌握好C语言也没有关系,只要有C语言基础就行,可以边学数据结构边巩固C语言知识。最后一点就是多上机,勤思考。《深入浅出数据结构与算法:微课视频版》中所有算法都用C语言表述,并给出完整程序,刚开始时只需要把程序看懂,然后多上机调试程序,练习并掌握C语言编程和调试技巧,这样就可以对数据结构中的算法思想融会贯通,真正领会其中的内涵。
通过《深入浅出数据结构与算法:微课视频版》通俗的讲解,加上自己多动手上机实践,学习数据结构与算法就会变得很轻松。
如何使用《深入浅出数据结构与算法:微课视频版》
《深入浅出数据结构与算法:微课视频版》涵盖了数据结构与算法几乎所有知识,案例选取丰富,讲解的过程中引入了作者对数据结构与算法的理解。《深入浅出数据结构与算法:微课视频版》用通俗易懂的语言描述抽象的概念,配套视频针对重点和难点进行讲解,方便读者理解与学习。
《深入浅出数据结构与算法:微课视频版》可以作为学习数据结构与算法的自学教材,也可以作为案头必备的参考书,值得收藏。《深入浅出数据结构与算法:微课视频版》很适合初学数据结构与算法的读者阅读,也可作为参加计算机考研学生的辅导书。
在使用《深入浅出数据结构与算法:微课视频版》过程中,可以边看书,边看视频讲解,视频讲解主要针对《深入浅出数据结构与算法:微课视频版》中的难点和重点,每学完一部分内容,可通过调试《深入浅出数据结构与算法:微课视频版》配套的代码认真领会算法的思想,并思考为什么要这样实现,从而加深对数据结构中概念的理解。
相信在学完《深入浅出数据结构与算法:微课视频版》后,读者会在数据结构和算法方面有很大的收获。预祝大家在学习《深入浅出数据结构与算法:微课视频版》时有一个愉快的旅程。
《深入浅出数据结构与算法:微课视频版》由陈锐、张亚洲、崔建涛、李璞编著,参与编写的人员还有戎璐、闫玉红、范乃梅、韩朴杰、楚杨阳和张祖菡。
致谢
感谢帮助《深入浅出数据结构与算法:微课视频版》问世的所有人,尤其是在清华大学出版社的帮助下,《深入浅出数据结构与算法:微课视频版》才得以顺利出版。
耿国华老师在数据结构与算法领域有很高的造诣,她在数据结构与算法方面给了我很大启发。
最后还要感谢郑州轻工业大学全体同仁在工作上的帮助及对我写作上的关心与支持。
在编写《深入浅出数据结构与算法:微课视频版》的过程中,参阅了大量相关教材、著作,个别案例也参考了网络资源,在此向各位原著者致敬!
由于编写时间仓促,水平所限,书中难免存在一些不足之处,恳请读者不吝赐教。
编 者
2022年月11月
陈锐,硕士生导师,中国人工智能学会情感智能专委会委员、中国图像图形学学会人机交互专委会委员。目前从事数据结构与算法、大数据分析与处理等方面的教学工作,以及人工智能、推荐系统方面的科研工作。主持/参与国家、省部级科研项目10余项,出版《数据结构(C语言实现)》《数据结构与算法详解》《数据结构(C语言实现 微课视频)》《Python机器学习实践》《Python数据结构与算法》等多部作品,其中两部获批省部级规划教材立项建设。
张亚洲,博士,硕士生导师,主持国家自然科学基金1项,主持省级科研项目1项,发表SCI论文10余篇。
崔建涛,副教授,出版《计算机网络技术实践教程》,指导多名学生参加各类竞赛获国家、省级奖励。
李璞,博士,硕士生导师,目前从事Web框架技术、人工智能方面的教学工作,以及人工智能方面的科研工作。主持/参与国家、省部级科研项目10余项,发表SCI论文多篇。
第1章 数据结构概述
1.1 为什么要学习数据结构
1.2 基本概念和术语
1.3 数据的逻辑结构与存储结构
1.3.1 逻辑结构
1.3.2 存储结构
1.4 抽象数据类型及其描述
1.4.1 什么是抽象数据类型
1.4.2 抽象数据类型的描述
1.5 算法
1.5.1 数据结构与算法的关系
1.5.2 什么是算法
1.5.3 算法的五大特性
1.5.4 算法的描述方式
1.6 算法分析
1.6.1 算法设计的4个目标
1.6.2 算法效率评价
1.6.3 算法时间复杂度
1.6.4 算法空间复杂度
1.7 学好数据结构的秘诀
第2章 数据结构与算法基础
2.1 递归与非递归
2.1.1 函数的递归调用
2.1.2 递归应用举例
2.1.3 迭代与递归
2.2 指针
2.2.1 什么是指针
2.2.2 指针变量的间接引用
2.2.3 指针与数组
2.2.4 指针函数与函数指针
2.3 参数传递
2.3.1 传值调用
2.3.2 传地址调用
2.4 结构体
2.4.1 结构体的定义
2.4.2 指向结构体的指针
2.4.3 用typedef定义数据类型
2.5 小结
第二篇 线性数据结构
第3章 线性表
3.1 线性表的定义及抽象数据类型
3.1.1 线性表的逻辑结构
3.1.2 线性表的抽象数据类型
3.2 线性表的顺序表示与实现
3.2.1 线性表的顺序存储结构
3.2.2 顺序表的基本运算
3.2.3 顺序表的实现算法分析
3.2.4 顺序表的优缺点
3.2.5 顺序表应用举例
3.3 线性表的链式表示与实现
3.3.1 单链表的存储结构
3.3.2 单链表上的基本运算
3.3.3 单链表存储结构与顺序存储结构的优缺点
3.3.4 单链表应用举例
3.4 循环单链表
3.5 双向链表
3.5.1 双向链表的存储结构
3.5.2 双向链表的插入和删除操作
3.5.3 双向链表应用举例
3.6 综合案例:一元多项式的表示与相加
3.6.1 一元多项式的表示
3.6.2 一元多项式相加
3.7 小结
第4章 栈和队列
4.1 栈的定义与抽象数据类型
4.1.1 什么是栈
4.1.2 栈的抽象数据类型
4.2 栈的顺序表示与实现
4.2.1 栈的顺序存储结构
4.2.2 顺序栈的基本运算
4.2.3 顺序栈应用举例
4.3 栈的链式表示与实现
4.3.1 栈的链式存储结构
4.3.2 链栈的基本运算
4.4 栈与递归
4.4.1 递归
4.4.2 消除递归
4.5 队列的定义与抽象数据类型
4.5.1 什么是队列
4.5.2 队列的抽象数据类型
4.6 队列的顺序存储及实现
4.6.1 顺序循环队列──顺序队列的表示
4.6.2 顺序循环队列的基本运算
4.7 队列的链式存储及实现
4.7.1 链式队列的表示
4.7.2 链式队列的基本运算
4.8 双端队列
4.8.1 什么是双端队列
4.8.2 双端队列的应用
4.9 栈与队列的典型应用
4.9.1 求算术表达式的值
4.9.2 舞伴配对
4.10 小结
第5章 串、数组与广义表
5.1 串的定义及抽象数据类型
5.1.1 什么是串
5.1.2 串的抽象数据类型
5.2 串的存储表示与实现
5.2.1 串的顺序存储结构及基本运算
5.2.2 串的链式存储结构
5.2.3 顺序串应用举例
5.3 串的模式匹配
5.3.1 朴素模式匹配算法Brute-Force
5.3.2 KMP算法
5.3.3 模式匹配应用举例
5.4 数组的定义及抽象数据类型
5.4.1 重新认识数组
5.4.2 数组的抽象数据类型
5.4.3 数组的顺序存储结构
5.5 特殊矩阵的压缩存储
5.5.1 对称矩阵的压缩存储
5.5.2 三角矩阵的压缩存储
5.5.3 对角矩阵的压缩存储
5.6 稀疏矩阵的压缩存储
5.6.1 什么是稀疏矩阵
5.6.2 稀疏矩阵抽象数据类型
5.6.3 稀疏矩阵的三元组表示
5.6.4 稀疏矩阵的三元组实现
5.6.5 稀疏矩阵应用举例──三元组表示的稀疏矩阵相加
5.7 广义表
5.7.1 什么是广义表
5.7.2 广义表的抽象数据类型
5.7.3 广义表的头尾链表存储结构
5.7.4 广义表的扩展线性链表存储结构
5.8 小结
第三篇 非线性数据结构
第6章 树
6.1 树的相关概念及抽象数据类型
6.1.1 什么是树
6.1.2 树的相关概念
6.1.3 树的逻辑表示
6.1.4 树的存储结构
6.2 二叉树的相关概念及抽象数据类型
6.2.1 什么是二叉树
6.2.2 二叉树的性质
6.2.3 二叉树的抽象数据类型
6.2.4 二叉树的存储表示与实现
6.3 遍历二叉树
6.3.1 什么是遍历二叉树
6.3.2 二叉树的先序遍历
6.3.3 二叉树的中序遍历
6.3.4 二叉树的后序遍历
6.4 遍历二叉树的应用
6.4.1 按层次输出二叉树
6.4.2 二叉树的计数
6.4.3 求叶子结点的最大最小枝长
6.4.4 判断两棵二叉树是否相似
6.4.5 交换二叉树的左右子树
6.4.6 求根结点到r结点之间的路径
6.5 线索二叉树
6.5.1 什么是线索化二叉树
6.5.2 线索二叉树
6.5.3 遍历线索二叉树
6.6 树、森林与二叉树
6.6.1 树转换为二叉树
6.6.2 森林转换为二叉树
6.6.3 二叉树转换为树和森林
6.6.4 树和森林的遍历
6.6.5 树与二叉树应用举例
6.7 综合案例:哈夫曼树
6.7.1 什么是哈夫曼树
6.7.2 哈夫曼编码
6.7.3 哈夫曼编码算法的实现
6.8 小结
第7章 图
7.1 图的定义与相关概念
7.1.1 什么是图
7.1.2 图的相关概念
7.1.3 图的抽象数据类型
7.2 图的存储结构
7.2.1 邻接矩阵(数组表示法)
7.2.2 邻接表
7.2.3 十字链表
7.2.4 邻接多重链表
7.3 图的遍历
7.3.1 图的深度优先搜索
7.3.2 图的广度优先搜索
7.4 图的连通性问题
7.4.1 无向图的连通分量与最小生成树
7.4.2 最小生成树
7.5 有向无环图
7.5.1 AOV网与拓扑排序
7.5.2 AOE网与关键路径
7.6 最短路径
7.6.1 从某个顶点到其余各顶点的最短路径
7.6.2 每一对顶点之间的最短路径
7.6.3 最短路径应用举例
7.7 图的应用举例
7.8 小结
第四篇 常用算法
第8章 查找
8.1 基本概念
8.2 静态查找
8.2.1 顺序表的查找
8.2.2 有序顺序表的查找
8.2.3 索引顺序表的查找
8.3 动态查找
8.3.1 二叉排序树
8.3.2 平衡二叉树
8.4 B-树与B 树
8.4.1 B-树
8.4.2 B 树
8.5 哈希表
8.5.1 什么是哈希表
8.5.2 哈希函数的构造方法
8.5.3 处理冲突的方法
8.5.4 哈希表应用举例
8.6 小结
第9章 排序
9.1 基本概念
9.2 插入排序
9.2.1 直接插入排序
9.2.2 折半插入排序
9.2.3 希尔排序
9.2.4 插入排序应用举例
9.3 交换排序
9.3.1 冒泡排序
9.3.2 快速排序
9.3.3 交换排序应用举例
9.4 选择排序
9.4.1 简单选择排序
9.4.2 堆排序
9.4.3 选择排序应用举例
9.5 归并排序
9.6 基数排序
9.6.1 基数排序算法
9.6.2 基数排序应用举例
9.7 小结
第10章 回溯算法
10.1 和式分解
10.2 填字游戏
10.3 装载问题
10.4 迷宫问题
第11章 贪心算法
11.1 找零钱问题
11.2 哈夫曼编码
11.3 加油站问题
第12章 分治算法
12.1 最大子序列和问题
12.2 求x的n次幂
12.3 众数问题
12.4 求n个数中的最大者和最小者
12.5 整数划分问题
12.6 大整数乘法
第13章 实用算法
13.1 大小写金额转换
13.2 将15位身份证号转换为18位
13.3 微信抢红包问题
13.4 一元多项式的乘法
13.5 大整数乘法
参考文献