配套幻灯片下载

Download Report

Transcript 配套幻灯片下载

数据结构
1
第一章 绪论
1.1 什么是数据结构
1.2 基本概念和术语
1.3 抽象数据类型的表示与实现
1.4 算法和算法分析
2
1.1 什么是数据结构
数值计算
非数值计算
建立数学模型
设计求解的算法
数据对象及其关系的表示
数据的组织
算法的设计
非数值计算应用的发展,促进了数据结构的研究和发展以
及其体系的完善。
3
例1 书目自动检索系统
线性表
书目文件
001
002
003
004
……
按书名
高等数学
理论力学
线性代数
……
高等数学
樊映川
理论力学
罗远祥
书目卡片
高等数学
华罗庚
登录号:
线性代数
栾汝书
……
……
书名:
S01
L01
S01
S02
……
作者名:
分类号:
出版单位:
001,003……
002,……..
出版时间:
004,……
价格:
樊映川
001,…
L
002,…
华罗庚
002,….
S
001,003,
栾汝书
004,….
……
……..
…….
…….
按分类号
按作者名
……
索引表
4
例2
人机对奕问题
树
……..
……..
…...
…...
…...
…...
5
例3 多叉路口交通灯管理问题
图
C
D
B
E
BA
AB
AC
BC
BD
AD
A
顶点表示通路,通路之间
的连线表示两条通路不能同时
通行。
EA
DA
DB
DC
EB
EC
ED
6
数据结构是一门研究非数值计算的程序设计问题中计
算机的操作对象以及它们之间的关系和操作等等的学科。
数据结构的地位:
是介于数学、计算机硬件和计算机软件三者之间的一门核
心课程。
数学
数据
结构
硬件
软件
7
1.2 基本概念和术语
1. 数据(Data):是对客观事物的符号表示。在计算机科学中是
指所有能输入到计算机中并被计算机程序处理的符号的总
称。
2. 数据元素(Data Element):数据的基本单位。在计算机程序
中通常作为一个整体进行考虑和处理。 一个数据元素可由
若干个数据项组成。数据项是数据的不可分割的最小单位。
数据元素
数据项
001
002
003
004
……
高等数学
理论力学
高等数学
线性代数
……
樊映川
罗远祥
华罗庚
栾汝书
……
S01
L01
S01
S02
……
8
3. 数据对象(Data Object):是性质相同的数据元素的集合。是数
据的一个子集。
4. 数据结构(Data Structure):是相互之间存在一种或多种特定关
系的数据元素的集合。
在任何问题中,数据元素之间都存在着某种关系,这种数
据元素之间的关系称为结构。
数据结构包括逻辑结构、物理结构和施加在数据上的运算。
例如:
3214,6587,9345 ─ a1(3214),a2(6587),a3(9345)
则在数据元素 a1、a2 和 a3 之间存在着“次序”关系
a1,a2、a2,a3
6587,3214,9345
3214,6587,9345
≠
a2
a1
a3
a1
a2
a3
9
5. 逻辑结构:是对数据元素之间逻辑关系的描述。
根据数据元素之间的逻辑结构可将数据结构分为
四类:
集合 ——数据元素除了同属于一种类型外,别无其它关系。
线性结构——数据元素之间存在一对一的关系。如线性表、
栈、队列。
树形结构——数据元素之间存在一对多的关系。如树。
图状结构(或网状结构)——数据元素之间存在多对多的
关系,如图。
10
数据结构的形式定义为:数据结构是一个二元组:
Data-Structure=(D,S)
其中:D是数据元素的有限集,S是D上关系的有限集。
例: 复数的数据结构定义如下:
Complex=(C,R)
其中:C是含两个实数的集合﹛C1,C2﹜,分别表示复数的实
部和虚部。R={P},P是定义在集合上的一种关系{〈C1,C2〉}。
11
6.存储结构(物理结构):数据在计算机中的表示(或映像)。
包括数据的数据元素的映像和关系的映像。
数据元素之间的关系在计算机中有两种不同的表示方法:顺
序映像和非顺序映像。分别对应两种存储结构:
顺序存储结构:借助元素在存储器中的相对位置来表示
数据元素间的逻辑关系。
链式存储结构:借助指示元素存储地址的指针表示数据
元素间的逻辑关系。
数据的逻辑结构与存储结构密切相关:
算法设计
逻辑结构
算法实现
存储结构
12
数据结构的三个方面:
线性表
线性结构
队列
数据的逻辑结构
非线性结构
数据的存储结构
栈
树形结构
图状结构
顺序存储
链式存储
数据的运算:检索、排序、插入、删除、修改等
13
7.数据类型(Data Type):数据的取值范围及其操作的总称。
(是一个值的集合和定义在这个值集上一组操作的总称)
例如C语言中,提供int, char, float, double等基本
数据类
型,数组、结构体、共用体、枚举等构造数据类型,还有
指针、空(void)类型等。用户也可用typedef自定义数据类
型。
typedef struct
{ int num;
char name[20];
float score;
}STUDENT;
STUDENT stu1, stu2, *p;
14
8. 抽象数据类型(Abstract Data Type):是指一个数学模型
以及定义在该模型上的一组操作。
抽象数据类型实际上就是对该数据结构的定义。因为
它定义了一个数据的逻辑结构以及在此结构上的一组算法。
抽象数据类型分类:
• 原子类型:值不可分解,如int。
• 固定聚合类型:值由确定数目的成分按某种结构组成,
如复数。
• 可变聚合类型:值的成分数目不确定,如定义一个有序
整数序列。
15
抽象数据类型可用(D,S,P)三元组表示,其中,D是
数据对象,S是D上的关系集,P是对D的基本操作集。
ADT 抽象数据类型名 {
数据对象:〈数据对象的定义〉
数据关系:〈数据关系的定义〉
基本操作:〈基本操作的定义〉
} ADT 抽象数据类型名
数据对象和数据关系的定义用伪码描述,基本操作的定义
格式为:
基本操作名(参数表)
初始条件:〈初始条件描述〉
操作结果:〈操作结果描述〉
16
基本操作有两种参数:
 赋值参数:只为操作提供输入值。
 引用参数: 以&打头,除可提供输入值外,还将返回操作结
