本书用深入浅出的语言从普通高校学生的学习需求出发,介绍了数据结构的相关知识。本书分为六个部分,从基础知识、线性数据结构、非线性数据结构、数据结构中的重要运算、多维数据结构及大数据数据结构等内容。本书适合作为高等院校计算机及相关专业数据结构课程的教材,也可作为技术人员的自学教材。
本书围绕为什么要学习数据结构、有哪些主要的数据结构、它们有什么用、如何高效地运用它们求解实际问题等内容进行框架设计和编写的。本书的写作目标是帮助读者建立计算思维,学会如何利用计算机求解实际问题。
本书特色:
充分运用实例法深入浅出、形象地讲解各种数据结构。
针对一个讲解实例给出不同的求解方案,让读者能够了解如何选择合适的数据结构求解问题,并切身体会采用同一种数据结构的不同存储结构实现同一个算法在执行效率和编程难度上的差异。
以问题驱动的方式讲解非线性结构存储映射等问题,引导读者逐步进行深入思考,帮助读者建立计算思维,使得读者不仅知其然,而且知其所以然。
以图形跟踪演示的方式介绍算法思想,帮助读者理解和掌握相关算法。
为每个重要知识点准备了大量的思考题和习题,帮助读者对相关知识点进行深入思考和理解,训练读者的发散性思维。
为了方便读者的学习,本书特别增加了“预备知识”部分,这一部分介绍了在学习数据结构时读者可能需要用到的一些数学知识和程序设计方面的知识。
计算机在社会各领域的应用已经无处不在。计算机需要加工处理的数据越来越复杂、规模也越来越大,对数据组织和处理的效率提出了更高的要求。在计算机科学中,数据结构是一种在计算机中组织、存储数据,以便高效利用这些数据的有效方式,它是许多高效算法的基本要素,几乎所有的程序或软件系统都要用到数据结构。“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。1968年,美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧:第1卷基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。数据结构课程是计算机科学的基础核心课程,它对于外围课程的知识与经验具有迁移性、衍生性,并对学生自学知识和获取实践经验具有基础性、发展性。该课程教学的突出难点是知识的抽象性和动态性,学习过程也是复杂程序设计的训练过程,理论性和实践性均较强,被认为是比较难学的课程。对学生来说,学习这门课程的主要难度体现在,不知道如何根据实际问题选择合适的数据结构(包括两个层次,如何选择合适的数据逻辑结构构建问题模型和如何选择合适的数据存储结构实现求解问题模型的算法)和如何应用选择的数据结构进行问题的求解(当然,这个问题还需要“算法设计与分析”这门课程来进一步解决)。
基于上述考虑,本书充分运用实例法深入浅出、形象地讲解各种数据结构,针对一个讲解实例给出了不同的求解方案,让读者能够了解如何选择合适数据结构求解问题,并切身体会采用同一种数据结构的不同存储结构实现同一个算法在执行效率和编程难度上的差异,从而激发学生的学习兴趣和热情。而且,以问题驱动的方式引导学生进行逐步深入思考,有利于帮助学生建立计算思维,使得他们不仅知其然,而且知其所以然。
本书分为四个部分共12章。第一部分包括第1章和第2章,主要介绍数据结构的概念、算法的概念、数据结构和算法之间的密切关联以及简单的算法分析。第二部分包括第3~7章,这一部分以“线性表”为主线分别详细讨论了六种常见的线性结构。第三部分介绍了非线性结构中树(第8章)、二叉树(第9章)和图(第10章)的基本概念、存储结构、一些基本操作的实现以及它们的经典应用。第四部分介绍了查找(第11章)和排序(第12章)的各种常用算法,同时展现了各种数据结构的完美应用。
本书在内容组织上力求丰富充实、科学合理,符合学生的认知规律,力求将每种数据结构分析透彻。在语言描述上力求深入浅出、简单明了。为了帮助学生理解和掌握各种数据结构,书中列举了大量的思考题、例题和习题。本书主要采用面向过程的C语言作为数据结构和算法的描述手段,在保持C语言优点的同时尽量使算法描述简单清晰。
与本书配套的资料有书中程序的源代码、习题参考答案以及电子课件等,教师可登录华章网站下载。
本书第1~10章主要由湖北工业大学沈华博士编写,第11~12章主要由湖南工业大学文志诚博士编写,湖北工业大学杨晓艳博士对书中代码进行了校验,全书由湖北工业大学张明武教授修改定稿。
在本书的编写中,负责本书编辑出版工作的机械工业出版社华章分社策划编辑、教材部副主任朱劼老师和佘洁编辑付出了大量辛勤的劳动。武汉大学何炎祥教授在百忙之中认真审阅了全书,提出了许多宝贵和中肯的意见。在此,谨向每一位关心和支持本书编写工作的各位朋友、老师表示衷心的谢意!
由于作者的知识和写作水平有限,书中难免有错误和不足之处,恳请各位专家、读者批评指正。作者E-mail:nancy78733@126.com。
沈华
2015年4月于武汉南湖
计算机\数据结构
本书主要是围绕为什么要学习数据结构、有哪些主要的数据结构、它们有什么用、如何高效地运用它们求解实际问题等进行框架设计和内容编写的。换句话说,本书作者的写作目标是帮助读者建立计算思维,学会如何利用计算机求解实际问题。
本书特色
1.充分运用实例法深入浅出、形象地讲解各种数据结构;
2.针对一个讲解实例给出不同的求解方案,让读者能够了解如何选择合适的数据结构求解问题,并切身体会采用同一种数据结构的不同存储结构实现同一个算法在执行效率和编程难度上的差异;
3.以问题驱动的方式讲解非线性结构存储映射等问题,引导读者逐步进行深入思考,帮助读者建立计算思维,使得读者不仅知其然,而且知其所以然;
4.以图形跟踪演示的方式介绍算法思想,帮助读者理解和掌握相关算法;
5.为每个重要知识点准备了大量的思考题和习题,帮助读者对相关知识点进行深入思考和理解,训练读者的发散性思维;
6.为了方便读者的学习,本书特别增加了“预备知识”部分,这一部分介绍了在学习数据结构时读者可能需要用到的一些数学知识和程序设计方面的知识。
序
前言
教学建议
第一部分概论部分
第1章数据结构3
11什么是数据3
12什么是数据结构3
121数据的逻辑结构3
122数据的存储结构6
123数据的运算8
13什么是数据类型9
14什么是抽象数据类型9
15知识点小结10
习题10
第2章算法11
21什么是算法11
22算法的描述11
23算法的性能分析12
231时间复杂度13
232渐近符号13
233空间复杂度15
234复杂度分析举例15
24算法的性能度量18
241性能度量的方法18
242生成测试数据19
25知识点小结19
习题19
第二部分线性部分
第3章线性表22
31线性表抽象数据类型22
311线性表的逻辑结构22
312线性表的基本运算22
313线性表的ADT描述23
32线性表的应用——两个一元多项式相加24
321问题描述与分析24
322问题求解25
33线性表的实现26
331顺序表26
332单链表41
333静态单链表52
334一元多项式相加问题的求解实现56
34线性表的其他实现及应用场景分析69
341双(向)链表69
342循环单(向)链表71
343循环双(向)链表74
35知识点小结75
习题75
第4章栈77
41栈抽象数据类型77
411栈的逻辑结构77
412栈的基本运算78
413栈的ADT描述78
42栈的应用——表达式求解79
421问题描述与分析79
422问题求解79
43栈的实现85
431顺序栈85
432链栈88
433在表达式求解问题上的性能分析与比较91
44顺序栈的一种有趣实现——两个方向生长的栈91
45栈与递归的天然联系92
46知识点小结93
习题93
第5章队列95
51队列抽象数据类型95
511队列的逻辑结构95
512队列的基本运算95
513队列的ADT描述96
52队列的应用——模拟舞伴配对问题96
521问题描述与分析96
522问题求解97
53队列的实现97
531顺序队列97
532循环队列101
533链队列107
54双端队列及队列应用场景举例110
541双端队列110
542队列应用场景举例111
55知识点小结111
习题112
第6章串113
61串抽象数据类型113
611串的逻辑结构113
612串的基本运算113
613串的ADT描述114
62串的实现114
621串的顺序存储表示114
622串的堆分配存储表示118
623串的块链存储表示120
63串的模式匹配124
631朴素的模式匹配算法124
632KMP算法128
64知识点小结133
习题133
第7章数组及广义表134
71数组的类型定义134
711数组的定义134
712数组的性质134
713数组的基本运算134
72多维数组的线性存储方法135
73特殊矩阵的压缩存储138
731特殊形状矩阵的压缩存储138
732随机稀疏矩阵的压缩存储及其运算142
74广义表154
741广义表的基本概念154
742广义表的性质155
743广义表的基本运算155
744广义表的存储结构156
75知识点小结159
习题159
第三部分非线性部分
第8章树与森林162
81认识树162
811(根)树的定义162
812基本术语163
813树的基本运算164
82树的实现167
821需要解决的关键问题167
822关键问题的求解思路167
823树的存储结构167
824存储方案的比较分析178
83树的创建178
831问题描述与分析178
832问题求解179
84树的遍历180
841问题描述与分析180
842问题求解180
85树的应用181
851并查集181
852等价类182
853决策树184
86森林184
87知识点小结185
习题185
第9章二叉树186
91认识二叉树186
911二叉树的定义186
912二叉树的基本运算187
913二叉树的性质189
92二叉树的实现194
921需要解决的关键问题194
922关键问题的求解思路195
923二叉树的存储结构195
924方案的比较分析203
93二叉树的创建203
931问题描述与分析203
932问题求解203
94二叉树的遍历204
941问题描述与分析204
942问题求解208
943二叉树遍历应用举例211
95线索二叉树215
951线索二叉树的应用需求215
952二叉树的线索化217
953线索二叉树上的运算219
96二叉树的应用227
961哈夫曼树及其应用227
962二叉排序树及其应用233
963平衡二叉树236
97树、森林与二叉树的关系241
971树、森林与二叉树的相互转换241
972树、森林与二叉树在遍历运算上的关系244
98知识点小结244
习题245
第10章图246
101认识图246
1011图的定义246
1012基本术语246
1013图的基本运算252
102图的实现253
1021需要解决的关键问题253
1022关键问题的求解思路253
1023图的存储结构254
1024存储方案的比较分析261
103图的创建262
1031问题描述与分析262
1032问题求解262
104图的遍历264
1041问题描述与分析264
1042深度优先搜索遍历265
1043广度优先搜索遍历272
1044图遍历的应用277
105生成树277
1051连通图的生成树277
1052连通网的最小生成树278
106最短路径280
1061单源最短路径281
1062每对顶点间的最短路径284
1063最短路径应用举例288
107有向无环图及其应用288
1071AOV网与拓扑排序288
1072AOE网与关键路径290
108知识点小结293
习题293
第四部分重要运算部分
第11章查找296
111查找的基本概念296
112静态查找297
1121顺序查找297
1122二分查找299
1123分块查找303
113动态查找304
114散列技术312
1141散列表的概念312
1142散列函数的构造方法312
1143处理冲突的方法312
1144散列表的查找315
1145散列表的应用317
115知识点小结318
习题318
第12章排序319
121排序的基本概念319
122插入排序321
1221直接插入排序321
1222希尔排序324
123交换排序325
1231冒泡排序325
1232快速排序327
124选择排序330
1241直接选择排序330
1242树形选择排序332
1243堆排序333
125归并排序338
1251(内部)归并排序338
1252外部归并排序339
126分配排序339
1261箱排序339
1262基数排序339
127各种(内部)排序方法的比较341
128知识点小结342
习题342
参考文献344