第二章 算法效率分析基础
合集下载
算法设计与分析-第2章-算法分析基础PPT课件

2k
1 5(
n 2k 1
)2
L 2×5´( 2n)2
5n2
T (n)
7n
k 1 5
i0
n 2i
2
7n
5n2 (2
2
1
k 1
)
10 n2 3n 10 n2 O (n2 )
• 例: Merge-sort排序算法的复杂性递归方程为
T(n)=(1)
if n=1
T(n)=2T(n/2)+(n) if n>1
T(n) = ?
.
27
2.5 递归算法的分析
三、递推关系式的求解-- 扩展递归技术
步骤: 循环地展开递推关系式, 把递推关系式转化为求和表达式, 然后可使用求和技术解之。
能解决输入规模为多大的问题?
设在新机器上用 t 秒时间能解决输入规模为 N 的问题,则
由于此时
f (N)
N,2 新机器的运行速度/每语句为: t新
t0 , 64
代入关系式
f (N ) *t新 t ,得
N2
*
t0 64
t
n2
* t0
解,得
N 8n
思考:以上说明了什么问题?
.
14
2.2 算法的渐进分析
.
28
2.5 递归算法的分析
求以下递推式的时间复杂性
7
T (n)
2T (n
2)
5n2
解:设 n=2k
T (n) 2T (n 2) 5n2
n1 n>1
2(2T (n 4)( n 4)2 ) 5(n 2)2 ) 5n2
2k T (1)
间就一个常因子范围内而言是相同的。
2第二章算法效率分析基础.pptx

对于符号Ω和Θ,该定理也成立。
该定理表明:当算法由两个连续执行部分 组成时,该算法的整体效率由具有较大增 长次数的那部分所决定。
© School of Computer Science and Technology, SWUST
12
Analysis and Design of Computer Algorithms
10
Analysis and Design of Computer Algorithms
符号Θ
定义3 对于足够大的n,t(n)的上界和下界由g(n)的常数倍 来确定,即:
c2g(n) ≤ t(n) ≤ c1g(n),c1,c2为常数
记为t(n) ∈ Θ(g(n))
n2+3n+2∈Θ (n2) n(n-1)/2∈Θ (n2) 4n2+5 ∈Θ (n2)
Time is Important
不是所有能计算的都有价值,不是所有有价值的都能被计算 ——阿尔伯特.爱因斯坦
© School of Computer Science and Technology, SWUST
2
教学内容
Analysis and Design of Computer Algorithms
算法分析与设计
Analysis and Design of Computer Algorithms
第二章 算法效率分析基础
杨春明 西南科学技大学计算机学院
Analysis and Design of Computer Algorithms
算法效率分析基础
算法分析是对一个算法需要多少计算时间 和存储空间作定量的分析。
© School of Computer Science and Technology, SWUST
49_算法效率分析基础课件

