第一章 数据结构绪论.docx
- 文档编号:24316196
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:23
- 大小:87.56KB
第一章 数据结构绪论.docx
《第一章 数据结构绪论.docx》由会员分享,可在线阅读,更多相关《第一章 数据结构绪论.docx(23页珍藏版)》请在冰豆网上搜索。
第一章数据结构绪论
课程导入
课程性质:
专业必修课
总学时数:
20*3=60学时
上机学时:
18*2=36学时
假设前提:
已有程序设计基础(C/C++基础,尤其是C语言程序设计基础)
学习目标:
培养数据抽象能力(DataAbstractionAbility)。
注:
C程序设计课则是培养结构化程序设计的能力。
具体涉及两个方面内容的学习和训练:
1)学会分析研究计算机加工数据结构的特征,以便学会针对不同的应用问题,选择合适的逻辑结构、存储结构及相应的算法描述。
并做相应的时间复杂度和空间复杂度的分析。
2)复杂程序设计方法的训练过程。
学会将问题求解的程序设计成结构清楚、正确、符合软件工程规范的系统。
学习方法:
勤奋练习,积极上机实践。
(熟悉各种数据结构的基本思想和算法描述,并不断尝试结合教材内容和课外训练的数据抽象能力的培养)
教学步骤:
整体上分为两个部分内容,一是数据结构的基本思想、方法与应用技巧,二是上机实践。
具体内容:
第一章绪论
第二、三、四、五、六、七章基础(强调从ADT的角度进行描述的思想)
第八章OS/Compiler中的动态存储管理技术(×)
第九、十章查找/内排序
第十一章外排序(×)
第十二章文件结构(×)
注:
由于学时数的限制,第八章、第十一章和第十二章暂时不做要求。
其它章节中,带**号的章节不做要求或不做考试要求。
课程教材
《数据结构》,严蔚敏,吴伟民编著,北京:
清华大学出版社,2003年3月
参考书目
(1)《计算机算法:
设计和分析引论》,[美]S巴斯,朱洪等译,上海:
复旦大学出版社,1985
(2)《DataStructureswithC++》,[美]WilliamFord,WilliamTopp,北京:
清华大学出版社,Printice-HallInternational,inc.1998年4月,ISBN7-302-02413-8
(3)《数据结构、算法与应用----C++语言描述》,[美]SartajSahni著,汪诗林,孙小东译,北京:
机械工业出版社,2002年10月,ISBN7-111-07654-1
(4)《计算机程序设计艺术》(第2版),第3卷,[美]DonaldE.Knuth著,北京:
清华大学出版社,2002年9月,ISBN7-302-05816-4
(5)《算法设计技巧与分析》,(沙特)M.H.Alsuwaiyel著,北京:
电子工业出版社,2004年8月,ISBN7-121-00108-X
注:
其它很好的学习类参考书籍,请咨询高年级学长或光临书店!
习题及实验参考书
(1)《数据结构实验教程》(C语言版),王玲主编,成都:
四川大学出版社,2003年7月
(2)《数据结构习题集》(C语言版),严蔚敏,吴伟民编著,北京:
清华大学出版社,2003年1月
第一章绪论
需要对程序的处理对象进行组织研究的两大主要原因:
一是计算机领域的渗透早已使其应用不再局限于早期的科学计算领域其加工处理对象由纯粹的数值类发展到具有一定结构的数据类型,如字符、表、图形、图像、声音等,使得程序设计活动面临了许多新的问题需要解决。
二是要编写出好的程序系统,人们发现,必须要对待处理对象的数据特性、各处理对象之间的关系进行分析、组织,使编写出的程序能够有效地处理和解决它们。
它们构成了数据结构的研究动力和研究内容。
1-1什么是数据结构?
DataStructure(DS):
Data----
(1)facts;
(2)Informationpreparedfororstoredbyacomputer;
Structure----wayinwhichsomethingisputtogether,organized,built,etc.
1-1-1不同问题的数据结构模型构建实例分析
用计算机解决问题的步骤:
抽象其数学模型求解该模型的算法编制程序测试或调试得解
(1)对数值计算问题
例1-1求解梁架结构中应力的数学模型;预报人口增长的微分方程模型。
其关键在于分析问题,提取或寻找对象之间的结构关系,然后用数学语言加以描述。
(2)对无法用数学模型描述的非数值计算问题
其数学模型集中在数据结构的建立中。
例1-2图书馆书目检索系统自动化问题。
按书名的索引表、按作者名的索引表、按分类号的索引表、按登录号排列的书目表表示结构就是其检索问题中的基本数据关系的数学模型(此为线性的结构关系模型)。
(见教材P1-2)
例1-3人机对弈问题。
其对弈策略、规则驱动、棋盘状态、前景预测方法等模型的建立,同时,棋盘状态描述模型是对弈问题的关键性数据描述模型,但棋局之间的关系往往不是线性的,需要用非数值型结构来描述。
例如:
#字游戏问题(见教材P2)。
需要用到所谓“树结构”来描述这些棋盘状态之间转换过程。
例1-4多叉路口交通灯的管理问题(在多叉路口需要设多少颜色的灯,使得车辆之间互不碰撞,同时车流量最大)(见教材P2-3)对图的顶点作图的问题。
与此相关的还有如哥黎斯堡七桥问题、逻辑电路设计问题等,用传统的数学模型是无法描述的。
必须用新型的所谓“图结构”进行描述。
1-1-2DS课程的研究内容及课程历史
DS研究内容:
研究非数值计算的程序设计问题中计算机的操作对象以及它们之间关系和操作的一门学科课程。
DS作为一门独立课程的发展历史:
1968年,DS与图论、表、树为“同义语”。
后来,扩充到了网络、集合代数、格、关系等(它们又构成了“离散数学”的基础内容)。
再后来,将大型数据库系统中的文件管理以及
内存管理等技术也纳入了本课程中来。
《计算机程序设计艺术》(第一卷),DonaldKnuth(Turing奖获得者)(开创了最初的DS体系,是第一本系统阐述数据的逻辑结构、存储结构及其操作的著作)
目前,DS是许多专业的选修或必修课。
DS课程的地位(综合性非常强)(见教材P4图1.4):
界于数学、计算机软件和计算机硬件之间的核心课程。
既是一般程序设计的基础,更是编译程序、OS、DBS及其它大型的系统程序和应用程序设计与实现的重要基础。
发展方向:
1)向各专门领域中的特殊问题之数据结构研究发展;
2)从ADT观点来研究。
1-2数据结构中涉及的基本概念与术语
1-2-1基本概念和术语
(1)Data----(facts/information)能被计算机处理的符号总称,是待加工的“原料”
例如:
求解代数方程组时的Data为integer/real型的系数或根等;
编译器的Data为:
程序代码或字符序列;
文字编辑器的Data为:
字符、图形等。
(2)DataElement----对数据进行处理的基本单位
例如:
前述的棋盘之格局;图中的顶点等。
注:
数据元素一般由若干数据项(DataItem)组成。
又如:
前述图书书目中的书卡数据由作者姓名、书名、书号等数据项构成。
(3)DataObject----相同性质的数据元素之集合
例如:
整数数据对象即集合
;字母字符对象即
;计算机信息与计算科学专业2003级学生对象即全体该班的学生集合等。
(4)DataStructure----相互之间存在某种特定关系的数据元素之集合(从操作对象抽象出来的数学模型)
注1:
DS中的数据元素不是孤立存在的;
注2:
数据元素之间的关系即可称为“结构”;
注3:
数据元素之间的关系有4种基本结构:
集合(set)关系----无序的松散关系;
线性(linear)关系----一一对应关系(one-one);
树(tree)关系----一对多关系(one-many);
图(graph)关系或者网(net)关系----多对多关系(many-many)。
(如教材P5图1.5所示)
注4:
DS的形式定义为:
D_S=(D,S)。
其中,D为数据对象有限集合,S为D上的关系有限集合。
注5:
一般而言,DS要表达的是一组具有相同结构的数据对象之值的集合。
1-2-2实例分析
例1-4复数关系的定义。
数据结构:
Complex=(C,R)。
其中,C是两个实数集合{c1,c2};R是定义在C上的一种关系,即R={P}={
其中,序偶
例1-5事务管理程序中的课题小组信息的数据结构。
假设1位老师带1~3名研究生,1位研究生带1~2位学生,则数据结构如下:
Group=(P,R)。
其中,P={T,G1,…,Gn,S11,…Snm,1<=n<=3,1<=m<=2}
R={R1,R2}
R1={
R2={
1-2-3其它概念与术语
(1)逻辑结构(LogicalStructure)---描述数据元素之间的逻辑关系的结构。
(2)物理结构(PhysicalStructure)----描述数据元素在计算机中的实际存储映射关系的结构,又称存储结构。
存储结构一般包含两个部分的内容:
一是数据元素的存储,二是数据元素之间关系的存储。
(3)容量单位问题
Byte,bit,KB,MB,GB,TB
(4)数据域(DataField)----当数据元素由若干个数据项组成时,各数据项位串被称为数据域。
(5)数据节点(Node)----数据元素。
(6)数据元素之间关系的两种映射方法
顺序映射----顺序存储结构。
借助元素在存储器中存储的相对位置关系来表示数据元素之间的逻辑关系。
非顺序映射----链式存储结构。
借助指示元素存储地址的指针来表示元素之间的逻辑关系。
注:
数据的逻辑结构与物理结构是紧密相关的。
一般来讲,任何一个算法的设计取决于其数据的逻辑结构,而算法的实现取决于其数据的存储结构。
(7)虚拟存储结构----存储结构的基于高级程序设计语言的描述方法
虚拟存储结构
物理存储结构
图1-3数据结构的虚拟存储结构的系统层次定位
通过高级语言的数据类型来描述。
例如:
一维数组用于描述顺序存储结构;指针用于描述链式存储结构;struct,union等用来表示复杂问题的数据结构。
DS中的虚拟存储结构在计算机系统中的层次位置如图1-3所示。
(8)数据类型(DataType)----用于刻画程序中的操作对象之值的集合及定义在其上的一组相应操作的抽象总称。
注1:
每个变量、常量或表达式都有一个属于它的数据类型。
显式地或者隐含地规定了变量等在程序执行期间的所有可能取值,及其上允许的一组操作。
注2:
数据类型一般分为原子类型(AtomDataType)和结构类型(StructureDataType)。
前者即基本数据类型,后者即复杂结构类型。
注3:
数据类型的作用:
从硬件的角度,它是解释计算机内存信息含义的手段;从用户的角度,它实现的信息的隐藏,将用户不必了解的细节隐藏了起来。
(9)抽象数据类型(AbstractDataType)----一个数学模型及定义在其上的一组操作。
注1:
其定义仅取决于其逻辑结构特性,与机器内部的表示与实现无关。
只要其数学特性不变,则其外部的使用将不受影响。
注2:
本质上跟数据类型概念一致。
但ADT比之更广泛,不再局限于处理器已经定义的类型(固定数据类型),还包含用户设计软件时的自定义数据类型。
注3:
程序设计方法学:
软件系统框架应建立在数据之上,而不是建立在操作之上。
其目的是为了提高软件的复用程度。
具体而言,即:
在软件系统每个相对独立的模块上,建立起一组数据和施加于这些数据的一组操作,并在模块内部给出这些数据的表示及相应的操作细节,但在外部的使用只是其抽象的数据和抽象的操作。
1-2-4ADT的结构及定义方法
抽象数据类型的形式定义(三元组):
ADT=(D,S,P)
其中,D----Data,S----RelationsonD,P----OperationsonD。
本书对抽象数据类型的定义形式:
ADT抽象数据类型名{
数据对象:
<数据对象的定义>
数据关系:
<数据关系的定义>
基本操作:
<基本操作的定义>
}ADT抽象数据类型名
其中数据对象和数据关系用伪码描述。
基本操作的一般定义格式为:
基本操作名(参数表)
初始条件:
<初始条件描述>
操作结果:
<操作结果描述>
其中,参数表中的参数有赋值参数(只负责提供操作用的输入值)和引用参数(&)(既可输入值,也返回操作结果值)。
初始条件描述了操作执行之前,数据结构和参数应当满足的要求,若不满足,操作将失败,并应返回相应出错信息。
如没有初始条件,则初始条件为空。
操作结果是指在正常操作完成之后,数据结构的变化及其它应该返回的结果。
例1-6对抽象数据类型三元组的定义。
ADTTriplet{
数据对象:
D={e1,e2,e3|e1,e2,e3
ElemSet}
数据关系:
R1={
基本操作:
InitTriplet(&T,v1,v2,v3)
操作结果:
构造三元组T,v1,v2,v3分别赋给元素e1,e2,e3。
DestroyTriplet(&T)
操作结果:
三元组T被销毁。
Get(T,i,&e)
初始条件:
三元组T已经存在,且1<=i<=3
操作结果:
用e返回T的第i个元素
Put(&T,i,e)
初始条件:
三元组T已经存在,且1<=i<=3
操作结果:
改变T的第i个元素的值为e
IsAscending(T)
初始条件:
三元组T已经存在
操作结果:
如果T的三个元素按升序排列,则返回true,否则,返回false
IsDescending(T)
初始条件:
三元组T已经存在
操作结果:
如果T的三个元素按降序排列,则返回true,否则,返回false
Max(T,&e)
初始条件:
三元组T已经存在
操作结果:
用e返回T的三个元素中的最大者的值
Min(T,&e)
初始条件:
三元组T已经存在
操作结果:
用e返回T的三个元素中的最小者的值
}ADTTriplet
多形数据类型(PolymorphicDataType)----具有相同的数学抽象特性的类型,即不论元素的特性如何,元素之间的关系及对元素的操作都相同。
注1:
多形数据类型由C++类OOPL语言实现之。
即C++中的多态技术。
注2:
本书以C为背景描述算法,所以,都假定其数据元素的成分是确定的。
其在上机实践时需要由程序设计者确定或自行定义。
1-3ADT的表示与实现
基本原则:
通过高级语言中固有的DT来表示和实现。
(本书)介于伪代码与C语言之间的类C描述,以便于转成C或C++程序实现之。
为什么选择C?
C语言并不是描述抽象数据类型(即数据结构)的理想工具。
但鉴于如下理由:
“面向对象的程序设计”并非程序设计的入门课程或“数据结构”课程的先修课程。
同时,由于C/C++又是目前计算机软件程序设计实现中的主流环境工具。
解决的办法:
本书精选了一个C语言的核心子集,并增添了C++的引用调用参数传递方式,构成了数据结构和算法描述的C描述语言。
其特点:
不拘泥于C的细节,又容易转换成C/C++程序。
本书的类C工具核心子集说明:
(教材P10-13)
(1)预定义常量
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus/*Status表示函数的类型,其值是函数结果的状态编码*/
(2)DS的表示
数据结构的表示或存储结构都用“类型定义”进行描述,即typedef。
数据元素的用ElemType表示,其具体类型由用户在实现时定义。
(3)基本操作或算法都以函数的形式描述
一般的函数格式:
函数类型函数名(函数参数表){
/*算法说明部分*/
算法实现的语句序列
}//函数名
注1:
参数类型要说明。
算法内部使用的辅助变量可以不说明,或做简要注释即可。
注2:
约定符号含义:
1)a,b,c,d,e等表示数据元素的名;
2)i,j,k,l,m,n表示整型变量名;
3)p,q,r等表示指针变量名;
4)当函数返回值为结果状态时,函数类型用Status说明;
5)函数调用有两种:
值调用;引用(C++概念,用‘&’表示在C中用指针的形式表示)。
(4)赋值语句的形式
简单赋值、串联赋值和条件赋值与C相似;
成组赋值形式:
(变量名1,…,变量名n)=(表达式1,…,表达式n)
结构名=结构名;
变量名[]=表达式;
变量名[起始下标..终止下标]=变量名[起始下标..终止下标];
交换赋值形式:
变量名变量名;
(5)选择语句(if/switch)
(6)循环语句(for/while/do-while)
(7)结束语句(return/break/exit(异常代码))
(8)I/O语句(scanf()/printf())
(9)注释(//)
(10)基本函数
max(表达式1,…,表达式n)
min(表达式1,…,表达式n)
abs(表达式)
floor(表达式)----求不足整数值
ceil(表达式)----求进位整数值
eof(文件变量)----判定文件是否结束
eoln(文件变量)----判定行是否结束
(11)逻辑运算约定(&&,||,!
等)
例1-7抽象数据类型Triplet的表示与实现。
//----------采用动态分配的顺序存储结构----------
typedefElemType*Triplet;//三元组元素的数据类型,ElemType需要自us定义
//----------基本函数的原型说明----------
StatusInitTriplet(Triplet&T,ElemTypev1,ElemTypev2,ElemTypev3);
//操作结果:
用v1,v2,v3构造三元组T
StatusDestroyTriplet(Triplet&T);
//操作结果:
销毁三元组T
StatusGet(TripletT,inti,ElemType&e);
//初始条件:
三元组T已经存在,i的取值为1-3
//操作结果:
将T的第i个元素取出来,用e返回之
StatusPut(Triplet&T,inti,ElemTypee);
//初始条件:
三元组已经存在,i的取值为1-3
//操作结果:
用e作为T的第i个元素的值
…
//----------基本操作的实现----------
StatusInitTriplet(Triplet&T,ElemTypev1,ElemTypev2,ElemTypev3)
{//用v1,v2,v3构造三元组T
T=(ElemType*)malloc(3*sizeof(ElemType));//分配三个元素空间
if(!
T)exit(OVERFLOW);//分配失败时,退出程序执行
T[0]=v1;T[1]=v2;T[2]=v3;
returnOK;
}//InitTriplet
StatusDestroyTriplet(Triplet&T)
{//销毁三元组T
free(T);
t=NULL;
ReturnOK;
}//DestroyTriplet
StatusGet(TripletT,inti,ElemType&e)
{//将T的第i个元素取出来,用e返回之
if(i<1||i>3)returnERROR;//下标值不合法时,直接退出
e=T[i-1];
returnOK;
}//Get
…
1-4算法与算法分析方法
1-4-1算法及其特征
算法(Algorithm):
对特定问题求解步骤的描述指令操作的有限序列。
(Setofrulesorproceduresthatmustbefollowedinsolvingaproblem)
基本特征:
1)有穷(Finite)
对任何合法的输入值,算法必须在有限步骤之内停止或完成或结束。
注:
这种“有穷性”使得算法不必保证一定得解。
其结果有如下几中情形:
有解;无解;有理论解,但算法的运行没有得到之;不知有无解,且算法的有穷执行中也没有得到解。
2)确定性(Definite)
算法中的每一条指令必须有确切的含义,不会产生理解上的偏差。
算法在任何时候只有唯一的一条执行路径。
即相同输入,得相同输出。
3)可行性(Feasibility)
算法是可行的。
其描述的操作都是可以通过基本运算的有限次运算来实现的。
4)输入(Input)
有0个或多个输入。
5)输入(Output)
有1个或多个输出。
1-4-2算法设计的要求
好算法的主要特性:
1)正确性(Correctness):
满足具体问题的要求。
四种级别要求:
(1)无语法错误
(2)对几组输入数据可得到符合要求的解(3)对精选的、典型的、苛刻的输入能得到符合要求的解(4)对一切合法的输入都可以得到符合要求的解。
2)可读性(Readability):
好(易于阅读、理解、交流)
3)健壮性(Robustness):
对非法输入数据或操作,能从容应对并给出提示,不影响结果。
4)时空效率(Time-SpaceEfficiency):
高时、空效率。
1-4-3算法(时间)效率的度量方法
两种度量方法:
1)事后统计法
其依赖的因素是算法的实现和具体的计算机软/硬环境情况。
2)事先估计法
程序执行过程的耗时分析:
(1)算法策略;
(2)问题规模;(3)程序代码实现的语言种类(语言级别越高,时间效率越低);(4)编译器的质量;(5)机器的执行速度等。
结论1:
绝对的时间单位来衡量算法的效率是不合适的。
结论2:
除开软、硬件因素外,效率或工作量主要决定于问题的规模大小。
算法的渐进时间复杂度(Asymptotictimecomplexity)或时间复杂度:
(1)一个算法取决于控制结构(顺序、选择、循环)和原操作的综合效果。
因此,可以用关于问题规模的函数来表示算法的“原操作”时间为单位的效率度量。
一般表示为:
例如:
N*N矩阵乘法中,“乘法”是该问题的基本操作或原操作,所以:
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
c[i][j]=0;
for(k=1;k<=n;++k)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
以上算法的乘法是基本操作,其次数与n3成正比,记作T(n)=O(n3)。
(2)原操作的频度(Frequencycount):
即原操作的重复执行次数。
例如:
(a){++x;s=0}
(b)for(j=1;j<=n;j++){++x;s+=x;}
(c)for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
{++x;s+=x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第一章 数据结构绪论 数据结构 绪论