You are on page 1of 72

第1章 绪论

第1章 绪 论
教学目标
 1. 了解数据结构研究的主要内容
 2. 掌握数据结构中涉及的基本概念
 3. 掌握算法的时间、空间复杂度及其分析的
简易方法
第1章 绪 论
教学内容
 1.1 数据结构的研究内容
 1.2 基本概念和术语
 1.3 抽象数据类型的表示与实现
 1.4 算法和算法分析
1.1 数据结构的研究内容
 计算机解决具体问题的步骤
建立数学模型 设计数据对象的表示结构
信息结构层次

算法设计 解决特定问题的具体步骤描述
求解策略层次

编码 语言层次

调试与测试
1.1 数据结构的研究内容
数值计算问题
数值问题
例 建立数学模型
已知:游泳池的长 len 和宽 wide ,求面积 area
数学方程

?
◆ 建模型:
问题涉及的对象:游泳池的长 len 宽 wide ,面积 area ;
算法设计
对象之间的关系: area=lenwide非数值计算问题
◆ 设计求解问题的方法
◆ 编程 编码
main ( )
{ 调试与测试
float len, wide ,area ;
scanf (“%f %f\n”, &l,&w);
area=len*wide ;
printf (“area=%f”,area);
}
例 1 :书目自动检索系统
线性表
书目文件

001 书目卡片
高等数学 樊映川 S01
002 理论力学 罗远祥 L01
登录号:
003 高等数学 华罗庚 S01
手机话费查询系统 索引表
004 书名:
线性代数 栾汝书 S02
学生成绩管理系统
…… 作者名:…… …… ……
按书名 职工信息系统
分类号: 按作者名 按分类号

出版单位:樊映川
高等数学 001,003…… 001,… L 002,…
理论力学 002,…….. S
出版时间:华罗庚 002,…. 001,003,
线性代数 004,…… 栾汝书 004,…. …… ……
…… …….. 价格:
……. …….
例 2 :人机对奕问题

…….. ……..

…... …... …... …...


例 3 :哥尼斯堡七桥问题
能不能既不重
复又不遗漏地
一次相继走遍
这七座桥?
例 3 :哥尼斯堡七桥问题
 建立数学模型
把河的两岸、两个小岛看成四个点
把七座桥看成是七条线
A

D
C

B
例 4 :多叉路口交通灯管理问题
所有可能通行方向
图 C
A→B A→C A→D
AB AC AD D
B→A B→C B→D
B
D→A D→B D→C
E→A E→BBAE→C
BC E→D
BD

用 AB 表示 A→B ,余类推 E
DA DB DC A

EA EB EC ED 顶点:一条通路
连线:不能同时通行
染色:有连线的两个顶
点不能具有相同颜色
交叉路口的模型
例 4 :多叉路口交通灯管理问题
C
AB AC AD D
B

BA BC BD

E
DA DB DC A

EA EB EC ED
例 4 :多叉路口交通灯管理问题

C
AB AC AD D
B

BA BC BD

E
DA DB DC A

EA EB EC ED
例 4 :多叉路口交通灯管理问题

C
AB AC AD D
B

BA BC BD

E
DA DB DC A

EA EB EC ED
例 4 :多叉路口交通灯管理问题

C
AB AC AD D
B

BA BC BD

E
DA DB DC A

EA EB EC ED
例 4 :多叉路口交通灯管理问题

C
AB AC AD D
B

BA BC BD

E
DA DB DC A

EA EB EC ED
1.1 数据结构的研究内容
数据结构的定义
数据结构是一门研究非数值计算的程序设计
问题中计算机的操作对象以及它们之间的关
系和操作等的学科。
 描述非数值计算问题的数学模型,不再是数学方程,
而是线性结构、树状结构和图状结构。
1.2 基本概念和术语
 数据 (data)
对客观事物的符号表示,在计算机科学中是指所
有能输入到计算机中并被
计算机程序处理的符号
的总称 。
 例如:数字、字符、声音、图形、图像等信息 。
 数据元素 (data element)
是数据的基本单位,在计算机程序中通常作为一个整
体进行考虑和处理。
也称结点( node )或记录( record )
 数据项
是数据不可分割的最小单位,也称域 (field) 。
1.2 基本概念和术语
 数据对象( data object)
性质相同的数据元素的集合,是数据的一个子集
 如:整数数据对象 N = { 0, 1, 2, … }
 四者之间的关系
