新書推薦:
《
DK月季玫瑰百科
》
售價:NT$
959.0
《
为你想要的生活
》
售價:NT$
301.0
《
关键改变:如何实现自我蜕变
》
售價:NT$
352.0
《
超加工人群:为什么有些食物让人一吃就停不下来
》
售價:NT$
454.0
《
历史的教训(浓缩《文明的故事》精华,总结历史教训的独特见解)
》
售價:NT$
286.0
《
不在场证明谜案(超绝CP陷入冤案!日本文坛超新星推理作家——辻堂梦代表作首次引进!)
》
售價:NT$
265.0
《
明式家具三十年经眼录
》
售價:NT$
2387.0
《
敦煌写本文献学(增订本)
》
售價:NT$
1010.0
|
編輯推薦: |
“数据结构”课程脱胎于“离散数学结构”,它涉及各种离散结构(如向量、集合、树、图、代数方程、多项式等)在计算机上如何存储和处理。面向对象技术出现以后,人们认识到,用它开发出来的软件体系结构更加符合人们的习惯,质量更容易得到保证,尤其是更容易适应使用者和用户不断提出的新的需求,因此有必要开设结合面向对象技术的“数据结构”课程。本书自1999年第1版出版以来,备受读者好评,并获得普通高等教育“十一五”规划教材。第3版在前一版的基础上优化了很多算法的实现,对一些章节进行了删减,突出了内容的重点,同时对每章的习题都进行了更新,使题型更丰富,内容更深厚。本书内容翔实,结构清晰,示例丰富, 理论结合实际,注重素质培养。
|
內容簡介: |
“数据结构”是计算机专业的核心课程,是从事计算机软件开发和应用的人员应当的专业基础。随着计算机的日益普及,“数据结构”课程也在不断发展。 本书按照清华大学计算机科学与技术系本科“数据结构”大纲的要求,从面向对象的概念、对象类设计的风格和数据结构的层次开始,从线性结构到非线性结构,从简单到复杂,循序渐进,逐步深入地讨论了各种数据结构的内在的逻辑关系及它们在计算机中的实现方式和使用。此外,本书对常用的迭代、递归、回溯等算法设计技巧,搜索和排序算法等都做了详尽描述,并引入了简单的算法分析。 全书采用了面向对象的观点讨论数据结构技术,并以兼有面向过程和面向对象双重特色的C 语言作为算法的描述工具,强化基本知识和基本能力的双基训练。全书条理清晰,通俗易懂,图文并茂,适于自学。 本书适合于大专院校计算机或软件专业本科生使用,也可作为教师和有关科研人员的参考书。与本书配套的《数据结构精讲与习题详解(C语言版)(第2版)》一书已由清华大学出版社出版。此外,需要PowerPonit电子教学幻灯片的教师,可与清华大学出版社联系。
|
關於作者: |
清华大学计算机系教授,1970年清华大学计算数学专业毕业,1980年清华大学计算机系软件研究生毕业并获得工学硕士学位,1985年赴日本国东京理科大学做访问学者,研究方向为软件工程过程的质量管理和软件产品的质量评价。现已退休。主要教学工作:多年为清华大学计算机系大学本科《数据结构》、《软件工程》和研究生《软件工程设计与技术》、《软件项目管理》课程负责人,并主持教育部-微软精品课程《数据结构》的建设。曾与人合作或单独编写和出版教材二十余本,其中,《数据结构》教材被评为教育部十一五规划教材,并获得北京市精品教材。在职期间参加多项科研项目,在核心刊物和专业会议发表多篇论文。
|
目錄:
|
第1章数据结构概论1
1.1数据结构的概念1
1.1.1数据结构举例1
1.1.2数据与数据结构2
1.1.3数据结构的分类3
1.1.4“数据结构”课程的内容4
1.2数据结构的抽象形式6
1.2.1数据类型6
1.2.2数据抽象与抽象数据类型7
1.3作为ADT的C 类9
1.3.1面向对象的概念9
1.3.2C 中的类10
1.3.3C 中的对象12
1.3.4C 的输入输出13
1.3.5C 中的函数14
1.3.6动态存储分配17
1.3.7C 中的继承18
1.3.8多态性19
1.3.9C 的模板23
1.4算法定义24
1.5算法性能分析与度量25
1.5.1算法的性能标准26
1.5.2算法复杂性度量26
1.5.3算法的渐进分析31
1.5.4坏、好和平均情况35
习题36
第2章线性表40
2.1线性表的概念40
2.1.1线性表的定义40
2.1.2线性表的类定义41
2.2顺序表42
2.2.1顺序表的定义和特点42
2.2.2顺序表的类定义及其操作42
2.2.3顺序表的性能分析47
2.2.4顺序表的应用49
2.3单链表49
2.3.1单链表的概念50
2.3.2单链表的类定义51
2.3.3单链表中的插入与删除52
2.3.4带附加头结点的单链表54
2.3.5单链表的模板类56
2.4线性链表的其他变形62
2.4.1循环单链表62
2.4.2双向链表65
2.5单链表的应用: 多项式及其运算69
2.5.1多项式的表示69
2.5.2多项式的类定义71
2.5.3多项式的加法73
2.6静态链表74
习题75
第3章栈和队列81
3.1栈81
3.1.1栈的定义81
3.1.2顺序栈82
3.1.3链式栈85
3.1.4栈的应用之一——括号匹配87
3.1.5栈的应用之二——表达式的计算88
3.2栈与递归93
3.2.1递归的概念93
3.2.2递归过程与递归工作栈97
3.2.3用回溯法求解迷宫问题102
3.3队列105
3.3.1队列的概念105
3.3.2循环队列106
3.3.3链式队列109
3.3.4队列应用举例: 打印二项展开式 (a b)i的系数111
3.4优先级队列113
3.4.1优先级队列的概念113
3.4.2优先级队列的存储表示和实现114
3.5双端队列115
3.5.1双端队列的概念116
3.5.2双端队列的数组表示117
习题119
第4章数组、串与广义表125
4.1多维数组的概念与存储125
4.1.1多维数组的概念125
4.1.2多维数组的存储表示126
4.2特殊矩阵128
4.2.1对称矩阵的压缩存储128
4.2.2三对角/多对角矩阵的压缩存储130
4.3稀疏矩阵131
4.3.1稀疏矩阵及其三元组数组表示131
4.3.2稀疏矩阵的转置134
4.3.3稀疏矩阵的相加137
4.3.4矩阵的十字链表表示139
4.4字符串140
4.4.1字符串的概念140
4.4.2C 有关字符串的库函数141
4.4.3字符串的实现143
4.4.4字符串的自定义类145
4.4.5字符串操作的实现146
4.4.6字符串的模式匹配148
4.4.7字符串的存储方法154
4.5广义表156
4.5.1广义表的定义与性质156
4.5.2广义表的表示157
4.5.3广义表存储结构的实现158
4.5.4广义表的递归算法161
习题168
第5章树174
5.1树的基本概念174
5.1.1树的定义和术语174
5.1.2树的抽象数据类型176
5.2二叉树177
5.2.1二叉树的定义177
5.2.2二叉树的性质178
5.2.3二叉树的抽象数据类型179
5.3二叉树的存储表示180
5.3.1二叉树的数组存储表示180
5.3.2二叉树的链接存储表示181
5.4二叉树遍历及其应用186
5.4.1二叉树遍历的递归算法186
5.4.2二叉树遍历的应用188
5.4.3二叉树遍历的非递归算法190
5.4.4二叉树的计数194
5.5线索二叉树197
5.5.1线索198
5.5.2中序线索二叉树的建立和遍历198
5.5.3前序与后序的线索化二叉树204
5.6树与森林205
5.6.1树的存储表示205
5.6.2树、森林与二叉树的转换211
5.7树与森林的遍历及其应用212
5.7.1树与森林的深度优先遍历213
5.7.2树和森林的广度优先遍历215
5.7.3树遍历算法的应用216
5.8堆217
5.8.1小堆和堆217
5.8.2堆的建立219
5.8.3堆的插入与删除220
5.9Huffman树及其应用222
5.9.1路径长度222
5.9.2Huffman树223
5.9.3Huffman树的应用: 判定树226
5.9.4Huffman树的应用: Huffman编码227
习题229
第6章集合与字典237
6.1集合及其表示237
6.1.1集合的基本概念237
6.1.2用位向量实现集合抽象数据类型238
6.1.3用有序链表实现集合的抽象数据类型243
6.2并查集与等价类248
6.2.1并查集的定义及其实现248
6.2.2并查集的应用: 等价类划分252
6.3字典254
6.3.1字典的概念254
6.3.2字典的线性表描述256
6.4跳表258
6.4.1跳表的概念258
6.4.2跳表的搜索、插入和删除259
6.5散列260
6.5.1散列表与散列方法261
6.5.2散列函数261
6.5.3处理冲突的闭散列方法263
6.5.4处理冲突的开散列方法272
6.5.5散列表分析274
习题276
第7章搜索结构282
7.1静态搜索结构283
7.1.1静态搜索表283
7.1.2顺序搜索285
7.1.3基于有序顺序表的顺序搜索和折半搜索286
7.1.4基于有序顺序表的其他搜索方法291
7.2二叉搜索树293
7.2.1二叉搜索树的概念293
7.2.2二叉搜索树上的搜索295
7.2.3二叉搜索树的插入295
7.2.4二叉搜索树的删除297
7.2.5二叉搜索树的性能分析298
7.3AVL树301
7.3.1AVL树的概念301
7.3.2平衡化旋转302
7.3.3AVL树的插入306
7.3.4AVL树的删除309
7.3.5AVL树的性能分析314
7.4伸展树315
7.5红黑树318
7.5.1红黑树的概念和性质318
7.5.2红黑树的搜索319
7.5.3红黑树的插入319
7.5.4红黑树的删除320
习题323
第8章图330
8.1图的基本概念330
8.1.1与图有关的若干概念330
8.1.2图的抽象数据类型332
8.2图的存储结构333
8.2.1图的邻接矩阵表示334
8.2.2图的邻接表表示339
8.2.3图的邻接多重表表示345
8.3图的遍历347
8.3.1深度优先搜索348
8.3.2广度优先搜索349
8.3.3连通分量350
8.3.4重连通分量352
8.4小生成树354
8.4.1Kruskal算法355
8.4.2Prim算法358
8.5短路径360
8.5.1非负权值的单源短路径360
8.5.2任意权值的单源短路径363
8.5.3所有顶点之间的短路径366
8.6用顶点表示活动的网络(AOV网络)368
8.7用边表示活动的网络(AOE网络)372
习题377
第9章排序384
9.1排序的概念及其算法性能分析384
9.1.1排序的概念384
9.1.2排序算法的性能评估385
9.1.3排序表的类定义387
9.2插入排序388
9.2.1直接插入排序388
9.2.2折半插入排序389
9.2.3希尔排序391
9.3快速排序392
9.3.1快速排序的过程392
9.3.2快速排序的性能分析394
9.3.3快速排序的改进算法395
9.3.4三路划分的快速排序算法398
9.4选择排序400
9.4.1直接选择排序400
9.4.2锦标赛排序401
9.4.3堆排序406
9.5归并排序409
9.5.1归并409
9.5.2归并排序算法410
9.6基于链表的排序算法411
9.6.1链表插入排序412
9.6.2链表归并排序414
9.6.3链表排序结果的重排415
9.7分配排序418
9.7.1桶式排序418
9.7.2基数排序419
9.7.3MSD基数排序420
9.7.4LSD基数排序422
9.8内部排序算法的分析424
9.8.1排序方法的下界424
9.8.2各种内部排序方法的比较426
习题427
第10章文件、外部排序与搜索435
10.1主存储器和外存储器435
10.1.1磁带435
10.1.2磁盘存储器437
10.1.3缓冲区与缓冲池439
10.2文件组织441
10.2.1文件的概念441
10.2.2文件的存储结构442
10.3外排序451
10.3.1外排序的基本过程451
10.3.2k路平衡归并与败者树453
10.3.3初始归并段的生成458
10.3.4并行操作的缓冲区处理462
10.3.5归并树465
10.4多级索引结构467
10.4.1静态的ISAM方法467
10.4.2动态的m路搜索树468
10.4.3B树470
10.4.4B树的插入472
10.4.5B树的删除474
10.4.6B 树478
10.4.7VSAM481
10.5字典树482
10.5.1字典树的概念482
10.5.2双链树表示483
10.5.3Trie树484
习题486
附录A部分习题答案495
参考文献501
|
內容試閱:
|
计算机的普及极大地改变了人们的工作和生活。目前各个行业、各个领域都与计算机建立了紧密的联系,也随之带来了开发各种软件的需求。为了能够以小的成本、快的速度、好的质量开发出合乎需要的软件,必须遵循软件工程的原则,把软件的开发和维护标准化、工程化,不能再像以前那样,把软件看作是个人雕琢的精品。就软件产品而言,重要的就是建立合理的软件体系结构和程序结构,设计有效的数据结构。因此,要做好软件开发工作,必须了解如何组织各种数据在计算机中的存储、传递和转换。这样,“数据结构”这门课程显得格外重要。自1978年美籍华裔学者冀中田在国内首开这门课程以来(当时作者也在场),经过40余年的发展,本课程已成为各大学计算机专业本科的主干课程,也成为非计算机类学生和研究生学习计算机的必修课程。
“数据结构”课程脱胎于“离散数学结构”,它涉及各种离散结构(如向量、集合、树、图、代数方程、多项式等)在计算机上如何存储和处理。其内容丰富,涉及面广,而且还在随各种基于计算机的应用技术的发展,不断增加新的内容。特别是面向对象技术出现以后,人们认识到,用它开发出来的软件体系结构更加符合人们的习惯,质量更容易得到保证,尤其是更容易适应使用者和用户不断提出的新的需求。因此,在国际上,面向对象技术得到迅速普及,出现了大批面向对象的软件开发工具。为了适合形势的要求,有必要开设结合面向对象技术的“数据结构”课程。
用面向对象的观点讨论数据结构,与传统的面向过程的讲法相比,变化较大。各种数据结构的讨论都是基于抽象数据类型和软件复用的,有新意,也有继承。我们力图与过去的讲授体系保持一致,但又必须引入一些新的概念。为了能够让读者容易学习,我们对内容进行了精选。许多从基本数据结构派生出来的概念,如双端堆、二项堆、小堆、斐波那契堆、左斜树、扁树、B*树等,都舍去了。同时,把动态存储管理部分归到“操作系统”课程,把文件组织部分归到“数据库原理”课程,只保留了重要的应用广泛的一些结构。对这些结构做全面、深入的讲解,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种典型实例说明它们在解决应用问题时的动态行为和各种必要的操作,并以C 语言为表述手段,介绍在面向对象程序设计过程中各种数据结构的表达和实现。只要学过C或Pascal语言,就能够很容易地阅读和理解,并因此学习C 语言,提高读者的软件设计和编程能力。
本书是作为清华大学信息学院平台课“数据结构”的教材编写的,在编写过程中得到清华大学信息学院领导的支持,并获得普通高等教育“十一五”规划教材的资助。参与策划的有计算机科学与技术系教师殷人昆、邓俊辉、舒继武、朱仲涛,电子工程系教师朱明方、吴及,自动化系教师李宛洲、刘义,微电子与纳电子学系教师李树国,软件学院教师张力以及信息科学技术学院办公室的教师王娜等。第4章由舒继武执笔,第5章由朱仲涛执笔,第8章由邓俊辉执笔,第9章由吴及执笔,其他各章由殷人昆执笔。作者都是在清华大学从事“数据结构”课程线教学的教师,有着丰富的数据结构和软件工程教学的经验,教学效果良好。
全书共分10章。第1章是预备知识,主要介绍什么是数据,数据与信息的关系;什么是数据结构,数据结构的分类。通过学习,读者能够了解抽象数据类型和面向对象的概念,并对对象、类、继承、消息以及其他关系的定义、使用有基本认识。我们选择了具有面向过程和面向对象双重特点的C 语言,可以帮助读者自然而轻松地从传统程序设计观念向面向对象方法转变。在这一章的后还讨论了算法定义和简单的算法分析方法。
第2章是全书的基础,讨论了线性表、它的数组表示和链表表示,以及利用它们定义出来的各种结构,如顺序表、代数多项式等。通过学习,读者可以了解对象和类的基本实现,并通过模板、多态性等的使用,对数据抽象概念有进一步的理解。
第3章引入4种存取受限的表,即栈、队列、优先级队列和双端队列。通过对它们的定义、实现和应用的深入介绍,使读者能够了解在什么场合使用它们,为以后更复杂的数据结构和算法的实现提供了多种辅助手段。
第4章介绍在许多领域中经常遇到的多维数组、字符串和广义表。这些都是应用广泛又十分灵活的结构。
第5章和第8章介绍在实际应用中重要的非线性结构——树与图。在管理、电子设计、机械设计、日常生活中的许多方面都会用到它们。
第6章、第7章和第10章介绍集合、跳表、散列、搜索树、索引以及文件等结构。在实际与信息处理相关的应用中,这些结构十分重要。许多非数值处理都涉及这些结构,它们与内存、外存上的数据组织关系密切。例如,在外存组织文件时全面应用了这些结构。它们又是许多新结构的生长点。因此,读者学习这些内容将获益匪浅。
第9章介绍排序。这也是应用十分广泛的技术。只要是数据处理,就少不了排序。如何才能高效地完成排序?本章分别就内存、外存使用的多种排序方法进行介绍和讨论,读者可以深入了解排序的机制,也能从中学到许多程序设计的技巧。
本书的篇幅虽然较大,但给读者以选择。读者可以根据时间、能力,适当对学习的内容加以剪裁。本着少讲多练的原则,可以对每种结构只介绍类定义和关键操作的实现,其他内容可自学。通过上机练习,加深理解。在本书目录中加**的章节可以酌情不讲。
在本书的成书过程中得到清华大学出版社的支持,在此表示衷心的感谢。后需要说明的是,由于作者的水平有限,书中难免存在疏漏或错误,请读者批评指教。
作者2021年5月
|
|