本书以较通俗的语言,按照由易到难的原则,详细介绍了各种数据结构的基本概念、逻辑特性和物理特性,对各种结构定义了相应的抽象数据类型(ADT)以及相关的操作和算法。本书采用类C语言描述算法,并给出了各种算法的效率分析,以及这些结构在计算机科学及其他领域的应用。在各章末尾,还给出了几个算法设计的例子。
本书可作为高等院校计算机专业的教材,同时也可供计算机工程技术人员参考。
无
“数据结构”是20世纪70年代开始设立的计算机科学与技术专业的基础课,现在是其重要的核心课程。随着计算机软、硬件技术的发展,计算机在各个学科和领域得到广泛应用,其当今应用的一个主要方面就是数据处理,如情报检索、数据采集、企业管理、决策分析和人工智能等。而应用到这些领域时所面临的首要问题就是对于信息量大、种类繁多、结构复杂的数据和数据关系的处理,由此必须设计高级的数据结构和数据组织,以便有效地实现数据采集、数据组织、数据存储、数据传输和数据处理。数据结构主要研究数据的逻辑结构、数据在计算机中的物理结构,以及处理不同结构数据的算法。我们研究数据结构的目的是为了学会编写更高效的程序,而高效、简洁的程序取决于数据结构和算法的设计。
现在,有关算法与数据结构的教材,一部分侧重于算法的基本思想和步骤,用伪代码描述;一部分用程序语言描述,侧重于算法的程序实现。前者侧重于对数据结构原理的阐述,不利于学生掌握算法的程序实现以及对算法的分析、比较。后者增加了对数据元素的描述,从而使得程序更难理解。
本教材对数据结构和算法用类C语言描述,数据结构和算法在设计本质上是属于底层的,在本书中并不提供可直接上机运行的源代码,而是提供一种类C语言伪代码来描述算法的基本思想和基本步骤。此外,用类C语言描述的算法容易转换为C语言程序。
本书系统全面地介绍了各种传统的数据结构,对每种数据结构及相关算法都进行了时间和空间效率的分析,强调算法与数据结构的密不可分性,引进抽象数据类型概念,将数据类型与其上的操作封装为一体,为面向对象的程序设计方法奠定了坚实的基础。此外,针对不同的抽象数据类型讨论不同的存储方法,并且研究不同存储方法的可能算法,从而体现了计算机学科方法论的理论、抽象和设计三个过程。
全书分为11章:第1章是概论,解释了从问题到程序的求解过程,以及在这一过程中抽象数据类型的表述和作用,介绍了程序的运行步骤及复杂度;第2章介绍了有关线性表的概念及其基本操作,该章是后续章节的基础;第3章在第2章的基础上讨论了操作受限的线性表——栈与队列的特点,并列举了几个应用示例;第4章简要给出了非数值处理——串的处理方法;第5章主要是关于程序设计中的一种常用数据类型——数组在计算机内部的表示和实现,同时介绍了广义表的概念;第6章描述了非线性复杂数据结构——树,它是解决决策和博弈等问题的基本结构;第7章是关于图的内容,包括有向图和无向图。图是一种比树更复杂的数据结构;第8章涉及存储管理中应用的基本方法;第9章以集合作为数据模型,讨论了查找的方法和技术;第10章介绍了一些常用的排序算法,包括内部排序和外部排序;第11章简要介绍了文件。
本书由教学一线的教授亲自主笔,根据作者多年的教学实践经验,针对算法与数据结构这门课程的特点撰写而成,目的是培养学生合理组织数据和进行优秀的算法设计的能力。本书尽量合理地安排内容顺序,教师可以根据需要自由地重新组织内容。
本教材可作为高等院校计算机科学与技术专业的教材、参考书和考研辅导,同时也可供计算机工程技术人员参考。对于计算机科学与技术专业,可讲授64学时,对于其他专业,去掉带星号的章节,可讲授48学时。
本书的第1、2、3章由周世平同志编写,第4、10章由胡潇琨同志编写,第5、9章由孟佳娜同志编写,第6、8、11章由谭征同志编写,第7章由范策同志编写。全书由范策同志统稿,陈守孔同志编写了各章最后一节的算法设计并审阅了全书,孟佳娜同志编写了本书的电子教案。
由于作者水平所限,加上计算机科学技术的发展十分迅速,书中难免有不妥和挂一漏万之处,恳请广大读者赐教。
编 者
2004年4月于烟台大学
范策 周世平 胡潇琨 等编著:暂无简介
第1章 概论1
11 引言1
111 解决问题的步骤1
112 一个例子2
12 数据结构4
121 为什么要学习数据结构4
122 有关概念和术语5
13 抽象数据类型9
14 类C语言描述11
15 算法和算法分析14
151 算法的定义及算法设计的要求14
152 算法与数据结构和程序16
153 算法性能分析与度量16
154 复杂度函数的增长率19
155 复杂度分析的例子20
第2章 线性表23
21 线性表的类型定义23
211 线性表的概念23
212 线性表的抽象数据类型 24
213 线性表的例子25
22 线性表的顺序表示和实现27
221 线性表的顺序表示27
222 顺序表操作的实现28
23 线性表的链式表示和实现31
231 单链表的表示32
232 线性链表操作的实现33
24 线性表实现方法的比较38
25 循环链表39
26 双链表40
27 静态链表41
*28 算法设计举例43
第3章 栈和队列47
31 栈47
311 栈的类型定义47
312 栈的表示和实现48
313 顺序栈和链栈的比较51
32 队列52
321 队列的类型定义52
322 循环队列53
323 链队——队列的链式表示和实现56
*33 递归57
331 递归的定义57
332 递归的实现59
333 递归和迭代64
334 递归的消除65
*34 算法设计举例68
第4章 串73
41 串的类型定义73
42 串的表示和实现74
421 串的顺序存储结构75
422 串的链式存储结构76
*43 串的模式匹配77
431 朴素的模式匹配算法77
432 首尾模式匹配算法78
433 KMP算法79
44 串的应用举例82
*45 算法设计举例83
第5章 数组和广义表85
51 数组的概念及其基本操作85
52 数组的顺序存储86
53 矩阵的压缩存储88
531 特殊矩阵88
532 稀疏矩阵 90
*54 广义表98
541 广义表的定义98
542 广义表的存储结构99
*55 算法设计举例101
第6章 树105
61 树的概念及操作105
62 二叉树107
621 二叉树的概念及操作108
622 二叉树的性质109
623 二叉树的存储结构111
63 二叉树的遍历112
*64 线索二叉树116
65 树和森林121
651 树的存储结构121
652 森林、树、二叉树的相互转换124
653 树和森林的遍历126
66 哈夫曼树及其应用127
661 最优二叉树(哈夫曼树)127
662 哈夫曼编码129
*67 算法设计举例132
第7章 图137
71 图的定义和术语137
72 图的存储结构140
721 数组表示法140
722 邻接表141
*723 十字链表143
*724 邻接多重表144
73 图的遍历145
731 深度优先搜索145
732 广度优先搜索146
74 图的连通性问题147
741 图的连通分量和生成树147
742 最小生成树149
75 有向无环图及其应用151
751 拓扑排序151
*752 关键路径154
76 最短路径158
761 从某个源点到其他各顶点的最短路径158
762 每一对顶点之间的最短路径161
*77 网络流问题163
*78 算法设计举例167
*第8章 动态存储管理171
81 概述171
82 可利用空间表及分配方法172
83 边界标识法176
84 伙伴系统181
第9章 集合187
91 概述187
92 线性表上的查找188
921 顺序表的查找189
922 有序表的查找190
93 索引表上的查找196
94 树表上的查找197
941 二叉排序树197
942 平衡二叉树203
*943 B树210
*944 键树216
95 哈希表217
951 哈希表查找的基本概念217
952 构造哈希函数的方法218
953 哈希冲突的解决方法220
954 哈希表的查找及分析223
*96 算法设计举例225
第10章 排序229
101 概述229
102 插入排序230
1021 直接插入排序230
1022 折半插入排序232
*1023 二路插入排序232
*1024 表插入排序234
1025 希尔排序236
103 交换排序237
1031 起泡排序237
1032 快速排序238
104 选择排序241
1041 直接选择排序241
1042 树形选择排序242
1043 堆排序243
105 归并排序246
106 分配排序247
107 各种内部排序方法的比较250
108 外部排序252
1081 文件管理252
1082 外部排序的方法253
1083 多路平衡归并排序255
1084 置换选择排序257
*1085 最佳归并树261
*1086 磁带排序262
*109 算法设计举例263
第11章 文件267
111 文件的基本概念267
112 顺序文件269
113 索引文件272
114 索引顺序文件273
1141 ISAM文件274
*1142 VSAM文件276
115 散列文件278
*116 多关键字文件279
1161 多重表文件279
1162 倒排文件280
参考书目282