1
数据结构
徐虹
http://jwc.cuit.edu.cn/Jxgl/
HomePage/Default.asp
数
据
结
构
之
绪
论
2
说明
? 总学时:
80(学时 )= 60(课时) +20(机时)
? 行课时间从第 1 周 开始,每周 4 学时
? 上机安排待定
? 考试时间:课程结束
? 第 8、 11、 12 章的内容为自学内容;
? 目录中标有 ** 的内容不作要求。
2
数
据
结
构
之
绪
论
3
教材与参考书
? 严蔚敏,《数据结构》,清华大学出版社
? Clifford A. Shaffer, 《数据结构与算法
分析》,电子工业出版社
? Sartaj Sahni, 《数据结构、算法与应用》 ,
机械工业出版社
? 严蔚敏,《数据结构题集》,清华大学出
版社
数
据
结
构
之
绪
论
4
目录
第一章:绪论
第二章:线性表
第三章:栈和队列
第四章:串
第五章:数组和广义表
第六章:树和二叉树
第七章:图
第八章:查找
第九章:内部排序
3
第一章 绪论
什么是数据结构
算法和算法分析
数
据
结
构
之
绪
论
6
1. 1 什么是数据结构
? 数据结构的引论
? 例1 图书馆的书目检索系统自动化问题
在书目自动检索系统中可以建立一张按等录顺序号
排列的书目文件和三张分别按书名、作者名和分类号
顺序排列的索引表,如下所示:
001
002
003
004
...
...
...
...
高等数学
理论力学
高等数学
线形代数
樊映川
罗远祥
华罗庚
栾汝书
S01
L01
S01
S02
.
.
.
.
.
..
.
4
数
据
结
构
之
绪
论
7
高等数学
理论力学
线形代数
001,003, …
002, …
004, …
...
.
.
.
L
S
002,
001, 003
...
...
.
.
.
.
.
.
特点: 计算机按某个特定的要
求进行查询.处理对象之间存在
一种简单的线形关系,这类模型
可以称为简单的线形数据结构.
按书名排列
樊映川
华罗庚
栾汝书
001,
003,
004,
...
...
...
.
.
.
.
.
.
按作者排列
按索引号排列
数
据
结
构
之
绪
论
8
? 例2: 计算机和人的对 弈 问题
对奕的过程是在一定的规则下随机进行的 ,因此 ,计算
机必须对对弈过程之中可能发生的情况以及相应
的对策都考虑周全 .这个关系不是线形的 ,从一个
棋盘可以派生出几个格局 ,如下图 :
“树根 ”是对奕开始之前的棋盘格局 ,而所有的 “叶子 ”是可能出现
的结局 ,对奕的过程就是从树根沿树叉到达某个叶子的过程 .
*
*
**
*
*
*
*
*
*
*
* ** * *
(a) 棋盘格式示例 (b)井字棋对弈树的局部
5
数
据
结
构
之
绪
论
9
? 例3: 多叉路口交通灯的管理问题
可以把这类交通 ,道路的问题当作一种 “图 ”的结构:一个顶点表
示一条通道 ,而通道之间的矛盾的关系以两个顶点之间的连
线表示 .如下图所示 :
A
E
D
C
B
(a) 五叉路口
数
据
结
构
之
绪
论
10
? 结论 :综合上面三个例子 ,描述这类非数值计算性问
题的数学模型不再是数学方程 ,而是诸如表、树和图之
类的数据结构 .
? 数据结构定义 :
数据结构是一门非数值计算的程序设计问题中计
算机的操作对象以及它们之间的关系和操作等等的学
科 .
6
数
据
结
构
之
绪
论
11
? 数据结构的地位
《数据结构》是计算机科学中一门综合性的专业基础课。
数据结构的研究不仅涉及计算机的硬件的研究范围,
而且和计算机软件的研究有着更为密切的关系,无论
是编译程序还是操作系统,都涉及数据元素在存储器
中的分配问题。 可以认为数据结构是介于数学、计算
机硬件、计算机软件三者之间的一门核心课程。
数
据
结
构
之
绪
论
12
1. 2 基本概念
? 数据( Data)
客观事物的符号表示 ,能输入到计算机中并被计算
机中程序处理的符号的总称。
? 数据元素 (Data element)
数据的基本单位 ,可由数据项组成。
? 数据类型 (Data Type)
是和数据结构密切相关的一个概念,在高级语言中,
用以刻画(程序)操作对象的特性。是一个值的集合
和定义在这个值集上的一组操作的总称。
7
数
据
结
构
之
绪
论
13
? 数据对象 (Data Object)
性质相同的数据元素的集合 ,是数据的子集。
? 数据结构 (Data Structure)
相互之间存在一种或多种特定关系的数据元素的集
合 。数据元素之间的相互关系称为结构。有下列四种
基本结构:
( 1)集合( 2)线形结构( 3)树形结构( 4)图状结构 (网状
结构)。
数
据
结
构
之
绪
论
14
集合 线
性
树
图
8
数
据
结
构
之
绪
论
15
? 数据结构类型
数据结构又可以分为两种:物理结构、逻辑结构
其基本类型用关系图描述如下:
? 数据结构的形式定义 :
Data_Structure=[D,S]
其中: D是数据元素的有限集
S是上下关系的有限集
? 数据的存储结构 :位、元素和数据域
? 数据结构的存储形式有 :
?顺序存储
?链式存储
? 虚拟存储结构
数
据
结
构
之
绪
论
16
? 数据类型综述
数据类型可以分为:
原子类型 ——值不可以分解
结构类型 ——值由若干成分按某种结构组成。
抽象数据类型( ADT) 是一个值的集合和定义
在这个值集上的一组操作的总称。 包括:
原子类型、固定聚合类型和可变聚合类型。
抽象数据类型可通过固有数据类型来表示和实现,
借助高级语言实现的三种情况:封装、继承、
多型。
9
数
据
结
构
之
绪
论
17
? 数据操作描述
? 数据的基本操作:
插入 :在数据结构的指定位置添加新的数据元素。
拆除 :去掉数据结构中某个指定的数据元素。
更新 :改变数据结构中某个数据元素的值。
查找 :在数据结构中寻找某个满足特定要求的数据元素。
排序 :重新安排数据元素的逻辑顺序关系,使之值按从
小到大或从大到小的顺序排列。
数
据
结
构
之
绪
论
18
? 操作的分类操作的分类
?加工型操作 ——操作改变了(操作之前
的)结构的值。
?引用型操作 ——不改变值,只是查询或
求得结构的值。
? 操作的描述操作的描述
10
数
据
结
构
之
绪
论
19
1. 3 抽象数据类型的表示与实现
? 语言的描述
? 预定义常量和类型
# define TRUE 1
# define FALSE 0
# define OK 1
# define ERROR 0
Status是函数的类型,其值是函数结果状态代码
typedef int Status
? 数据结构的表示用类型定义( typedef)描述,数
据元素类型约定为 ElemType,可以是 C语言中任
何数据类型。
数
据
结
构
之
绪
论
20
? 基本操作的算法用以下形式函数来描述
函数类型 函数名(函数参数表)
{
// 算法说明
语句序列
} //函数名
? C语言中操作的描述
? 赋值语句
? 循环语句
? 选择语句
? 注释
? 结束语句
? 输入和输出语句
? 逻辑运算约定
11
数
据
结
构
之
绪
论
21
1. 4 算法与算法分析
? 算法 :是对特定问题求解步骤的一种描
述,是指令的有限序列。
一个算法就是一个有穷规则的集合,规
则规定了解决某特定问题的运算序列。
? 算法的特性 :有穷性、确定性、可行性、
输入、输出。
数
据
结
构
之
绪
论
22
? 算法设计的两个目标标
? 易读、易编码和调试(软件工程)
? 充分利用计算机资源(算法和数据结构)
? 算法的设计要求
? 正确性:
?程序不含语法错误;
?程序对于几组输入数据能够得出满足要求的结果;
?程序对于精心选择的典型、苛刻的输入数据能够得出满足要
求的结果;
?程序对于一切合法的输入数据都能够得出满足要求的结果。
? 可读性
? 健壮性
? 效率与低存储量要求
12
数
据
结
构
之
绪
论
23
?最佳、最差、平均情况分析
? 对于不同的输入情况,算法的时间代
价
例如:在一个数组中查找元素 K
? 往往分为最佳、最差、平均情况分析
数
据
结
构
之
绪
论
24
?算法效率的度量
算法效率需通过该算法编制的程序在
计算机上运行所消耗的时间多少以及所
需辅助空间的大小来度量。
? 频度:某语句重复执行的次数。
? 时间复杂度:从算法中选取一个对于所研
究的问题来说是基本操作的源操作,以该
基本操作重复执行的次数作为算法的时间
量度。
T( n) = O( f( n))。
它表示随着 n的增大,算法执行时间的增长
率和 f ( n ) 的增长率相同。
13
数
据
结
构
之
绪
论
25
? 空间复杂度: 一个上机执行的程序
除了需要存储空间来积存本身所用指
令,常数,变量和输入数据外,也需
要一些对数据进行操作的工作单元和
存储一些实现计算所需信息的辅助空
间。该辅助空间的大小及反映了该算
法的空间复杂性。
S( n) = O( f( n))。
数
据
结
构
之
绪
论
26
? 大 O 表示法的运算规则
? 单位时间
?简单布尔或算术运算
?赋值
?简单 I/O
?函数返回
? 加法规则则 : f1(n)+f2(n)=(max(f1(n), f2(n)))
?If结构, switch结构
? 乘法规则则 : f1 (n)· f2(n) = (f1(n)·f2(n))
?for, while, do-while结构
14
数
据
结
构
之
绪
论
27
程序段一:
for(j=1;j<=n;++j)
for(k=1;k<=n;++k){
++x; s+=x;
}
程序段二:
{
++x;
s=0;
}
程序段三:
for(i=1;i<=n;++i) {
++x; s+=x;
}
例1:求下面程序的时间复杂度。
该程序中 “x增 1”是基本
操作语句,其频度为 n
2
,其
时间复杂度为 O(n
2
),为平方
阶。
该程序中 “x增 1”是基本
操作语句,其频度为 1,其
时间复杂度为 O(1),为常量
阶。
该程序中 “x增 1”是基本
操作语句,其频度为 n,其
时间复杂度为 O(n),为线性
阶。
数
据
结
构
之
绪
论
28
课
堂
作
业
分
析
程
序
中
各
语
句
的
频
度
Ex( ) { int I , j , t ;
(1) for( I=1 ; I<10 ; I++)
(2) printf(“\n %d” , I );
(3) for(I=1; I<=2; I++)
(4) printf(“\n”);
(5) for(I=1; I<=9; I++){
(6) for(j=1; j <= I ; j++)
(7) { t = I * j ; printf(“%5d”,t); }
(8) for(j=1; j<3 ; j++)
(9) printf(“\n”); } }
15
数
据
结
构
之
绪
论
29
Ex( ) { int I , j , t ;
(1) for( I=1 ; I<10 ; I++) //n =10
(2) printf(“\n %d” , I ); //n =9
(3) for(I=1; I<=2; I++) //n =3
(4) printf(“\n”); //n =2
(5) for(I=1; I<=9; I++){ //n =10
(6) for(j=1; j <= I ; j++) //n =54
(7) { t = I * j ; printf(“%5d”,t); } //n =45
(8) for(j=1; j<3 ; j++) //n =27
(9) printf(“\n”); } } //n =18
数
据
结
构
之
绪
论
30
?运行时间估计
例:假设 CPU每秒处理 10
6
个指令,对于
输入规模为 = 10
8
的问题,时间代价为
T(n)=2n
2
的算法要运行多长时间?
操作次数为 T(n)=T(10
8
)=2× (10
8
)
2
=2× 10
16
运行时间为 2× 10
16
/10
6
= 2× 10
10
秒
每天有 86,400秒,因此需要 231,480 天 (634
年 )
16
数
据
结
构
之
绪
论
31
例:假设 CPU每秒处理 10
6
个指令,
对于输入规模为 n = 10
8
的问题,时
间代价为 T(n)=nlogn的算法要运行
多长时间?
操作次数为
T(n)=T(10
8
)= 10
8
× log10
8
=2.66× 10
9
运行时间为 2.66× 10
9
/106 = 2.66× 10
3
秒,即 44.33分钟
数
据
结
构
之
绪
论
32
17
数
据
结
构
之
绪
论
33
? 规定时间内能解决的问题规模
假设 CPU每秒处理 10
6
个指令,则每小时
能够解决的最大问题规模
T(n)/10
6
≤ 3600
对 T(n) = 2n
2
,,,,
即 2n
2
≤ 3600 × 10
6
n ≤ 42 , 426
T(n) = nlogn
即 nlogn ≤ 3600 × 10
6
n ≤ 133 , 000 , 000