数据 > 数据对象 > 数据元素 > 数据项
1.2 基本概念和术语
 数据结构( Data Structure )
相互之间存在一种或多种特定关系的数据元素的
集合。
数据结构是带“结构”的数据元素的集合
 “ 结构”就是指数据元素之间存在的关系
 数据结构的形式定义
Data_Structure= ( D, R )
 D 是数据元素的有限集
 R 是 D 上关系的有限集
1.2 基本概念和术语
 数据结构的两个层次
逻辑结构
 描述数据元素之间的逻辑关系
 与数据的存储无关,独立于计算机
 是从具体问题抽象出来的数学模型
物理结构(存储结构)
 数据元素及其关系在计算机存储器中的存储方式
 数据结构在计算机中的表示
 可分为 4 大类:顺序、链式、索引、散列
1.2 基本概念和术语
 逻辑结构
集合
 数据元素间除“同属于一个集合”外,无其它关系
线性结构
 数据元素间存在一个对一个的关系
树形结构
 一对多
图状结构
 多对多
1.2 基本概念和术语
 例:用图形表示下列数据结构,并指出它的
具体结构。
( 1 ) 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
此结构为线性结构。
1.2 基本概念和术语
 例:用图形表示下列数据结构,并指出它的
具体结构。
( 2 ) S=(D, R)
D={di | 1≤i≤5}
R={(di , dj ), i<j}
解:上述表达式可用图形表示为:
d1
该结构是图状结构。
d5 d2

d4 d3
1.2 基本概念和术语
 存储结构
顺序存储结构
 借助元素在存储器中的相对位置来表示数据元素间的
逻辑关系
链式存储结构
 借助指示元素存储地址的指针表示数据元素间的逻辑
关系
1.2 基本概念和术语
 顺序存储 存储地址 存储内容
L0
元素 1
L0+m
用一组连续的存储单 元素 2
元依次存储数据元素,

数据元素之间的逻辑
关系由元素的存储位 L0+(i-1)*m
元素 i
置来表示。

L0+ ( n-
1)*m 元素 n
Loc( 元素 i)=L0+ ( i-1)*m
1.2 基本概念和术语
 链式存储 例:( bat, cat, ea
t ) 0200 …
cat
用一组任意的存储单 0325
020 bat
元存储数据元素,数 8
0200
据元素之间的逻辑关 …
系用指针来表示 0300


032 eat
5


1.2 基本概念和术语
 数据的运算
在数据的逻辑结构上定义操作算法,而在存储结
构上进行实现
最常用的 5 种运算
 插入、删除、修改、查找、排序
 逻辑结构和存储结构相同 , 但运算不同 , 则
数据结构不同
例如 , 栈与队列
数据结构内容总结
逻辑结 线性表
构唯一
线性结构 栈、队列
串、数组
存储结 数据的逻辑结构
树形结构
构不唯 非线性结构
一 图形结构
顺序存储
数据的存储结构
链式存储
运算的
实现依 数据的运算 插入、删除、修改、
赖于存 查找、排序
储结构
数据结构内容总结
(1)数据的逻辑结构是数据的机外表示,数据
的存储结构是数据的机内表示。
(2) 一种数据的逻辑结构可以用多种存储结构
来存储。
(3) 任何一个算法的设计取决于选定的逻辑结
构,而算法的实现依赖于采用的存储结构。
(4) 采用不同的存储结构,其数据处理的效率
往往是不同的。
1.3 抽象数据类型的表示和实现
 数据类型
在一种程序设计语言中,变量所具有的数据种类
 C 语言
 基本数据类型: char int float double void
 构造数据类型:数组、结构体、共用体
明显或隐含地规定了在程序执行期间变量或表达
式所有可能取值的范围,以及在这个值上允许的
操作。
因此,数据类型是一组值的集合以及定义于这个
值集上的一组操作的总称。
抽象数据类型的表示
 数据类型
一些最基本数据结构可以用数据类型来实现,如
数组、字符串等;
而另一些常用的数据结构,如栈、队列、树、图
等,不能直接用数据类型来表示。
抽象数据类型的表示
 抽象数据类型 (Abstract Data Type, ADT)