果。
初始条件:描述了操作执行之前数据结构和参数应满足的条件,
若不满足,则操作失败,并返回相应出错信息。
操作结果:说明了操作正常完成之后,数据结构的变化状况和
应返回的结果。若初始条件为空,则省略之。
17
ADT 有两个重要特征:
数据抽象:用ADT描述程序处理的实体时,强调的是其本质
的特征、其所能完成的功能以及它和外部用户的接口(即
外界使用它的方法)。
数据封装:将实体的外部特性和其内部实现细节分离,并且
对外部用户隐藏其内部实现细节。
18
1.3
抽象数据类型的表示与实现
抽象数据类型可通过固有数据类型来表示,即利用已
存在的数据类型来说明新的结构,用已经实现的操作来
组合新的操作。
一、类C语言语法:P10-P13
二、C语言的简要回顾
19
1.4
算法和算法分析
1.4.1 算法
算法(Algorithm)是解决某一特定问题的具体步骤的描述,
是指令的有限序列。
算法的5个重要特性:
(1)有穷性
一个算法必须总是在执行有穷步之后结束,
且每一步都在有穷时间内完成。
(2)确定性 算法中每一条指令必须有确切的含义。不存在
二义性。且算法只有唯一的一条执行路径。
(3)可行性 一个算法是可行的。即算法描述的操作都是可
以通过已经实现的基本运算执行有限次来实现的。
20
(4)输入 一个算法有零个或多个输入,这些输入取自于
某个特定的对象集合。
(5)输出 一个算法有一个或多个输出,这些输出是同输
入有着某些特定关系的量。
注意:
算法和程序是有区别的,即程序未必能满足有穷性。
本教材使用类C语言描述算法的,类C和标准C语言是有区
别的,同时,算法着重于思想的描述,可能会省略许多细节。
不要把算法看成程序,切忌将算法中的相应函数和数据类
型直接照搬到程序中。
21
1.4.2
算法的设计要求
评价一个好的算法有以下几个标准:
(1) 正确性(Correctness ) :算法应满足具体问题的需求。
(2)可读性(Readability):算法应该好读。以有利于阅读者对
程序的理解。
(3)健壮性(Robustness): 算法应具有容错处理。当输入非法
数据时,算法应对其作出反应,而不是产生莫名其妙的输
出结果。
(4)效率与低存储量需求: 效率指的是算法执行的时间;存储
量需求指算法执行过程中所需要的最大存储空间。一般这
两者与问题的规模有关。
22
1.4.3
算法效率的评价
1. 算法效率——用依据该算法编制的程序在计算机上执行所
消耗的时间来度量。
度量程序的执行时间有两种方法:
 事后统计:收集依据此算法编制的程序所执行的时间进行
统计。
缺点:必须执行程序,其它因素掩盖算法本质
 事前分析:求出该算法的一个时间界限函数