2023/10/14
3
LingJie/GDUT
第2章
2.1.2 运行时间的度量单位
• 算法时间包括了编译该算法的时间以及运行该 算法的时间。因此衡量算法时间的单位很自然的会 想到用“秒”、“毫秒”等实际的时间单位。这对于算 法的测试者而言是很直观的,但是存在的问题是: 编译算法的时间与编译程序的好坏有关,即使只考 虑算法运行时间,得到的时间也受到了运行该算法 的计算机速度的影响。因此一个算法在某一台计算 机上实现得到的时间对于其他的计算机是没有参考 意义的。
Hale Waihona Puke n log2n nlog2n
n2
n3 2n
n!
10 3.3 102 6.6 103 10 105 17
3.3×10 102 6.6×102 104 1.0×104 106 1.7×106 1010
103 103
3.6×106
106 1.3×1030 3.6×10157
109
1015
2023/10/22
t(n)cg(n) 则称函数t(n)包含在O(g(n)中,记为t(n)∈O(g(n)). 也 称函数 t(n )在n充分大时有上界g(n), 并称 t(n) 的阶不 高于g (n) 的阶.
例如,4nlogn+7 ∈O(nlogn)。
2023/10/22
12
LingJie/GDUT
第2章
2023/10/22
2023/10/14
2
LingJie/GDUT
第2章
2.1.1 输入规模的度量
• 一个显而易见的事实是:大部分算法的执行时间随着
输入量的增加而增大。例如在对一个数组进行排序时, 数组越大,排序需要的时间就越长。因此从逻辑上来 说,算法的效率应该是输入量的函数。
第2章 算法分析基础(《算法设计与分析(第3版)》C++版 王红梅 清华大学出版社)

3
Page 11
2.1.2 算法的渐近分析
常见的时间复杂度:
Ο(1)<(log2n)<(n)<(nlog2n)<(n2)<(n3)<…<(2n)<(n!)
多项式时间,易解问题
算
法
指数时间,难解问题
设 计 与
分
析
(
第
时间复杂度是在不同数量级的层面上比较算法
版 )
清
华
大
学
时间复杂度是一种估算技术(信封背面的技术)
Page 7
2.1.2 算法的渐近分析
3
每条语句执行次数之和 = 算法的执行时间 = 每条语句执行时间之和
基本语句的执行次数 for (i = 1; i <= n; i++)
单位时间
算
法
设
计
与
执行次数 × 执行一次的时间
分 析 (
第
for (j = 1; j <= n; j++)
版 )
x++;
指令系统、编译的代码质量
算法设计:面对一个问题,如何设计一个有效的算法
算
法
设
检
指
验
导
评
计 与 分 析 ( 第 版
改
估
) 清
进
华 大
学
出
版
算法分析:对已设计的算法,如何评价或判断其优劣
社
3
Page 3
2.1.1 输入规模与基本语句
如何度量算法的效率呢?
事后统计:将算法实现,测算其时间和空间开销
缺点:(1)编写程序实现算法将花费较多的时间和精力 (2)所得实验结果依赖于计算机的软硬件等环境因素
第2 章 算法效率分析

算
分
析
与
复杂性的渐近性(九)
设 计
用Ω评估算法的复杂性,得到的只是该复杂性 的一个下界。这个下界的阶越高,则评估就越 精确,结果就越有价值。对于一个问题和任意 给定的充分大的规模N,下界在该问题的所有 算法或某类算法的复杂性中取,那么它将更有 意义。这时得到的相应下界,我们称之为问题 的下界或某类算法的下界。它常与Ο配合证明 问题的某个特定算法是该问题的最优算法或是 在某算法类中的最优算法。
西南科技大学
算
分
析
与
算法与渐近阶的关系(一)
设 计
设为AN1,,AN2,…log和NA,6,N2它,们N3的,渐2N近,时N间!,复是杂求性解分同别一 间题的6种不同的算法,这六种算法分别在C1 和C2两台计算机上运行,设计算机C2的计算速 度是计算机C1的10倍。在可接受的一段时间内, 设在C1上算法Ai可能求解的问题的规模为N1i, 而在C2上可能求解的问题的规模为N2i,那么, 我们就应该有Ti(N2i)=10Ti(N1i),其中Ti(N)是算 法Ai渐近的时间复杂性,i=1,2,…,6。分别解出 N2i和N1i的关系,可列成下表。
时间。累加起来便是外循环的时间复杂性:
西南科技大学
算
分
析
与
复杂性的渐近性(七)
设 计
记号Ω,定义如下:如果存在正的常数C 和自然数N0,使得当N≥N0时有 f(N)≥Cg(N),则称函数f(N)当N充分大时 下有界,且g(N)是它的一个下界,记为 f(N)=Ω(g(N))。这时我们还说f(N)的阶不 低于g(N)的阶。
西南科技大学
算
分
析
与
表2-1
设 计
算法 A1 A2 A3 A4 A5 A6
算法设计与分析3第二部分第二章

第二部分第二章 算法效率分析基础
此外,还有一种效率称为摊销效率。有些情 况下,算法的单次运行时间代价很高,而n次 运行的时间明显低于n乘以单次运行的时间, 因此它并不适用于算法的单次运行,而是应用 于算法对于同样数据结构所执行的一系列操作。 在商业中,这种做法是很常见的,如把固定资 产的成本摊销到它能使用年限的每一年中。
第二部分第二章 算法效率分析基础
4.渐进符号的有用特性 定理1:如果t1(n)∈O(g1(n))并且t2(n)∈O(g2(n)), 则 t1(n)+ t2(n)∈O(max(g1(n),g2(n))) 定理2:如果t1(n)∈Ω(g1(n))并且t2(n)∈Ω(g2(n)),则 t1(n)+ t2(n)∈Ω(max(g1(n),g2(n))) 定理3:如果t1(n)∈θ(g1(n))并且t2(n)∈θ(g2(n)),则 t1(n)+ t2(n)∈θ(max(g1(n),g2(n)))
1.3*1030 9.3*10157
1010 1015 1012 1018
第二部分第二章 算法效率分析基础
从表中可以发现: 从表中可以发现 如果我们设计的算法效率可以用对数函数来表 示时,这是相当完美的算法,因为对于任何实 际规模的输入都会瞬间内完成。反之,如果只 能用指数函数或阶乘函数表示时,可以说,一 旦输入规模变大时,你的算法可能在地球消失 之前也不能完成。因此,一个需要指数级操作 次数的算法只能用来解决规模非常小的问题。
主要内容
1、算法效率研究的通用框架 2、三种符号的定义 3、非递归算法效率分析 4、递归算法效率分析 5、斐波那契数列
6、经验分析法 7、算法可视法
第二部分第二章 算法效率分析基础
重点难点
1、重点:算法效率研究的通用框架、三种符 号的含义、非递归算法效率分析、递归算法效 率分析 2、难点:三种符号的定义、非递归算法效率 分析、递归算法效率分析
算法效率分析基础讲义.pptx

较大的增长次数的部分所决定的,即它的效率较差
的部分.
24
2.2.6 利用极限比较增长次数
虽然符号O, Ω和Θ的正式定义对于证明它们的抽
象性质是不可缺少的,但我们很少直接用它们来比
较两个特定函数的增长次数。有一种较为简便的比
较方法,它是基于对所计论的两个函数的比率求极
限。有3种极限情况会发生:
0
n
lim
• SequentialSearch(A[0..n-1], x)
//输入:数组A[0..n-1],和查找关键字x //输出:返回第一个匹配x 的元素下标 //如果没有匹配的,返回-1
• i=0;
什么是基本运算
• while i<n and A[i]≠ x do i=i+1;
• If i<n then return i
23
2.2.5渐进符号的有用特性
定理 如果t1(n) ∈O(g1(n)) 并且t2(n) ∈O(g2(n)), 则
t1(n)+ t2(n)∈O(max{g1(n), g2(n)}) (对于Ω和Θ符号, 类似的断言也为真)
对于两个连续执行部分组成的算法,应该如何应用
这个特性呢?它意味着该算法的整体效率是由具有
• 算法的时间效率和空间效率都用输入规模的函数进 行度量。
• 我们用算法基本操作的执行次数来度量算时间效率。 通过计算算法消耗的额外存储单元的数量来度量空 间效率。
• 在输入规模相同的情况下,有些算法的效率会的显 著差异。对于这样的算法,我们需要区分最差效率, 平均效率和最优效率。
• 本框架主要关心,当算法的输入规模趋向于无限大
2.1.2 运行时间的度量单位
可以采用秒,分,小时吗?
第二章-算法分析基础

一具体算法的时间复杂度和空间复杂度往往是不独立的, 在算法设计中要在时间效率和空间效率之间折衷。
2.2.1 非递归算法分析
1.仅依赖于问题规模的时间复杂度
有一类简单的问题,其操作具有普遍性,也就是说对所 有的数据均等价地进行处理,这类算法的时间复杂度,很 容易分析。
【例1】交换i和j的内容。
Temp=i;i=j;j=temp;
递归
回溯
迭代法介绍:
用迭代方法估计递归算法的解, 就是充分利用递归算法中的 递归关系,通过一定的代数运算和数学分析的级数知识,得到问 题的复杂度。
递归方程具体就是利用递归算法中的递归关系写出递归方程, 迭代地展开的右端,使之成为一个非递归的和式,然后通过对和 式的估计来达到对方程左端即方程的解的估计。
例如:
for( j=1;j<=n;++j) for(k=1;k<=n;++k)
++x;
语句“++x、k<=n、++k”的频度是n2, 语句“ j=1、k=1”的频度是1, 语句“j<=n;++j”的频度是n。 算法运行时间为:3*n2+2n+2。
经常从算法中选取一种对于所研究的问题来说是基本(或者 说是主要) 的原操作,以该基本操作在算法中重复执行的次数作 为算法运行时间的衡量准则。这个原操作,多数情况下是最深层 次循环体内的语句中的原操作。
精品课件!
精品课件!
2.提高效率。
1)以提高算法的全局效率为主,提高局部效率为辅。 2)在优化算法的效率时,应当先找出限制效率的“瓶颈”。 3)多数情况下,时间效率和空间效率可能是对立的,此时
应当分析哪个更重要,作出适当的折衷。 4)可以考虑先选取合适的数据结构,再优化算法。 5)递归过程的实现决定了递归算法的效率往往很低,费
2.2.1 非递归算法分析
1.仅依赖于问题规模的时间复杂度
有一类简单的问题,其操作具有普遍性,也就是说对所 有的数据均等价地进行处理,这类算法的时间复杂度,很 容易分析。
【例1】交换i和j的内容。
Temp=i;i=j;j=temp;
递归
回溯
迭代法介绍:
用迭代方法估计递归算法的解, 就是充分利用递归算法中的 递归关系,通过一定的代数运算和数学分析的级数知识,得到问 题的复杂度。
递归方程具体就是利用递归算法中的递归关系写出递归方程, 迭代地展开的右端,使之成为一个非递归的和式,然后通过对和 式的估计来达到对方程左端即方程的解的估计。
例如:
for( j=1;j<=n;++j) for(k=1;k<=n;++k)
++x;
语句“++x、k<=n、++k”的频度是n2, 语句“ j=1、k=1”的频度是1, 语句“j<=n;++j”的频度是n。 算法运行时间为:3*n2+2n+2。
经常从算法中选取一种对于所研究的问题来说是基本(或者 说是主要) 的原操作,以该基本操作在算法中重复执行的次数作 为算法运行时间的衡量准则。这个原操作,多数情况下是最深层 次循环体内的语句中的原操作。
精品课件!
精品课件!
2.提高效率。
1)以提高算法的全局效率为主,提高局部效率为辅。 2)在优化算法的效率时,应当先找出限制效率的“瓶颈”。 3)多数情况下,时间效率和空间效率可能是对立的,此时
应当分析哪个更重要,作出适当的折衷。 4)可以考虑先选取合适的数据结构,再优化算法。 5)递归过程的实现决定了递归算法的效率往往很低,费
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
32
• MaxElement(A[0..n-1]) • //求给定数组中最大元素的值 • //输入:实数数组A[0..n-1] • //输出:A中最大元素的值 • maxval←A[0] 第二步: • for i←1 to n-1 do 找出算法基本操作: • if A[i]>maxval 比较? • maxval←A[i] 赋值? • return maxval
第二个符号Ω(g(n)),代表增长次数大于等于 g(n)(以及其常数倍,n趋向于无穷大)的函数集合。 n3∈ Ω(n2), 1/2(n(n-1)) ∈ Ω(n2), 但是100n+5 ∈/ Ω(n2)
16
最后,Θ(g(n))是增长次数等于g(n) (以及其常数 倍,n趋向于无穷大)的函数集合。 因些,每一个二次方程an2+bn+c在a>0的情况 下都包含在Θ(n2)中。
27
2.2.7基本的效率类型
O(1)< O(logn)< O(n)< O(nlogn)< O(n2)< O(n3) < O(2n)< O(n!)< O(nn) 常见的指数阶
1 log n n n log n n2 n3 2n n!
constant logarithmic linear n log n quadratic cubic exponential factorial
n0之前 的情况 无关重 要 ,为 什么?
n0
cg(n)
t(n)
常用函数符号: t(n) 一个算法运行的 时间函数 C(n)基本操作次数函 数 g(n) n 用来比较的函数
18
符号O:t(n)∈O(g(n))
• t(n)=3n+2。说明属于O(n) – 当n≥n0=2时,3n+2≤3n+n=4n – 此时c=4, g(n)=n。(向定义式靠拢) – t(n) ≤4g(n) – t(n)∈O(n)
35
把C(n)记作比较运算的执行次数, 由于该算法每执行一次循环就会做一次比较, 并且对于循环变量i在1和n-1(包含在内)中的 每个值都会做一次循环,所以,我们得到 C(n)的下列求和表达式:
C ( n)
n 1 i 1
11
2.1.4 算法的最优、最差和平均效率
一个算法的最差效率是指当输入规模为n时,算 法的最坏情况下的效率。这时,相对于其他规 模为n的输入,该算法的运行时间最长。 为什么要考虑最坏效率? 提供了对任何规模为n的实例,算法运行的上界 Cworst(n)
12
一个算法的最优效率是指当输入规模为n时,算法 在最优情况下的效率。这时,与其它规模为n的 输入相比,该算法运行得最快。
• 研究实验告诉我们,对于大多数问题来说,我们在速度 上能够取得的进展要远大于在空间上的进展,
• 所以我们把主要精力集中在时间效率上。
4
2.1 分析框架
如何评价时间效率? 2.1.1 输入规模的度量
一个事实:问题规模越大,算法运行时间越长。 将算法输入规模n为时间效率的参数。 选择哪个(些)参数作为输入规模?
2 2
所以t(n) ∈ Ω(n2)。
22
2.2.4 符号Θ
定义 3 把函数t(n)包含在Θ(g(n)) 中,记作t(n) ∈ Θ(g(n)) ;
成立条件:对于所有足够大的n, t(n) 的上界和下界都由g(n) 的常数倍数所确定, 即,存在大于0的常数c1,c2和和非负的整数n0,使得:
对于所有的n≥ n0来说, c2g(n) ≤t(n) ≤ c1g(n)
长次数。
14
2.2 渐进符号和基本效率类型
2.2.1 非正式的介绍
非正式来说, O(g(n)) 是增长次数小于等于 g(n)(以及其常数倍,n趋向于无穷大)的函数集 合。
考虑O(n2) n∈O(n2), 100n+5∈O(n2), 1/2(n(n-1)) ∈O(n2), n3不属于O(n2),
15
斐波那契数列—0,1,1,2,3,5,8,13,21,34,…
观察特点是什么? 从第3个数开始每一个数是前两个数之和。
如何写成递推式?: 当n>1时,F(n)=F(n-1)+F(n-2) F(0)=0,F(1)=1
注意: 后面问题的n均从0开始。
1
算法1 F(n) //根据定义,递归计算第n个斐波那契数 //输入:一个非负整数n //输出:第n个斐波那契数 if n≤1 return n else return F(n-1)+F(n-2)
28
关于渐进时间效率:
当比较两个算法的效率时,若两个算法是同阶的,必 须进一步考察阶的常数因子才能辨别优劣。
29
2.1-2.2小结
30
2.3非递归算法的数学分析
如何用前面介绍的知识分析一个算法的效率
31
例1 考虑从n个元素的列表中查找元素最大值的问 题. 假设列表是用数组实现的。 MaxElement(A[0..n-1]) //求给定数组中最大元素的值 //输入:实数数组A[0..n-1] //输出:A中最大元素的值 第一步: 决定用哪个(哪些) maxval←A[0] 参数作为输入规模 for i←1 to n-1 do 的度量: if A[i]>maxval 数组元素的个数n maxval←A[i] return maxval
然而,无论是最差效率分析还是最优效率分析 都不能提供一种必要的信息:在“典型”或者 “随机”输入的情况下, 一个算法会具有什么 样的行为。这正是平均效率试图提供给我们信息。
13
2.1.5 分析框架概要
• 算法的时间效率和空间效率都用输入规模的函数进 行度量。 • 我们用算法基本操作的执行次数来度量算时间效率。 通过计算算法消耗的额外存储单元的数量来度量空 间效率。 • 在输入规模相同的情况下,有些算法的效率会的显 著差异。对于这样的算法,我们需要区分最差效率, 平均效率和最优效率。 • 本框架主要关心,当算法的输入规模趋向于无限大 的时候,其运行时间(消耗的额外空间)函数的增
17
2.2.2 符号О
定义1 把函数t(n)包含在O(g(n)) 中记作t(n) ∈ O(g(n))。 称 t(n) 的阶不高于g (n) 的阶. 成立条件:对于所有足够大的n, t(n) 的上界由g(n)的 常数倍数所确定。即,存在大于0的常数c和非负的 整数n0,使得:对于所有的n≥ n0来说, t(n) ≤c g(n)
19
• t(n)= 6 * 2n+ n2 。 – 可以观察到对于n≥n0=4,有n2 ≤2n – 所以对于n≥4,有t(n)≤6 * 2n+ 2n = 7 * 2n – g(n)= 2n – t(n) ≤7g(n) – t(n) ∈ O (2n )。
20
2.2.3 符号Ω
定义2 把函数t(n)包含在Ω(g(n))中,记作t(n)∈Ω(g(n)) 。称t(n) 的阶不低于g(n)的阶。 成立条件:对于所有足够大的n, t(n)的下界由g(n)的常数倍所 确定, 即,存在大于0的常数c和非负的整数n0,使得:
34
• MaxElement(A[0..n-1]) • //求给定数组中最大元素的值 • //输入:实数数组A[0..n-1] • //输出:A中最大元素的值 • maxval←A[0] 第四步: • for i←1 to n-1 do 建立一个算法基本操 • if A[i]>maxval 作执行次数的求和表 • maxval←A[i] 达式: • return maxval
对于所有的n≥ n0来说, t(n) ≥c g(n)
t(n) cg(n)
n0之前的情 况无关重要
n
n0
符号Ω:t(n)∈Ω(g(n))
21
存在大于0的常数c和非负的整数n0,使得: 对于所有的n≥ n0来说, t(n) ≥c g(n)
对于所有的n,有t(n) = 3n+ 2 > 3n,因此t(n) ∈ Ω(n)。 对于所有的n≥0,有t(n) = 10n + 4n+ 2 > 10n ,
2
第2章 算法效率分析基础
• 一个问题往往有多个算法 • 应当分析算法的品性
–怎样评价一个算法?
3
• 一个算法好不好体现在运行该算法所需要的计算机资源 的多少上
–所需资源越少,该算法越好;
• 计算机最重要的资源是
–时间和空间
• 算法分析对算法利用这两种资源的效率做研究 • 时间效率:指出正在讨论的算法运行得有多快; • 空间效率:关心算法需要的额外空间。
基本操作的 执行时间
基本操作次数
7
• 对下面的三个时间效率函数表达式,哪一个效率 高? • C1(n)=n • C2(n)=n3 结论: n • C3(n)= 10 1 随n的递增,不同函数增幅 不同 • n=1 2 某些函数在大规模时增幅显 • 1 1 10 著,函数可以表示增幅的特点 • n=2 3 我们希望选择大规模时,时 • 2 8 100 间效率增幅小的算法 • n=3 • 3 27 1000 • n=非常大 8
• 2.1.3增长次数(增长幅度)
• 特别考虑大规模的输入要强调执行次数的增长 次数呢?这是因为小规模输入在运行时间上差别 不足以将高效的算法和低效的算法法区分开来。
9
•
• C(n)可以合理的度量算法的效率,但对同一个算 法相同的规模下运行时间就一样吗? • 考虑顺序查找: • SequentialSearch(A[0..n-1],K) • //输入:数组A[0..n-1],和查找关键字K • //输出:返回第一个匹配K的元素下标 • //如果没有匹配的,返回-1 • i=0 同为n时: • While i<n and A[i]<>K do 什么是最坏情况 • i=i+1 什么是最好情况 • If i<n return i • Else return -1
• MaxElement(A[0..n-1]) • //求给定数组中最大元素的值 • //输入:实数数组A[0..n-1] • //输出:A中最大元素的值 • maxval←A[0] 第二步: • for i←1 to n-1 do 找出算法基本操作: • if A[i]>maxval 比较? • maxval←A[i] 赋值? • return maxval
第二个符号Ω(g(n)),代表增长次数大于等于 g(n)(以及其常数倍,n趋向于无穷大)的函数集合。 n3∈ Ω(n2), 1/2(n(n-1)) ∈ Ω(n2), 但是100n+5 ∈/ Ω(n2)
16
最后,Θ(g(n))是增长次数等于g(n) (以及其常数 倍,n趋向于无穷大)的函数集合。 因些,每一个二次方程an2+bn+c在a>0的情况 下都包含在Θ(n2)中。
27
2.2.7基本的效率类型
O(1)< O(logn)< O(n)< O(nlogn)< O(n2)< O(n3) < O(2n)< O(n!)< O(nn) 常见的指数阶
1 log n n n log n n2 n3 2n n!
constant logarithmic linear n log n quadratic cubic exponential factorial
n0之前 的情况 无关重 要 ,为 什么?
n0
cg(n)
t(n)
常用函数符号: t(n) 一个算法运行的 时间函数 C(n)基本操作次数函 数 g(n) n 用来比较的函数
18
符号O:t(n)∈O(g(n))
• t(n)=3n+2。说明属于O(n) – 当n≥n0=2时,3n+2≤3n+n=4n – 此时c=4, g(n)=n。(向定义式靠拢) – t(n) ≤4g(n) – t(n)∈O(n)
35
把C(n)记作比较运算的执行次数, 由于该算法每执行一次循环就会做一次比较, 并且对于循环变量i在1和n-1(包含在内)中的 每个值都会做一次循环,所以,我们得到 C(n)的下列求和表达式:
C ( n)
n 1 i 1
11
2.1.4 算法的最优、最差和平均效率
一个算法的最差效率是指当输入规模为n时,算 法的最坏情况下的效率。这时,相对于其他规 模为n的输入,该算法的运行时间最长。 为什么要考虑最坏效率? 提供了对任何规模为n的实例,算法运行的上界 Cworst(n)
12
一个算法的最优效率是指当输入规模为n时,算法 在最优情况下的效率。这时,与其它规模为n的 输入相比,该算法运行得最快。
• 研究实验告诉我们,对于大多数问题来说,我们在速度 上能够取得的进展要远大于在空间上的进展,
• 所以我们把主要精力集中在时间效率上。
4
2.1 分析框架
如何评价时间效率? 2.1.1 输入规模的度量
一个事实:问题规模越大,算法运行时间越长。 将算法输入规模n为时间效率的参数。 选择哪个(些)参数作为输入规模?
2 2
所以t(n) ∈ Ω(n2)。
22
2.2.4 符号Θ
定义 3 把函数t(n)包含在Θ(g(n)) 中,记作t(n) ∈ Θ(g(n)) ;
成立条件:对于所有足够大的n, t(n) 的上界和下界都由g(n) 的常数倍数所确定, 即,存在大于0的常数c1,c2和和非负的整数n0,使得:
对于所有的n≥ n0来说, c2g(n) ≤t(n) ≤ c1g(n)
长次数。
14
2.2 渐进符号和基本效率类型
2.2.1 非正式的介绍
非正式来说, O(g(n)) 是增长次数小于等于 g(n)(以及其常数倍,n趋向于无穷大)的函数集 合。
考虑O(n2) n∈O(n2), 100n+5∈O(n2), 1/2(n(n-1)) ∈O(n2), n3不属于O(n2),
15
斐波那契数列—0,1,1,2,3,5,8,13,21,34,…
观察特点是什么? 从第3个数开始每一个数是前两个数之和。
如何写成递推式?: 当n>1时,F(n)=F(n-1)+F(n-2) F(0)=0,F(1)=1
注意: 后面问题的n均从0开始。
1
算法1 F(n) //根据定义,递归计算第n个斐波那契数 //输入:一个非负整数n //输出:第n个斐波那契数 if n≤1 return n else return F(n-1)+F(n-2)
28
关于渐进时间效率:
当比较两个算法的效率时,若两个算法是同阶的,必 须进一步考察阶的常数因子才能辨别优劣。
29
2.1-2.2小结
30
2.3非递归算法的数学分析
如何用前面介绍的知识分析一个算法的效率
31
例1 考虑从n个元素的列表中查找元素最大值的问 题. 假设列表是用数组实现的。 MaxElement(A[0..n-1]) //求给定数组中最大元素的值 //输入:实数数组A[0..n-1] //输出:A中最大元素的值 第一步: 决定用哪个(哪些) maxval←A[0] 参数作为输入规模 for i←1 to n-1 do 的度量: if A[i]>maxval 数组元素的个数n maxval←A[i] return maxval
然而,无论是最差效率分析还是最优效率分析 都不能提供一种必要的信息:在“典型”或者 “随机”输入的情况下, 一个算法会具有什么 样的行为。这正是平均效率试图提供给我们信息。
13
2.1.5 分析框架概要
• 算法的时间效率和空间效率都用输入规模的函数进 行度量。 • 我们用算法基本操作的执行次数来度量算时间效率。 通过计算算法消耗的额外存储单元的数量来度量空 间效率。 • 在输入规模相同的情况下,有些算法的效率会的显 著差异。对于这样的算法,我们需要区分最差效率, 平均效率和最优效率。 • 本框架主要关心,当算法的输入规模趋向于无限大 的时候,其运行时间(消耗的额外空间)函数的增
17
2.2.2 符号О
定义1 把函数t(n)包含在O(g(n)) 中记作t(n) ∈ O(g(n))。 称 t(n) 的阶不高于g (n) 的阶. 成立条件:对于所有足够大的n, t(n) 的上界由g(n)的 常数倍数所确定。即,存在大于0的常数c和非负的 整数n0,使得:对于所有的n≥ n0来说, t(n) ≤c g(n)
19
• t(n)= 6 * 2n+ n2 。 – 可以观察到对于n≥n0=4,有n2 ≤2n – 所以对于n≥4,有t(n)≤6 * 2n+ 2n = 7 * 2n – g(n)= 2n – t(n) ≤7g(n) – t(n) ∈ O (2n )。
20
2.2.3 符号Ω
定义2 把函数t(n)包含在Ω(g(n))中,记作t(n)∈Ω(g(n)) 。称t(n) 的阶不低于g(n)的阶。 成立条件:对于所有足够大的n, t(n)的下界由g(n)的常数倍所 确定, 即,存在大于0的常数c和非负的整数n0,使得:
34
• MaxElement(A[0..n-1]) • //求给定数组中最大元素的值 • //输入:实数数组A[0..n-1] • //输出:A中最大元素的值 • maxval←A[0] 第四步: • for i←1 to n-1 do 建立一个算法基本操 • if A[i]>maxval 作执行次数的求和表 • maxval←A[i] 达式: • return maxval
对于所有的n≥ n0来说, t(n) ≥c g(n)
t(n) cg(n)
n0之前的情 况无关重要
n
n0
符号Ω:t(n)∈Ω(g(n))
21
存在大于0的常数c和非负的整数n0,使得: 对于所有的n≥ n0来说, t(n) ≥c g(n)
对于所有的n,有t(n) = 3n+ 2 > 3n,因此t(n) ∈ Ω(n)。 对于所有的n≥0,有t(n) = 10n + 4n+ 2 > 10n ,
2
第2章 算法效率分析基础
• 一个问题往往有多个算法 • 应当分析算法的品性
–怎样评价一个算法?
3
• 一个算法好不好体现在运行该算法所需要的计算机资源 的多少上
–所需资源越少,该算法越好;
• 计算机最重要的资源是
–时间和空间
• 算法分析对算法利用这两种资源的效率做研究 • 时间效率:指出正在讨论的算法运行得有多快; • 空间效率:关心算法需要的额外空间。
基本操作的 执行时间
基本操作次数
7
• 对下面的三个时间效率函数表达式,哪一个效率 高? • C1(n)=n • C2(n)=n3 结论: n • C3(n)= 10 1 随n的递增,不同函数增幅 不同 • n=1 2 某些函数在大规模时增幅显 • 1 1 10 著,函数可以表示增幅的特点 • n=2 3 我们希望选择大规模时,时 • 2 8 100 间效率增幅小的算法 • n=3 • 3 27 1000 • n=非常大 8
• 2.1.3增长次数(增长幅度)
• 特别考虑大规模的输入要强调执行次数的增长 次数呢?这是因为小规模输入在运行时间上差别 不足以将高效的算法和低效的算法法区分开来。
9
•
• C(n)可以合理的度量算法的效率,但对同一个算 法相同的规模下运行时间就一样吗? • 考虑顺序查找: • SequentialSearch(A[0..n-1],K) • //输入:数组A[0..n-1],和查找关键字K • //输出:返回第一个匹配K的元素下标 • //如果没有匹配的,返回-1 • i=0 同为n时: • While i<n and A[i]<>K do 什么是最坏情况 • i=i+1 什么是最好情况 • If i<n return i • Else return -1