数据结构

Download Report

Transcript 数据结构

数据结构
刘家芬 Sept 2011
第一章
1.1
1.2
1.3
1.4
绪 论
什么是数据结构
基本概念和术语
抽象数据类型的表示与实现
算法和算法分析
1.4.1 算法
1.4.2 算法设计的要求
1.4.3 算法效率的度量
1.4.4 算法的存储空间的需求
为什么我们需要学习这门课程?
• Programmer VS Coder?
– 程序设计语言的后续课程:数据结构+算法
– 计算机解决问题的步骤:从具体问题抽象出数学模
型,针对此模型设计算法,然后用哪个程序实现。
• 问:我不想成为程序员,也需要学习这门课吗?
• 答:这是一门通用学科,有助于我们理清解决问题的思
路,明确解决问题的步骤。
1.1什么是数据结构
• 计算机的程序就是对信息进行加工处理。
• 在大多数情况下,这些信息并不是没有组织,
他们之间往往具有重要的结构关系,这就是数
据结构的研究内容。
• 我们实际上已经学过一些数据结构,请举例。
例:电话号码查询算法
设有一个电话号码薄,它记录了N个人的
名字和其相应的电话号码。
要求设计一个算法,当给定任何一个人的
名字时,该算法能够打印出此人的电话号
码,如果该电话簿中根本就没有这个人,
该算法能够给出提示信息。
数据结构的研究内容?
例1、图书馆的书目检索系统自动化问题
例2、计算机和人对弈问题
例3、多叉路口交通灯的管理问题
总结:数据结构就是研究数据的逻辑结构和物理结
构以及它们之间相互关系,并利用这种关系进行计
算的学科。
特点:通用学科 + 交叉学科
1.2 基本概念和术语
• 数据(Data):对客观事物的符号表示。在计算
机科学中是指所有能输入到计算机中并被计
算机程序处理的符号的总称。
• 数据元素(Data Element):是数据的基本单
位,在计算机程序中通常作为一个整体进行
考虑和处理。
– 一个数据元素可由若干个数据项组成。数据项是
数据的不可分割的最小单位。
– 例如:电话簿上的一条信息可以看做一个数据元
素,但信息的每一项(人名、电话号码)是一个
数据项。
1.2 基本概念和术语
• 数据对象(Data Object):是性质相同的
数据元素的集合,是数据的一个子集。
– 整数数据对象{…-2,-1,0,1,2,…}
– 字符数据对象{‘1’, ‘$’, ‘A’,‘B’, ‘C’, …}
• 数据结构(Data Structure):是相互之间
存在一种或多种特定关系的数据元素的
集合。
– 物理结构
– 逻辑结构
逻辑结构的分类
逻辑结构可分为四类:
• 集合 结构中的数据元素除
了同属于一种类型外,别无
其它关系。
• 线性结构 结构中的数据元
素之间存在一对一的关系。
• 树型结构
结构中的数据
元素之间存在一对多的关
系。
• 图状结构或网状结构 结构
中的数据元素之间存在多对
多的关系
例:逻辑结构
用图形表示下列数据结构,并指出它们是
属于线性结构还是非线性结构。
S=(D, R)
D={ a, b, c, d, e, f }
R={(a,e), (b,c), (c,a), (e,f), (f,d)}
上述表达式可用图形表示为:
b
c
a
e
f
此结构为线性的。
d
10
例:逻辑结构
用图形表示下列数据结构,并指出它们是
属于线性结构还是非线性结构。
S=(D, R)
D={di | 1≤i≤5}
d1
R={(di , dj ), i<j}
d5
d2
该结构是非线性的。
d4
d3
11
物理结构
• 数据结构在计算机中的表示称为数据的
物理结构,又称为存储结构。
– 顺序存储:借助元素在存储器中的相对位置
来表示数据元素之间的逻辑关系。
– 非顺序存储(链式存储):借助指针表示数
据元素之间的逻辑关系。
数据结构的形式化定义
数据结构是一个二元组:
Data-Structure=(D,S)
其中:D是数据元素的有限集,
S是D上关系的有限集。
例1-5:P5
数据类型
• 数据类型
– 可以理解为数据对象在高级程序设计语言中的实
现。
– 一个值的集合 + 在这个集合上定义的一组操作
– 可分为原子类型和结构类型
• 在C语言中
– 原子类型:整型、浮点型、字符型
– 结构类型:数组、结构体、共用体、指针
抽象数据类型
• 抽象数据类型(ADT):一个数学模型以及定
义在该模型上的一组操作。
• 抽象数据类型实际上就是对某种数据结构的定
义,例如数组。
• 抽象数据类型可以用以下的三元组来表示:
ADT = (D,S,P)
数据对象 D上的关系集
D上的操作集
抽象数据类型
ADT抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作 :<基本操作的定义>
} ADT抽象数据类型名
基本操作:创建、销毁、插入、删除、修
改、查找、排序
参见例1-6:P9
1.3 抽象数据类型的表示和实现
• 抽象数据类型可以通过固有的数据类型
(如整型、实型、字符型等)来表示和
实现。
• 算法使用类C语言进行描述,上机时选择
一种高级语言进行实现
• 必要情况,请复习C程序设计中的基本函
数和操作,P10
1.4 算法和算法分析
• 算法:是对特定问题求解步骤的一种描述。是
指令的有限序列,其中每一条指令表示一个或
多个操作。
• 算法具有以下五个特性:
–
–
–
–
–
有穷性
确定性
可行性
输入
输出
算法设计的要求
• 评价一个好的算法有以下几个标准:
(1) 正确性(Correctness ) 算法应满足具体问
题的需求。
(2)可读性(Readability) 算法应该好读。以有
利于阅读者对程序的理解。
(3)健状性(Robustness) 算法应具有容错处
理。当输入非法数据时,算法应对其作出反
应,而不是产年莫名其妙的输出结果。
(4)效率与存储量需求 效率指的是算法执行的
时间;存储量需求指算法执行过程中所需要的
最大存储空间。一般,这两者与问题的规模有
关。
算法效率的度量
• 事后测试 收集此算法的执行时间和实际占用
空间的统计资料。
– 计算绝对时间
– 优点?
– 缺点?
• 事前分析 求出该算法的一个时间界限函数
– 撇开机器硬件、软件等因素,可以认为算法运行工
作量的大小只依赖于问题的规模,计算相对时间
时间复杂度
• 一个算法由控制结构和基本操作构成,
算法执行时间是两者的综合。
• 算法中基本操作重复执行的次数可表示
为问题规模n的函数,算法的时间量度记
作T(n)=O(f(n)),称作算法的渐近时间复
杂度。
• 若A(n)=amnm +am-1nm-1 +…+a1n+a0是一
个m次多项式,则A(n)=O(n m)
时间复杂度举例
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];
}
• 一个三重循环,每个循环从1到n,则总
次数为: n×n×n=n3
• 时间复杂度为T(n)=O(n3)
时间复杂度举例
• 频度:与时间复杂度相关的另一个概念,是指
该语句重复执行的次数
• 例 {++x;s=0;}
将x自增看成是基本操作,则语句频度为1,
即时间复杂度为O(1)。
如果将s=0也看成是基本操作,则语句频度为
2,其时间复杂度仍为O(1),为常数阶。
• 例 for(i=1;i<=n;++i)
{++x;s+=x;}
语句频度为:2n 其时间复杂度为:O(n)
即时间复杂度为线性阶。
时间复杂度举例
• 例for(i=1;i<=n;++I)
for(j=1;j<=n;++j)
{++x;s+=x;}
语句频度为:2n2
其时间复杂度为:O(n2)
即时间复杂度为平方阶。
时间复杂度的意义
• 一个算法时间为O(1)的算法,它的基本
运算执行的次数是固定的。因此,总的
时间由一个常数(即零次多项式)来限
界。而一个时间复杂度为O(n2)的算法则
由一个二次多项式来限界。
•
常用时间复杂度
• 以下算法时间复杂度是最常见的。其关系
为:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
• 此外,我们还会遇到指数时间:
O(2n)<O(n!)<O(nn)
• 当n取得很大时,指数时间算法和多项式时
间算法在所需时间上非常悬殊。
时间复杂度的三种情况
• 算法中基本操作重复执行的次数随算法输入数
据集而不同。
– 最坏情况
– 最好情况
– 平均情况
• 以排序为例进行说明。
算法的时间复杂度分析
Void bubble-sort(int a[],int n)
{
//对数组a中的数从小到大进行排序,a从0开始编号
change=TURE;
for(i=n-1; i>=1 && change; --i)
change=FALSE;
for(j=0; j<i; ++j)
if (a[j]>a[j+1])
a[j] ←→a[j+1];
change=TURE;
}
最好情况:0次
最坏情况:1+2+3+…+n-1=n(n-1)/2
平均时间复杂度为:O(n2)
1.4.4算法的存储空间需求
• 空间复杂度:算法所需存储空间的度量,
记作:S(n)=O(f(n)),其中n为问题的规
模。
• 看看下面的这个算法的作用?
a=a+b;
b=a-b;
a=a-b;