Transcript Document

第一章 绪论
§ 1.1 基本术语
§ 1.2 数据结构的定义及研究的内容
1.2.1 数据的逻辑结构
1.2.2 数据的存储结构
1.2.3 数据的运算
§ 1.3 算法
1.3.1 算法的概念及特性
1.3.2 算法的描述
1.3.3 算法的评价
§ 1.4 学习数据结构的意义和目的
第一章 绪论
§ 1.1 基本术语
 数据(Data)是人们约定的符号,用它来表示客观事物及其
活动,是信息的载体。数据是计算机程序加工处理的对象。
 数据元素(Data Element)是数据的基本单位,在计算机程
序中通常作为一个整体进行考虑和处理,在不同的情况下,
又可以称为元素、结点、顶点或记录。数据是由数据元素构
成的。
 数据项(Data Item)是构成数据元素不可分割的具有独立含
义的最小标识单位。若数据元素可再分,则数据元素是由若
干个数据项组成;如数据元素不可再分,数据元素和数据项
是同一概念,如整型数据就是不可再分的。
 数据类型(Data Type)是一个值的集合和定义在这个值集上
一组操作的总称。按值的不同特性,高级程序设计语言中的
数据类型可分为原子类型和结构类型两类。
§ 1.2 数据结构的定义及研究的内容
数据结构的定义及研究的内容
数据结构(Data Structure):按照某种逻辑关系组
织起来的一批数据,用一定的存储方式存储在计算机
的存储器中,并在这些数据上定义一个运算的集合,
就称为一个数据结构(Data Structure)。
数据结构重点研究的内容:
 (1)数据的逻辑结构:即数据之间的逻辑关系。
 (2)数据的存储结构:即数据及数据之间的关系在计算机
存储器中的表示。
 (3)数据的运算:即对数据施加的各种操作。