一个数学模型以及定义在该模型上的一组操作。
 由用户定义 , 从问题抽象出数据模型(逻辑结构)
 还包括定义在数据模型上的一组抽象运算 ( 相关操作 )
 不考虑计算机内的具体存储结构与运算的具体实现算

抽象数据类型的表示
 ADT 两个重要特征
数据抽象
 通过数据抽象,将一个数据对象的规格说明与其实现
分离,对外提供简洁、清晰的接口。比如:手机。
数据封装
接口或用 查找  插入  删除 修改 抽
户界面 通过数据封装,将一个数据对象的内部结构和实现细

节对外屏蔽。 象

数据类型
线性表 据
的物理实 类
现封装

抽象数据类型的表示
 抽象数据类型的表示
可以用三元组进行表示
ADT = ( D , R , P )

数据对象 D 上的关系集 D上
的操作集
ADT 抽象数据类型名 {
ADT 数据对象: < 数据对象的定义
常用 >
定义
格式 数据关系: < 数据关系的定义
>
基本操作 : < 基本操作的定
抽象数据类型的表示
 基本操作的定义格式
基本操作名(参数表)
初始条件:〈初始条件描述〉
操作结果:〈操作结果描述〉
赋值参数:只为操作提供输入值
引用参数:以 & 开头,除提供输入值外,还将返回操作结果
初始条件:描述了操作执行前数据结构和参数应满足的条件,
若不满足,操作失败,并返回相应出错信息。若初始条件为
空,则省略之。
操作结果:说明操作正常完成之后,数据结构的变化情况和
应返回的结果。

注:初始条件可以为空,并可省略。
ADT 定义示例:复数的定义
ADT Complex {
数据对象: D={e1,e2|e1,e2 均为实数 }
数据关系: R={<e1,e2>| e1 是复数的实部 ,e2 是复数的虚部 }
基本操作:
AssignComplex(&Z,v1,v2)
操作结果:构造复数 Z, 其实部和虚部分别赋以参数 v1 和 v2 的
值。
DestroyComplex(&Z)
操作结果: 复数 Z 被销毁。
GetReal(Z,&real)
初始条件:复数已存在。
操作结果: 用 real 返回复数 Z 的实部值。
GetImag(Z,&imag)
初始条件:复数已存在。
操作结果: 用 imag 返回复数 Z 的虚部值。
Add(z1,z2,&sum)
初始条件: z1 , z2 是复数。
操作结果: 用 sum 返回两个复数 z1,z2 的和值
ADT 定义示例: Circle 的定义
ADT Circle {
数据对象: D={r,x,y| r,x,y 均为实数 }
数据关系: R={< r,x,y >| r 是半径 ,<x,y> 是圆心坐标 }
基本操作:
Circle(&C,r,x,y)
操作结果:构造一个圆。
double Area(C)
初始条件:圆已存在。

操作结果:计算面积。
double Circumference (C)
初始条件:圆已存在。
操作结果: 计算周长。
……
} ADT Circle
抽象数据类型的实现
 ADT 实现的含义
将 ADT 转换成程序设计语言的说明语句,加上
对应于该 ADT 中的每个操作的函数。
用适当的数据结构来表示 ADT 中的数学模型 , 并
用一组函数来实现该模型上的各种操作。
抽象数据类型的实现
 抽象数据类型如何实现
抽象数据类型可以通过固有的数据类型 ( 如整型
、实型、字符型等 ) 来表示和实现。
 即利用处理器中已存在的数据类型来说明新的结构,
用已经实现的操作来组合新的操作。

注:教材中用的是类 C 语言(介于伪码和 C 语言之


间)
作为描述工具。其描述语法见 P8-9 。
但上机时要用具体语言实现,如 C 或 C++

抽象数据类型 Complex 的实现
// 存储结构的定义 // 基本操作的函数原型说明
typedef struct void AssignComplex(Complex &Z,float real,float imag);
{ float real; void GetReal(Complex Z, float &real);
float imag; void GetImag(Complex Z, float &imag);
}Complex; void Add(Complex z1, Complex z2, Complex &sum);

// 基本操作的实现
void AssignComplex(Complex &Z,float real,float imag)
{ Z.real=real; Z.imag=imag; }
void GetReal(Complex Z, float &real)
{ real=Z.real; }
void GetImag(Complex Z, float &imag)
{ imag=Z.imag; }
void Add(Complex z1, Complex z2, Complex &sum)
{ sum.real=z1.real+z2.real;
sum.imag=z1.imag+z2.imag;
}
ADT 实现中的几个问题
预定义常量和类型:

#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;


// status 是函数的类型,其值是函数结果状态代码
ADT 实现中的几个问题
关于引用: 注意: C 语言不支持引用类型
引用运算符: &
引用是个别名
建立引用时 , 程序用另一个已定义的变量的名字初始化
它 , 从那时起 , 引用作为目标的别名而使用 , 对引用的改
动实际就是对目标的改动。
例如:
int a=4; /*a 为普通的整型变量 */
int &b=a; /*b 是 a 的引用变量 */
b 变量是变量 a 的引用 ,b 也等于 4, 这两个变量同步
改变
ADT 实现中的几个问题
关于引用:
引用常用于函数形参中 , 采用引用型形参时 , 实现数据
双向传递 , 例如:

void swap(int x, int y)


值传递
{ int temp;
temp=x; x=y; y=temp;
}
当执行语句 swap(a,b) 时:
a 和 b 的值没有发生交换
ADT 实现中的几个问题

void swap(int *x, int *y)


地址传递
{ int temp;
temp = *x; *x= *y; *y=temp;
}
当执行语句 swap(&a,&b) 时:
a 和 b 的值发生了交换
ADT 实现中的几个问题
void swap(int &x, int &y)
{ int temp;
temp=x; x=y; y=temp ; 引用传递
}

当执行语句 swap(a,b) 时:
a 和 b 的值发生了交换

引用方式简洁
教材中很多算法都采用引用形式的形参
ADT 实现中的几个问题
 类 C 语言与 C 程序之间的差别
算法中除形式参数外 , 变量不作定义,在 C 程序
中必须定义;
算法中使用的元素类型 (ElemType) 没有定义,
C 程序中必须定义;常量 OK 、
ERROR 、 OVERFLOW 等在第一章统一定义;
算法中的比较运算符 (equal 、 less) 未作定
义, C 程序中必须定义;
必要的头文件 ( 用作输入输出的 stdio.h 及内存
申请的 stdlib.h) ,在 C 程序中必须包含。
1.4 算法和算法分析

1.4.1 算法的定义及特性
1.4.2 评价算法优劣的基本标准
1.4.3 算法效率的度量
1.4.4 算法的空间复杂度
1.4 算法和算法分析
1.4.1 算法的定义及特性
 算法的定义
对特定问题求解步骤的一种描述,是指令的有限
序列。
A finite set of rules which gives a sequence
of operation for solving a specific type of
problem.
1.4 算法和算法分析
1.4.1 算法的定义及特

性算法的特性
输入 一个算法有零个或多个输入。
输出 一个算法有一个或多个输出。
有穷性 一个算法必须总是在执行有穷步之后结束
,且每一步都在有穷时间内完成。
确定性 算法中的每一条指令必须有确切的含义,
在任何条件下,只有唯一的一条执行路径,
即对于相同的输入只能得到相同的输出 ( 无二义
性)
可行性 算法描述的操作可以通过已经实现的基本
操作执行有限次来实现。
1.4 算法和算法分析
 算法的特性
下面两段描述均不能满足算法的特征 , 试问它们
违反了什么特征?
void exam1() void exam2()
{ {
int n=2; int y=0;
while(n%2==0) int x=3/y;
n=n+2; printf(“%d,%d\n”,x,y);
printf(“%d\n”,n); }
}
违反了有穷性 违反了可行性
1.4 算法和算法分析
1.4.2 评价算法优劣的基本标准
正确性 (Correctness)
可读性 (Readability)
健壮性 (Robustness)
高效性 (Effectiveness)
可读性:
正确性:有四个层次
健壮性
1 :
、算法主要是为了人的阅读和交流,其次才是为计算
1 、程序中不含语法错误;
1机执行,因此算法应该易于人的理解;
2、指当 输入数据 非法时,算法恰当的做出反应或进行
、程序对于几组输入数据能够得出满足要求的结果;
相应处理,而不是产生莫名其妙的输出结果。
2 、另一方面,晦涩难读的算法易于隐藏较多错误而难
3 、程序对于精心选择的、典型、苛刻且带有刁难性的几组输
2以调试。
、处理出错的方法,不应是中断程序的执行,而应是
入数据能够得出满足要求的结果;
返回一个表示错误或错误性质的值,以便在更高的抽象
4 、程序对于一切合法的输入数据都能得出满足要求的结果。
层次上进行处理
通常以第三层意义上的正确性作为衡量一个算法是否合格的
标准
1.4 算法和算法分析
 1.4.2 评价算法优劣的基本标准
高效性
 包括时间和空间两个方面
 时间高效指算法设计合理,执行效率高,可以用时间
复杂度来度量;
 空间高效是指算法占用存储容量合理,可以用空间复
杂度来度量。
 两者都与问题的规模有关。
1.4 算法和算法分析
 1.4.3 算法效率的度量
算法效率可以用依据该算法编制的程序在计算机
上执行所消耗的时间来度量。
两种度量方法
 事后统计
 将算法实现,测算其时间和空间开销。
 缺点
» 编写程序实现算法将花费较多的时间和精力;
» 所得实验结果依赖于计算机的软硬件等环境因素
 事前分析
 对算法所消耗资源的一种估算方法
1.4 算法和算法分析
 事前分析
一个高级语言程序在计算机上运行所消耗的时间
取决于
 算法选用的策略
 问题的规模
 编写程序的语言
 编译程序产生的机器代码质量
 机器执行指令的速度
同一个算法用不同的语言、不同的编译程序、在
不同的计算机上运行,效率均不同。因此,使用
绝对时间单位衡量算法效率是不合适的。
1.4 算法和算法分析
 1.4.3 算法效率的度量
一个特定算法的 “运行工作量”大小,只依赖于
问题的规模 ( 通常用整数 n 表示 ) ,即它是问题
规模的函数。
一般情况下,算法中基本操作重复执行的次数是
问题规模 n 的某个函数 f(n) 。
n 越大算法的执行时间越长
随着问题规模 n 的增长,算法执行时间的增长
 排序: n 为记录数
 矩阵: n 为矩阵的阶数
率 和 f(n) 的增长率相同,则可记作:
 多项式: n 为多项式的项
T(n) = O(f(n))

 集合: n 为元素个数
称 T(n) 为算法的渐近时间复杂度。
 树: n 为树的结点个数
 图: n 为图的顶点数或边

§1.4 算法和算法分析
1.4.3 算法效率的度量
算法的构成 = 控制结构 + 原操作
(固有数据类型的操作)
算法的执行时间 =
∑( 原操作 (i) 的执行次数 × 原操作 (i) 的执行时间 )
算法的执行时间 与 原操作执行次数之和 成正比
算法的运行时间由算法中所有语句的频度之和构成。

语句重复执行的次数
算法的时间复杂度是由嵌套最深层语句的频度决定的。
1.4 算法和算法分析
 渐进符号 (O) 的定义
如果存在两个正常数 c 和 n0 ,对于所有的 n ≥ n0
,有 |T(n) | ≤ c|f(n) | 则记作 T(n)=O(f(n))
f(n) 是参照物,通常是一些常用的标准函数。
 常用的 7 种函数:
 O(1) 、 O(log2n) 、 O(n) 、 O(nlog2n) 、 O(n2) 、 O(n3) 、
O(2n)
 当 n 充分大时有:
运算规则
定理: 若O(log
O(1)< f(n)=a mn
2n) +am-1O(nlog
<O(n)<
m
nm-1++a 1n+a
2n) < O(n02)是一个
< O(n3)m< 次多项
O(2n)
式,则 f(n) = O(nm) 。
1 、 O(f(n))+O(g(n)) = O( max(f(n),g(n)))
说明
2 、 :O(cf(n))
在计算算法时间复杂度时,可以忽略所有低次幂
= O(f(n)), c 是正整数
和最高次幂的系数。
3 、 O(f(n))*O(g(n)) = O( f(n)*g(n))
1.4 算法和算法分析
 定理 设 f(n)= amnm + am-1nm-1 + …+ a1n + a0 ,则
f(n) = O(nm) 。
1.4 算法和算法分析
 例子
100n + 6 = O(n)

10 n2 + 4n + 2 = O(n2)

6*2n + n2 = O(2n)
1.4 算法和算法分析
分析算法时间复杂度的基本方法
•找出语句频度最大的那条语句作为基本语句
•计算基本语句的频度得到问题规模 n 的某个函数
f(n)
•取其数量级用符号“
x = 0; y = 0; O ” 表示
for ( int k = 0; k < n; k ++ )
T(n) =
x ++; O(n2)
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < n; j++ f(n)=n
) 2

y ++;
1.4 算法和算法分析
时间复杂度是由嵌套最深层语句的频度决定的
void exam ( float x[ ][ ], int m, int n ) { T(n) =
float sum [ ]; O(m*n)
for ( int i = 0; i < m; i++ ) {
sum[i] = 0.0;
for ( int j = 0; j < n; j++ )
sum[i] += x[i][j];
} f(n)=m*n
for ( i = 0; i < m; i++ )
cout << i << “ : ” <<sum [i] << endl;
}
1.4 算法和算法分析
 时间复杂度例子
for (int i=1; i<=n; i++) x=x+1;

 时间复杂度为 O(n)

for(int i=1; i<=n; i++)


for(int j=1; j<=n; j++)
x=x+1;

 时间复杂度为 O(n2)
1.4 算法和算法分析
1.4.3 算法效率的度量
例:分析以下程序段的时间复杂度。
i=1; ①
while(i<=n)
i=i*2; ②
分析:显然,语句①的频度是 1 。设语句②的频度是 f(n) ,则有:
f (n)
2 n 即 f(n)≤log2n ,取最大值 f(n)=log2n
所以该程序段的时间复杂度 T(n) = 1+f(n)
=1+ log2n
= O( log2n)
1.4 算法和算法分析
 分析以下程序段的时间复杂度
for (int i=2;i<=n;++i)
for (int j=2;j<=i-1;++j)
{
++x;
a[i][j]=x;
}
 语句频度为: 0+1+2+…+(n-2)=(n2-3n+2)/2
 时间复杂度为: O(n2)
1.4 算法和算法分析
 分析以下程序段的时间复杂度
for( i=1; i<=n; i++)
for (j=1; j<=i; j++)
for (k=1; k<=j; k++)
     x=x+1;

语句频度 =

时间复杂度 O(n3)
1.4 算法和算法分析
 当n 取得很大时,指数时间
算法和多项式时间算法在所
需时间上非常悬殊

时间复杂度 T(n) 按数量级递增顺序为:


复杂度低 复杂度高
1.4 算法和算法分析
1.4.3 算法效率的度量
有的情况下,算法中基本操作重复执行的次数还随问题的输
入数据集不同而不同。
例如:冒泡排序
最好情况
下, T(n) = O(1)
最坏情况
下, T(n) = O(n2)
对这类算法的分析,一种解决办法是计算平均值,即考虑它
对所有可能的输入数据集的期望值。
但是,很多情况下,各种输入数据集出现的概率难以确定。

除特别指明外,本书中讨论的时间复杂度均指最坏情况
下的时间复杂度。
1.4 算法和算法分析
 1.4.4 算法的空间复杂度
算法开始运行直至结束过程中所需要的最大存储资源
开销的一种度量。
S(n) = O( f(n) )
表示随着问题规模 n 的增大,算法运行所需存储量的增长率
与 f(n) 的增长率相同。
算法占据的存储空间
 输入数据所占空间;
 程序本身所占空间;
 辅助变量所占空间。
一维数组的空间复杂度是 O(n)
n*n 矩阵的空间复杂度为 O(n2)
1.4 算法和算法分析
1.4.4 算法的空间复杂度
若输入数据所占空间只取决于问题本身,和
算法无关,则只需要分析除输入和程序之外的辅助
变量所占额外空间。
原地工作:若额外空间相对于输入数据量来说是常
数,则称此算法为原地工作。

注:若额外空间所占空间量依赖于特定的输入,则除
特别指明外,均按最坏情况来分析。
1.4 算法和算法分析
例:将一维数组 a 中的 n 个数逆序存放到原数组中。

S(n) = O(1)
原地工作 S(n) = O(n)

【算法 1 】  【算法 2 】 
for(i=0;i<n/2;i++) for(i=0;i<n;i++)
{ t=a[i]; b[i]=a[n-i-1];
a[i]=a[n-i-1]; for(i=0;i<n;i++)
a[n-i-1]=t; a[i]=b[i];
}   
本章小结
熟悉数据、数据元素、数据项、数据结构等
基本概念。
对数据结构的两个层次的理解
逻辑结构
存储结构

理解算法五个特性的确切含义。
掌握计算语句频度和估算算法时间复杂度的
方法。
作业

You might also like