主讲人:严蔚敏
第一章 绪论
1.1数据结构讨论的范畴
1.2基本概念
1.3算法及其量度
1.1数据结构讨论的范畴
NiklausWirth
Algorithm+ Data Structures = Programs
程序设计:为计算机处理问题编制一组指令集
算法:处理问题的策略
数据结构:问题的数学模型
例如:数值计算的程序设计问题
结构静力分析计算 -线性代数方程组
全球天气预报 -环流模式方程
非数值计算的程序设计问题
例1:求一组(n个)整数中的最大值
算法:基本操作是 比较两个数的大小
模型:
思考:超过最大能存储的数
例2:计算机对弈
算法:对弈的规则和策略
模型:棋盘棋子怎么表示
例3:足协的数据库管理
算法:需要管理的项目?如何管理?用户界面?
模型:
概括地说,数据结构描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中的表示和实现
1.2基本概念
一、数据与数据结构
数据:所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作的对象的总称是计算机处理的信息的某种特定的符号表示形式
数据元素:数据中的一个“个体”,数据结构中讨论的基本单位
数据项:数据结构中讨论的最小单位。数据元素是数据项的集合
例如:运动员(数据元素)
运动员:姓名 俱乐部名称 出生日期 参加日期 职务 业绩
出生日期:年、月、日 组合项
数据结构:带结构的数据元素的集合
例如:一个含12位数的十进制数可以用三个4为十进制数表示
3214,6587,9345 ----a1(3214),a2(6587),a3(9345)
在a1、a2、a3之间存在“次序”关系<a1,a2>、<a2,a3>
3214,6587,9345 != 6587,3214,9345
a1 a2 a3 a2 a1 a3
从结构关系来说是相同的都是存在次序关系的;
例如:2行3列的二维数组{a1,a2,a3,a4,a5,a6}
a1 a2 a3
a4 a5 a6
行的次序关系:
row={<a1,a2>,<a2,a3><a4,a5>,<a5,a6>}
列的次序关系:
col={<a1,a4>,<a2,a5>,<a3,a6>}
a1 a3a5 != a1 a2 a3
a2 a4a6 a4 a5 a6
例如:一位数组{a1,a2,a3,a4,a5,a6}中存在次序关系:{<a(i),a(i+1)|i=1,2,3,4,5}
不同的关系构成不同的结构,因此数据结构是带结构的数据元素的集合
数据的逻辑结构可归结为四类 线性结构 树形结构 图状结构 集合结构
数据结构的形式定义为:数据结构是一个二元组 Data_Structures=(D,S) 其中:D是数据元素的有限集,S是D上关系的有限集。
数据的存储结构--逻辑结构在存储器中的映象
数据元素的映象方法:
用二进制位(bit)的位串表示数据元素
(321)10= (501)8 = (101000001)2
A=(101)8= (001000001)2
关系的映象方法:(表示<x,y>的方法)
顺序映象:以存储位置的相邻表示后继关系 y存储的位置和x的存储位置之间差一个常量C 而C是一个隐含值,整个存储结构中只含数据元素本身的信息 xy
链式映象:以附加信息(指针)表示后继信息 需要一个和x在一起的附加信息指示y的存储位置
在不同的编程的环境中,存储机构可以有不同的描述方法,当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。
例如:以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型,定义长整数为:
typedefint Long_int[3]
二、数据类型
在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。
数据类型是一个值的集合和定义在此集合上的一组操作的总称。
三、抽象数据类型(AbstractData Type简称ADT)
是指一个数据模型以及定义在此数学模型上的一组操作
ADT有两个重要特征:
1)2数据抽象:用ADT描述程序处理的实时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)
例如:抽象数据类型复数的定义:
ADTComplex{
数据对象:D={e1,e2|e1,e2属于RealSet}
数据关系:R1={<e1,e2>|e1复数的实数部分,e2是复数的虚数部分}
基本操作:
InitComplex(&Z,v1,v2)
操作结果:构造复数Z,其实数和虚部分别被赋以参数v1和v2的值。
DestoryComplex(&Z)
操作结果:复制Z被销毁
GetReal(Z,&realPart)
初始条件:复数已存在
操作结果:用realPart返回复数Z的实部值
GetImag(Z,&ImagePart)
初始条件:复数已存在
操作结果:用ImagPart返回复数Z的虚部值
Add(z1,z2,&sum)
初始条件:z1,z2是复数
操作结果:用sum返回两个复数z1,z2的和值
}ADTComplex
假设:z1和z2是上述定义的复数,则Add(z1,z2,z3)操作的结果将得到
2)数据封装:将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节
抽象数据类型的描述方法
抽象数据类型可用(D,S,P)三元组表示其中,D是数据对象C,S是D上的关系集,P是对D的基本操作集
ADT抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
操作有两种参数:赋值参数只为操作提供输入值;引用参数以&大头,除可提供输入值外,还将返回操作结果。
初始条件 描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应的出错信息。
操作结果 说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。
抽象数据类型的表示和实现
抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现