23
程序的执行时间取决于以下相关因素:
1.算法选用的策略
2.问题的规模
3.编写程序的语言
4.编译程序产生的机器代码的质量
5.计算机执行指令的速度
显然使用绝对的时间单位衡量算法的效率是不适合的。撇
开与计算机硬件、软件有关的因素, 一个特定算法的“运行
工作量”的大小,只依赖于问题的规模(通常用整数n表示),
或者说,它是问题规模的函数。
24
算法 = 控制结构 + 原操作
(固有数据类型的操作)
算法的执行时间=原操作的执行次数×原操作的执行时间
算法的执行时间与原操作执行次数成正比。
通常从算法中选取一种对于所研究的问题来说是基本
操作的原操作,以该基本操作在算法中重复执行的次数作
为算法运行时间的时间量度。
25
一般情况下,算法中基本操作重复执行的次数是问题规模n
的某个函数f(n),,算法的时间量度记作:
T(n)=O(f(n))
它表示随着问题规模n的增大,算法执行时间的增长率和
f(n)的增长率相同,称作算法的(渐进)时间复杂度。
多数情况下,原操作是指最深层循环内的语句中的原操作
,它的执行次数和包含它的语句的频度相同。
语句的频度是指算法中基本操作重复执行的次数。
26
时间复杂度的计算:
例1:
例2:
T(n)=O(f(n))
程序
频度
{++x;s=0;}
1
O(1)
n
O(n)
n*n
O(n2)
for(i=1;i<=n;++i)
时间复杂度
{++x;s+=x;}
例3:
for(j=1;j<=n;++j)
for(k=1;k<=n;++k)
{++x;s+=x;}
27
例4
计算f=1!+2!+3!+…+n!
void factorsum(n)
int n;
{
int i,j;
int f,w;
f=0;
for (i=1,i<=n;i++)
{
w=1;
for(j=1,j<=i;j++)
w=w*j;
f=f+w;
}
return;
算法的基本运算为乘法操作。
在算法的执行过程中,对外循
环变量i的每次取值,内循环变
量j循环i次。因为内循环每执
行一次,内循环体语句w=w*j只
作一次乘法操作,即当内循环
变量j循环i次时,内循环体的
语句w=w*j作i次乘法。
整个算法所作的乘法操作总数
是:
f(n)=1+2+3+…n=n(n-1)/2
时间复杂为T(n)=O(n2)
28
例5
两个矩阵相乘
void mult(int a[], int b[], int& c[] ) {
// 以二维数组存储矩阵元素,c 为 a 和 b 的乘积
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];
} //for
} //mult
基本操作: 乘法操作
时间复杂度: O(n3)
29
以下六种计算算法时间的多项式是最常用的。其关
系为:
O(1)<O(log2n)<O(n)<O(nlog2n) <O(n2)<O(n3)
指数时间的关系为:
O(2n)<O(n!)<O(nn)
30
有的情况下,算法中基本操作重复执行的次数还随问题的输
入数据集不同而不同。例如:
Void bubble-sort(int a[ ],int n)
for(i=n-1;change=TURE;i>1 && change;--i)
{
最好情况:0次
change=FALSE;
最坏情况:
for(j=0;j<i;++j)
(n-1)+(n2)+…+2+1
=n(n-1)/2
if (a[j]>a[j+1]) {
a[j] ←→a[j+1];
平均时间复杂度:O(n2)
change=TURE }
}
除特别指明外,均指最坏情况下的时间复杂度
31
1.4.4 算法的存储空间需求
算法在运行过程中所占用的存储空间的大小被定义为
算法的空间复杂性。记作:
S(n)=O(f(n))
表示随着问题规模 n 的增大,算法运行所需存储量的
增长率与 f(n) 的增长率相同。
32
一个算法在计算机存储器上所占用的存储空间包括:
(1)存储算法本身所占用的空间
(2)算法的输入/输出数据占用的空间
(3)算法在运行过程中临时占用的辅助空间
若输入数据所占空间只取决于问题本身,和算法无关,则
只需要分析除输入和程序之外的辅助变量所占额外空间。
若所需额外空间相对于输入数据量来说是常数,则称此算法
为原地工作。
若所需存储量依赖于特定的输入,则通常按最坏情况考虑。
33
本章学习要点
1. 熟悉基本术语的含义,掌握基本概念。
2. 理解算法五个要素的确切含义。
3. 掌握计算算法时间复杂度的方法。
34
练
习
1.数据结构被定义为(D,S),其中D是
是D上
的有限集合。
的有限集合,S
2.数据结构有四种基本结构,
即
、
、
3.算法的五个特性分别
是
、
和
。
、和
、
。
、
4.算法的时间复杂度取决于
。
5.在数据结构中,从逻辑上可以把数据结构分成
和
。
6.评价一个算法时间性能的主要标准是
。
35