数据结构与算法是程序设计的重要理论和技术基础,也是计算机类专业的核心课程。

当前市面上《数据结构与算法》的相关书籍有很多,从读者角度来看,主要分为两类:第一类偏重理论,书中讲解了许多数学公式及高深难懂的数学理论,常常令读者“知难而退”;第二类偏重计算机编程,但多数选择C语言作为编程语言。从著作者角度来看,也有两类:一类是国内知名教授学者编写的算法书籍,这类书理论扎实,功底雄厚,普遍作为高等院校计算机专业的教材;另一类是国外作者编著,国内译者翻译的书籍,这类书籍内容翔实,但是不适合中国人的学习习惯,跟国内读者的学习路线不太相同。

职业本科院校面向职业,强调技术,突出技能。虽然数据结构与算法的不断发展离不开高深的数学理论,但对于培养高层次技术技能型的软件开发人才来说,明白数据结构和算法的原理,掌握其实现步骤并能用代码加以实现,比用高深的数学公式推导算法的底层逻辑更具有实用价值。鉴于此,编者力图编写一本契合职业本科院校特点的数据结构和算法类书籍,也希望它是能让“文科生”也能学懂的数据结构和算法类书籍。

本书结构清晰,语言通俗易懂。本书通过绘制两百多张图形,让读者能够通过图形清晰直观地理解数据结构的存储原理和算法的实现步骤,更容易理解并掌握复杂的算法。本书采用Java语言来实现案例代码,70多个案例注释清晰、代码简洁,具有很强的实践性。

本书共有八章,结合实际应用场景讲解,涵盖常用的数据结构和算法的原理、代码实现和应用场景。

第1章主要介绍了什么是数据结构,什么是算法,要学习它们的哪些核心内容,以及算法的时间复杂度和空间复杂度问题。重点介绍了算法的大O复杂度表示法。

第2章详细讲解了线性表(包括数组、链表、栈、队列、串)的特点、存储原理以及对这些数据结构进行增、删、查、改操作的实现步骤。重点讲解了单向链表、双向链表、单向循环链表的原理和操作。通过单向循环链表的原理讲解了约瑟夫死亡抽签游戏的解题思路。本章还讲解了Java语言中ArrayList和LinkedList的区别,逆波兰表达式及四则运算表达式的求解方法。

第3章详细讲解了非线性数据结构——二叉树(二叉查找树、平衡二叉树、AVL树、哈夫曼树、二叉堆)、多路树(B树、B+树)、图和散列表的存储原理及对这些数据结构进行添加、删除、遍历等操作的实现步骤,以及Topk问题的求解办法。本章重点在于二叉树的遍历、AVL树的旋转再平衡、红黑树的构建和旋转、二叉堆的调整,以及哈夫曼树的构建。本章还讲解了图的基本理论以及AOE网求关键路径的实现过程。本章难点在于对B树和 B+树的操作。

第4章讲解了核心的几种算法思维——递归、贪心、分治、动态规划、回溯。分别讲解了各种算法思维的经典案例:递归求阶乘、递归求斐波那契数列、递归解决汉诺塔问题、部分背包问题、均分纸牌问题、拼接数字问题、分治求n次幂问题、01背包问题、八皇后问题、走迷宫问题及骑士周游或马踏棋盘问题。

第5章详细讲解了十大排序算法——冒泡排序、选择排序、插入排序、快速排序、堆排序、希尔排序、归并排序、桶排序、计数排序、基数排序。用图示的方式一一阐述了每种排序算法的原理、实现步骤以及代码实现。

第6章讲解了七大查找算法——线性查找、二分查找、插值查找、斐波那契查找、哈希查找、分块查找、树表查找。重点用图示讲解了顺序查找、二分查找、插值查找、斐波那契查找的实现原理、实现步骤以及代码实现。

第7章讲解了四大字符串匹配算法——暴力匹配算法、KMP算法、BM算法、RK算法的实现原理、实现步骤以及代码实现。

第8章是有关图的算法。主要包括两个最短路径算法——弗洛伊德算法和迪杰斯特拉算法;两个求解最小生成树的算法——普利姆算法和克鲁斯卡尔算法。

本书包含大量图形,用图示的方式细致地讲解了难懂的算法问题。本书出版的初衷是希望为职业教育本科、职业教育专科学生编写一本轻松学习数据结构和算法的辅助教材,但对所有计算机编程人员来说依然具有很强的实用性。同时,对于参加1+X证书制度下相关职业技能等级证书考试的考生能提供有效的帮助,对于报考国家软件设计师,用来复习和解答有关数据结构和算法的考题非常具有参考学习价值。

本书引用了有关专业文献和资料,未在书中一一注明出处,在此对有关文献的作者表示感谢,限于编者的理论水平和实践经验,书中疏漏之处在所难免,恳请广大读者批评、指正。



编者
2022.5




源代码