数据结构1.docx
- 文档编号:9819422
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:157
- 大小:155.36KB
数据结构1.docx
《数据结构1.docx》由会员分享,可在线阅读,更多相关《数据结构1.docx(157页珍藏版)》请在冰豆网上搜索。
数据结构1
第一章绪论
§1.1什么是数据结构
一.数据结构的概念
NiklausWirth说过Algorithm+DataStructures=Programs,其中程序设计:
为计算机处理问题编制一组指令集,算法:
处理问题的策略,数据结构:
问题的数学模型。
在计算机发展的早期,主要用于数值计算,例如:
结构静力分析计算─━线性代数方程组,全球天气预报─━环流模式方程,但是随着计算机应用领域的扩大和硬、软件技术的发展,非数值计算问题越来越多(占90%)
例1:
学生信息检索,计算机处理的对象之间存在一种简单的线性关系,这类数学模型可以归结为线性数据结构。
例2:
计算机和人对弈(八皇后问题等),为了得到合理的布局,计算机要存储当前的布局,从最初的布局开始,每个布局都会衍生出许多新的布局,这时计算机所要处理的是一颗对弈树,也是一种典型的数据结构。
例3:
教学计划的编排(交通灯),一个教学计划包含许多课程,课程间有些必须按规定的先后顺序进行,有些则没有次序要求,各个课程间的次序关系可用图来表示。
也是一种典型的数据结构
由此可见,描述这类非数值计算问题的数学模型已不再是数学方程,而是诸如表、树、图之类的数据结构,因此说,数据结构主要是研究非数值计算的程序设计中所出现的计算机操作对象以及它们之间关系和操作的学科。
二.数据结构的产生和发展
1968年以独立的学科设立,之后不断发展,目前已成为计算机专业的核心课程和许多非计算机专业的选修课程。
§1.2有关概念和术语
一.数据结构的概念
1.数据:
所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作的对象的总称,是计算机处理的信息的某种特定的符号表示形式
2.数据元素:
数据中的一个“个体”,数据结构中讨论的基本单位,一个数据元素可能包含若干数据项,数据项:
数据结构中讨论的最小单位,数据元素是数据项的集合,例如运动员(数据元素)
姓名俱乐部名称出生日期参加日期职务业绩
其中 出生日期 年 月 日是组合项
3.数据对象:
性质相同的数据元素的集合,是数据的一个子集,
4.数据结构:
是相互之间存在一种或多种特定关系的数据元素的集合,数据元素的关系称为结构。
二.数据结构的表示
数据结构是一个二元组:
Data_Structures=(D,S)
其中:
D是数据元素的有限集,S是D上关系的有限集。
严格地讲,以上定义仅是数据的逻辑结构的定义,逻辑结构可以看作是从一个具体问题抽象出来的数学模型,与数据的存储无关。
数据的逻辑结构可归结为以下四类:
线性结构、树形结构、图状结构、集合结构。
集合结构:
属于同一集合,别无其他关系(常用其他结构表示)
线性结构:
数据元素之间存在一对一的关系
树状结构:
数据元素之间存在一对多的关系
图状结构:
数据元素之间存在多对多的关系
数据的存储结构─━逻辑结构在存储器中的映象,他所研究的是数据结构在计算机中的实现,主要有顺序存储、链式存储、索引和散列存储
数据元素的映象方法即关系的映象方法:
(表示
顺序映象以存储位置的相邻表示后继关系,y的存储位置和x的存储位置之间差一个常量C,而C是一个隐含值,整个存储结构中只含数据元素本身的信息,通常用数组来实现。
链式映象以附加信息(指针)表示后继关系,需要用一个和x在一起的附加信息指示y的存储位置,不要求物理位置的相邻。
在不同的编程环境中,存储结构可有不同的描述方法,当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。
例如:
以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型,定义长整数为:
typedefintLong_int[3];
三、数据类型
数据类型:
在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。
因为类型明显或隐含地规定了,在程序执行期间,变量或表达式所有可能取值的范围,以及在这些之上允许进行的操作。
数据类型是一个值的集合和定义在此集合上的一组操作的总称。
四.抽象数据类型(AbstractDataType简称ADT)
1.定义:
是指一个数学模型以及定义在此数学模型上的一组操作,和数据类型本质相同,抽象指的是数学模型的数学抽象特性,而且抽象数据类型的范围更广。
ADT有两个重要特征:
数据抽象:
用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。
数据封装:
将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。
例如抽象数据类型复数的定义:
ADTComplex{
数据对象:
D={e1,e2|e1,e2∈RealSet}
数据关系:
R1={
基本操作:
InitComplex(&Z,v1,v2)
操作结果:
构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。
DestroyComplex(&Z)
操作结果:
复数Z被销毁。
GetReal(Z,&realPart)
初始条件:
复数已存在。
操作结果:
用realPart返回复数Z的实部值。
GetImag(Z,&ImagPart)
初始条件:
复数已存在。
操作结果:
用ImagPart返回复数Z的虚部值。
Add(z1,z2,&sum)
初始条件:
z1,z2是复数。
操作结果:
用sum返回两个复数z1,z2的和值。
}ADTComplex
假设:
z1和z2是上述定义的复数,则Add(z1,z2,z3)操作的结果将得到z3=z1+z2
抽象数据类型的描述方法
2.抽象数据类型可用(D,S,P)三元组表示
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
ADT抽象数据类型名{
数据对象:
〈数据对象的定义〉
数据关系:
〈数据关系的定义〉
基本操作:
〈基本操作的定义〉
}ADT抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为
基本操作名(参数表)
初始条件:
〈初始条件描述〉
操作结果:
〈操作结果描述〉
基本操作有两种参数:
赋值参数只为操作提供输入值;引用参数以&打头,除可提供输入值外,还将返回操作结果。
“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。
“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。
若初始条件为空,则省略之。
§1.3抽象数据类型的表示和实现:
抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现
一、预处理:
#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1
#defineOVERFLOW-2
#include
#include
typedefintStatus;
二、C语言中的运算符
()、[]、->、。
!
~++--+(正)-(负)*(指针)&sizeof(类型)
*/%
+-
<<>>
<=<>>=
!
===
&^|
&&||
=+=-=*=/=%=>>=<<=&=^=|=
(逗号)
§1.4算法和算法的衡量
一、算法
算法是为了解决某类问题而规定的一个有限长的操作序列。
一个算法必须满足以下五个重要特性:
1.有穷性对于任意一组合法输入值,在执行有穷步骤之后一定能结束,即:
算法中的每个步骤都能在有限时间内完成;
2.确定性对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。
并且在任何条件下,算法都只有一条执行路径;
3.可行性算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之;
4.有输入作为算法加工对象的量值,通常体现为算法中的一组变量。
有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中;
5.有输出它是一组与“输入”与确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。
二、算法设计的原则
设计算法时,通常应考虑达到以下目标:
1.正确性
首先,算法应当满足以特定的“规格说明”方式给出的需求。
其次,对算法是否“正确”的理解可以有以下四个层次:
a.程序中不含语法错误;
b.程序对于几组输入数据能够得出满足要求的结果;
c.程序对于精心选择的、典型、苛刻切带有刁难性的几组输入数据能够得出满足要求的结果;
d.程序对于一切合法的输入数据都能得出满足要求的结果;
通常以第c层意义的正确性作为衡量一个算法是否合格的标准。
2.可读性
算法主要是为了人的阅读与交流,其次才是为计算机执行。
因此算法应该易于人的理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试;
3.健壮性
当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。
并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
4.高效率与低存储量需求
通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间。
两者都与问题的规模有关。
三、算法效率的衡量方法和准则
通常有两种衡量算法效率的方法:
事后统计法
缺点:
1。
必须执行程序2.其它因素掩盖算法本质
事前分析估算法
和算法执行时间相关的因素:
1.算法选用的策略
2.问题的规模
3.编写程序的语言
4.编译程序产生的机器代码的质量
5.计算机执行指令的速度
一个特定算法的“运行工作量”的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。
假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作:
T(n)=O(f(n)),称T(n)为算法的(渐近)时间复杂度
如何估算算法的时间复杂度?
算法=控制结构+原操作(固有数据类型的操作)
算法的执行时间=原操作(i)的执行次数×原操作(i)的执行时间,算法的执行时间与原操作执行次数之和成正比从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作,在算法中重复执行的次数作为算法运行时间的衡量准则
例1
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];
}
基本操作:
乘法操作,时间复杂度:
O(n3)
例2
voidselect_sort(inta[],intn){
//将a中整数序列重新排列成自小至大有序的整数序列。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构