数据的逻辑结构
数据的逻辑结构(Logical Structure:的是数据元素之间的逻辑
关系。它是人们根据实际问题的需要和问题本身所含数据之间的
内在联系而抽象出来的数学模型,与如何利用计算机存储和处理
无关,所以被称为数据的逻辑结构。
由于数据的逻辑结构是数学模型,可以借助数学方法来表示,具
体的可以用离散数学中关系代数的二元组表示:
Data_Structure =(D,S)
通常取S中的一个关系rj来进行讨论,rj可以表示为数据元素的序
偶<di,dj>的集合。如果集合中有序偶<di,dj>,表示数据元素di
和dj之间有rj这种关系。
用二元组表示的数据的逻辑结构,有如下的常用术语
(1)前趋结点、后继结点、相邻结点
(2)开始结点、终端结点、内部结点
数据的逻辑结构还能够利用更形象的图形表示
di
dj
数据的逻辑结构有两大类:
(1)线性结构:经典的线性结构是线性表。
线性结构的逻辑特征是:有且仅有一个开始结点和一个终端结点,其
余的内部结点都有且仅有一个前趋结点和一个后继结点,也就是说结构中
的数据元素间存在着一对一的相互关系。
(2)非线性结构:经典的非线性结构有树形结构和图形结构。
树形结构的逻辑特征是:有且仅有一个开始结点,可有若干个终
端结点,其余的内部结点都有且仅有一个前趋结点,可以有若干个后
继结点,也就是说结构中的数据元素间存在着一对多的层次关系。
图形结构的逻辑特征是:可有若干个开始结点和终端结点,其余
的内部结点可以有若干个前趋结点和若干个后继结点,也就是说结构
中的数据元素间存在着多对多的网状关系。
表1.1 某校围棋社团学生简表
学号
姓名
性别
出生日期
职务
01
黄家正
男
1982-08-05
团长
02
赵 芳
女
1981-08-15
组长
03
王 明
女
1983-04-01
组长
04
王 红
女
1982-06-28
组员
05
张小才
男
1984-03-17
组员
06
马立伟
男
1983-10-12
组员
07
孙 刚
男
1982-07-05
组员
08
刘 永
男
1982-12-09
组员
例1.1 在表1.1中,八名学生按学号从小到大排
列,形成一个线性结构。假设表示这种逻辑结
构的关系为r1,则r1可以定义为学生按学号顺
序递增排列的关系,该线性结构的逻辑结构可
用二元组表示为:
L =(D,S),r1∈S
D ={01,02,03,04,05,06,07,08}
r 1 ={<01,02>,<02,03>,<03,04>,<04,05>,
<05,06>,<06,07>,<07,08>}
01
02
03
04
05
06
图1.1 线性结构的图示
07
08
例1.2 在表1.1中,学生之间还存在着领导与被领
导关系,其中01号学生为团长,直接领导02和03号
学生,他们分别是组长,02号学生直接领导04和05
号学生,03号学生直接领导06、07和08号学生,
假设表示这种逻辑结构的关系为r2,则r2可以定义
为学生之间的领导与被领导关系,该数据结构的逻
辑结构可用二元组表示为:
T =(D,S),r2∈S
D ={01,02,03,04,05,06,07,08}
r2 ={<01,02>,<01,03>,<02,04>,<02,05>,
<03,06>,<03,07>,<03,08> }
01
02
04
03
05
06
07
图1.2 树形结构的图示
08
例1.3 在表1.1中,学生之间还有好友关系,如01和02、03、
05号是好友,02和04号是好友,03和05号是好友,04和05
、06号是好友,06和07之间是好友,08无好友,假设表示
这种逻辑结构的关系为r3,则r3可以定义为学生之间的好友
关系,该数据结构的逻辑结构可用二元组表示为:
G =(D,S),r3∈S
D ={01,02,03,04,05,06,07,08}
r3 ={<01,02>,<02,01>,<01,03>,<03,01>,<01,05>,<05
,01>,<02,04>,<04,02>,<03,05>,<05,03>,<04,05>,
<05,04>,<04,06>,<06,04>,<06,07>,<07,06>}
01
03
02
08
05
04
07
06
图1.3 图形结构的图示
数据的存储结构
数据的存储结构(Storage Structure),是指数据的逻辑结构到
计算机存储器的映射。
对于数据的逻辑结构G =(D,S),在映射中,一方面要将数据
集D中的数据元素存放到存储器中,另一方面还要体现关系集S
,常见的体现关系S的方式有显示和隐含两种。
常用的实现数据存储结构的方法有如下四种:
 1.顺序存储
 2.链接存储
 3.索引存储
 4.散列存储
四种存储方法,可以单独使用,也可以组合起来对数据结构进行
存储映象。同一种逻辑结构采用不同的存储方法,可以得到不同
的存储结构。针对具体的应用,某种数据结构选择何种存储结构
主要考虑运算的方便及效率。
存储结构的描述:数据的存储结构是数据的逻辑结构用计算机语
言的实现,它是依赖于计算机语言的,因此可以借用高级语言中
提供的数据类型(如数组、指针等)来描述它。
 1.顺序存储
基本思想是:把逻辑上相邻的数据元素存储在物理位置上相
邻的存储单元里。
数据元素间的逻辑关系由存储单元的邻接关系来体现,也就
是说逻辑关系上相邻物理位置上也相邻,数据元素的逻辑次
序与物理次序一致。这是一种隐含体现关系的存储方法,关
系隐含在存储位置上。
数据元素在存储区域中是连续存放的,这种存储方法称为顺
序存储结构(Sequential Storage Structure),通常用计算
机高级语言中的数组来描述。
 2.链接存储
基本思想是:通过附加指针域表示数据元素之间的关系。
这种存储方法不要求逻辑上相邻的数据元素存储位置上也相
邻,数据元素间的逻辑关系是通过附加指示其他数据元素位
置的地址信息(指针)而得到的,这是一种显示体现关系的
存储方法。
数据元素在存储区域中可以是连续的,也可以是不连续的,
通常用计算机高级语言中的指针来描述,称为链接存储结构
(Linked Storage Structure)。
由于不要求存储空间的连续性,很适合动态存储管理
例1.4 用上述两种方法存储有序序列A=(99,
123,134),假设每个数据元素占2个字
节,即一个存储单元为两个字节。
图1.4 关系的映像方法
 3.索引存储
基本思想是:除了存储数据元素,还要建立一个或若干个附加
的索引表来标识数据元素的地址。
索引表中的每一项称为索引项,是用来标识一个或一组数据元
素的存储位置。索引项一般形式为(关键字,地址),其中的
关键字是用来标识数据元素的数据项。
若每个数据元素对应一个索引项,则该索引表为稠密索引(
Dense Index)。若一组数据元素对应一个索引项,则该索引
表称为稀疏索引(Sparse Index)。
索引存储方法主要是用于实现快速查找而设计的一种存储方式
。
 4.散列存储
基本思想是:根据数据元素的关键字直接计算出该结点的存储
地址,通常称为关键字-地址转换法。在此方法中需要设计一
个散列函数,以关键字为自变量,散列函数值即为地址。
用这种存储方法设计的存储结构最适合按关键字进行查找,但
数据元素之间的关系已经无法在存储结构上体现。
 数据的运算
数据的运算(也称操作)是指对数据元素进行加工和处理。
运算的种类很多,具体视应用的要求而设置运算的种类。
对每种数据结构设置一些基本运算(操作),使得不同应用都能通
过这些操作实现对数据结构的各种访问,是数据结构中研究的一个
重要方面。数据结构的基本操作一般包括查找、插入、删除、更新
、排序等。
这些基本运算实际是在抽象的数据上所施加的一系列抽象的操作,
所谓抽象的操作,就是不涉及具体的应用,只知道这些操作应该完
成的功能,但无须考虑“如何完成”。这些运算的粒度很小,是构造
复杂运算的基础。
数据基本运算的定义是基于数据的逻辑结构,每种经典的逻辑结构
都有一个运算的集合。
数据的运算是定义在数据的逻辑结构上而实现在数据的存储结构上
的。
数据的运算是通过算法来描述的 。
在讨论任何一种数据结构时,都应该将数据的逻辑结构、数据的存
储结构和数据的运算这三方面看成一个整体,不要孤立地理解一个
方面,而要注意它们之间的联系
§ 1.3 算法
算法的概念及特性
算法(Algorithm)是解决特定问题的方法和步骤,是由若干条指
令组成的有限序列。
一个算法必须具有以下五个特性:
(1)有穷性:对于任意一组合法输入值,一个算法必须总是在执行
有穷步骤后结束,有限时间内完成。
(2)确定性:算法中每条指令都确切地规定了所应执行的操作,使
算法的执行者或阅读者能明确其含义及如何执行,不致产生二义性
或多义性;另外,在同一条件下,一个算法只能有一条执行路径。
(3)可行性:算法中的每一步都是可行的,都可以通过手工或机器
可以接受的有限次操作在有限时间内完成。
(4)输入:一个算法有0个或多个输入,这些输入是算法所需的初始
量或待处理的对象,来自某个特定的对象集合。
(5)输出:一个算法有1个或多个输出,这些输出与输入有着某种特
定的关系。
算法的描述
算法一般可以采用自然语言、程序流程图、伪码、高级
程序设计语言等描述。
算法的评价
通常从定性和定量两方面来评价一个算法
 算法的定性评价,是从算法的设计者和使用者角度来衡量优劣
的
(1)正确性(Correctness)是指算法应当满足具体问题的需
求,即对合理的输入,算法都会得出正确的结果,这是设计
和评价一个算法的首要条件,否则其他的评价标准也就无从
谈起。
(2)可读性(Readablity)是指算法被理解的难易程度。
(3)健壮性(Robustness)是指算法对输入的非法数据恰当
地作出反映或进行相应处理的能力。
(4)简单性(Simplicity)是指一个算法所采用的逻辑结构、
存储结构以及处理过程的简单程度。
 算法的定量评价
(1)时间复杂度(Time Complexity)是一个算法运行时所耗费
的系统时间,也就是算法的时间效率。
每条语句重复执行的次数称为语句的频度(Frenquency count)
当不考虑算法运行的软硬件环境时,算法所耗费的时间就是该算
法中所有简单语句的频度之和。
一般情况,在讨论算法的时间效率时,主要考虑当问题规模n趋
向无穷大时,时间复杂度T(n)的数量级,亦称为算法的渐近时间
复杂度,则T(n)= O(f(n)) 。
记号“O”是一个数学符号,其数学定义是:
设T(n)和f(n)均为正整数n的函数,若存在两个正整数M和
n0,使得当n≥n0时,都有 | T(n)|≤ M | f(n)| 存在,则T(n)= O(f(n))
。
lim T (n) / f(n) = M
n 
在多数情况下,当一个算法中有若干个循环语句时,算法的时间
复杂度是由嵌套循环中最内层循环语句的频度决定的。需要注意
的是,如果算法中包括对其他函数或算法的调用,计算算法的时
间复杂度时还要分析被调用算法或函数的时间复杂度。
例1.5 求一维数组元素中的最大值
int sum(int a[],int n)
{ int i,s;
(1)
s= a[0];
/*1次*/
(2)
for(i=1;i<n; i++; ) /*n次*/
(3)
if (s< a[i]) s= a[i]; /*n-1次*/
(4)
return s;
/*1次*/
}
T1(n)= 1+n+n-1+1=2n+1
T1(n)=O(n) ,即f(n)=n
例1.6 两个n阶方阵相加
void Matrixadd(int a[ ][ ],int b[ ][ ],int c[ ][ ],int n)
{ int i,j;
(1)
(2)
(3)
for (i=0;i<n;i++)
/*n+1次*/
for (j=0;j<n;j++)
/* n×(n+1)次*/
c[i][j]=a[i][j]+b[i][j]; /* n2次*/
}
T2(n)= n+1+ n×(n+1)+ n2=2n2+2n+1
T2(n)=O(n2),即f(n)=n2
例1.7 求两个n阶方阵的乘积
void Matrixmlt(int a[ ][ ],int b[ ][ ],int c[ ][ ],int n)
{ int i,j,k;
(1) for (i=0;i<n;i++)
/*n+1次*/
(2)
for (j=0;j<n;j++)
/* n×(n+1)次*/
(3)
{ c[i][j]=0;
/* n2次*/
(4)
for (k=0;k<n;k++)
/* n2×(n+1)次*/
(5)
c[i][j]= c[i][j]+a[i][k]*b[k][j]; /* n3次*/
}
}
T3(n)= n+1+ n×(n+1)+ n2+ n2×(n+1)+ n3=2n3+3n2+2n+1
T3(n)= O(n3) ,即f(n)=n3
 最好时间复杂度、最坏时间复杂度和平均时间复杂度
例1.8 在一维数组中查找指定的元素
int search(int a[],int x,int n)
{ int i;
(1) for(i=0;i<n; i++; )
(2)
if (a[i]==x) ruturn i+1;
(3)
return 0;
}
最好时间复杂度为O(1)
最坏时间复杂度为O(n)
平均时间复杂度为O(n):在查找各个元素概率相等的情
况下,平均的比较次数为:(1+2+3+4+…+(n-1)+n)
/n=(n+1)/2,平均时间复杂度为O(n)。
 常见的时间复杂度,按数量级从小到大的顺序依次为:
常数级O(1)
对数级O(log2n)
线性级O(n)
线性对数级O(nlog2n)
平方级O(n2)
立方级O(n3)
k次方级O(nk)
指数级O(2n)
阶乘级O(n!)
其中指数级O(2n)和阶乘级O(n!)常称为不可实现的算法
时间复杂度
空间复杂度(Space Complexity)
 空间复杂度(Space Complexity)是一个算法运行时所耗费
的存储空间,也就是算法的空间效率。
 解决同一个问题的不同算法,占存储空间少的效率高。
 一般情况下,算法占用的存储空间包括三个部分:算法本身
占的存储空间、算法所处理的数据占的存储空间和算法运行
过程中需要的辅助空间。
 对解决同一个问题的不同算法,前两个部分所占存储空间差
别不会很大,所以在讨论算法的空间复杂度时,只考虑算法
运行过程中需要的辅助空间,它也是问题规模n的函数,渐
近空间复杂度也简称为空间复杂度。
 常见的空间复杂度有:常数级O(1)、对数级O(log2n)、线性
级O(n)。
§ 1.4 学习数据结构的意义和目的