第二章 算法效率分析基础

合集下载

算法设计与分析-第2章-算法分析基础PPT课件

算法设计与分析-第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

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_算法效率分析基础课件

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++版 王红梅 清华大学出版社)

第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 章 算法效率分析

第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第二部分第二章

算法设计与分析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

算法效率分析基础讲义.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章算法效率分析基础

3. 若查找键位于表尾(最末元素)或不存在,该算法将比较 n 次。最差
4. 若查找键位于表中间,该算法比较次数不固定。平均效率
------------------------------------------------------------------------------------------------
T(n)C(n) 时间耗费即为基本操作数,为输入规模n的函数。
n的一次、二次函数分别称线性、二次增长率。2n 称指数增长率。
8
❖增长次数(增长率)
基本操作数(时间耗费)是输入规模 n 的函数,记为T(n) 。T(n) 随着 n 次数的增加而增加。函数值T(n) 增加快慢,决定于这个增长函数特性; 也就是说,线性增长函数的函数值增加较慢,二次增长函数增加较快, 指数增长函数最快。因此,我们最关心的就是函数的增长率,它决定了 算法的时间耗费(效率)。若输入规模 n 很小,无论是高效的算法还是 低效的算法,时间耗费差距不明显,所以算法分析针对大规模输入。
通常,具备这种运行特性的算法是在一定程度上的具有“智能”的算法, 通过“学习”获得“知识”累积,再运用知识库中的有关知识对算法下
次 如何执行提供指导,从而提高以后运行的效率。一个例子:汉字拼音 输入法中的动态词频调整算法。它统计不同用户对某些字词的使用率 (学习积累过程),来动态调整这些字词下次出现的先后顺序,高频 先现,达到减少用户翻阅时间的目的,提高了该算法的执行效率。 ---------------------------------------------------------------------------------------------后续章节中,除非专门说明,都将最差情况下时间耗费的极限作为算法14

第2章 算法效率分析基础

第2章 算法效率分析基础
❖输入规模的度量:(问题规模)
一个显而易见的事实:几乎所有的算法,对于更大规模输入都需要运行 更长的时间(即算法耗费的时间随着输入规模的增大而增加) 。例如: 1. 更大的数组排序需要花费更多的运行时间; 2. 更大的矩阵相乘需要花费更多的运算时间。 因此,采用一个以算法输入规模 n 为参数的函数,来研究算法效率就是 非常合乎逻辑的。 输入规模的选择问题: 在大多数情况下,选择这样一个参数是非常直接的。例如,对于排序、 查找以及其他大多数与列表相关的问题来讲,这个参数就是列表长度; 对于 n 次多项式求值问题,这个参数是多项式次数或者系数个数。 4
5
❖运行时间的度量:
接下来考虑运行时间的度量问题。我们为何不选择时间的标准度量单位 (秒、毫秒等)来度量算法的运行时间呢?其理由如下: 1. 它依赖于特定计算机的运行速度; 2. 它依赖于实现算法的代码质量;(程序员编程的水平问题) 3. 它依赖于编译器的好坏;(编译成机器码的质量,即指令条数) 4. 它还依赖于一些其他问题如操作系统的调度策略等。 鉴于此,希望找到一个不依赖于上述因素的时间度量。 问:是否统计算法的每步操作执行次数来作为算法的时间效率度量呢? 答:无此必要且较困难。一个算法中有许多操作,决定算法时间效率的 是那些很耗费时间的操作步,因此只需关心这些操作即可评价一个算法 时间效率,这些最关键的操作步称为基本操作,它们对算法执行时间的 占用最大(基本操作即算法中最费时的操作)。所以,用基本操作执行 次数来作为时间效率的度量。
前述已知,我们用输入规模 n 的函数 T(n) 来度量算法的效率。若T(n) 随 n 增长快,则算法效率较差;若T(n) 随 n 增长较慢,则算法效率更好。 这里,没考虑算法效率与特定输入的关系。诸多算法的效率不仅与规模 有关,且与特定的输入有关。下面以顺序查找算法为例:

第2章 算法分析基础

第2章 算法分析基础

• 计算时间/频率计数的表示函数
通过事前分析给出算法计算时间(频率计数) 的一个函数表示形式,一般记为与输入规模n有关 的函数形式:f(n)
注:最高次项与函数整体的关系 •空间特性分析(与时间特性的分析类似,略)
2)事后测试 • 目的:运行程序,确定程序实际耗费的时间 与空间,验证先前的分析结论——包括正确 性、执行性能等,比较、优化所设计的算法 。
(1)O(f)+O(g)=O(max(f,g))
(2)O(f)+O(g)=O(f+g) (3)O(f)O(g)=O(fg) (4)如果g(N)=O(f(N)),则O(f)+O(g)=O(f) (5)O(Cf(N))=O(f(N)),其中C是一正常数。
(6)f=O(f)

定义1.2 若存在两个正常数C和自然数N0,使得当N ≥ N0 时有|f(N)|≥C|g(N)|,则称函数f(N)当N充分大时下有界; 且g(N)是它的一个下界,记为f(N)=Ω(g(N))。这时我们说 f(N)的阶不低于g(N)的阶。
例:
x=x+y for (i =1;i<=n;i++) x=x+y;
(b)
(a)
for (i =1;i<=n;i++) for (j =1;j<=n;j++) x=x+y; (c)
分析: (a): x=x+y执行了1次 (b): x=x+y执行了n次 (c): x=x+y执行了n2次
注:在事前分析中,只限于确定与所使用机器及其他环境 因素无关的频率计数,依此建立一种理论上分析模型。
• 分析手段:作时、空性能分布图。
算法复杂性分析

算法-第2章-算法效率分析基础(李静)

算法-第2章-算法效率分析基础(李静)

2.2.2 符号О
定义1 我们把函数t(n)属于O(g(n)) ,记作t(n) ∈ O(g(n)) ; 它的成立条件是:对于所有足够大的n, t(n) 的上界由g(n) 的常数倍数所确定,也就是说,存在大于0的常数c和非负 的整数n0,使得: 对于所有的n≥ n0来说, t(n) ≤c g(n)
cg(n)
思考
• • • • P46 2T P46 4.bT P46 5T P46 6.aT
补充知识
• 渐近分析中函数比较
– f(n)∈ O(g(n)) a b; – f(n)∈ (g(n)) a b; – f(n)∈ (g(n)) a = b; – f(n)∈ o(g(n)) a < b; – f(n)∈ (g(n)) a > b.
• 无论是最差效率分析还是最优效率分析都不能提供一 种必要的信息:在“典型”或者“随机”输入的情况 下, 一个算法会具有什么样的行为。这正是平均效率 试图提供给我们信息。 • 摊销效率: 它并不适用于算法的单次运行,而是应用于 算法对同样数据结构所执行的一系列操作。
2.1.4 算法的最优、最差和平均效率
对于两个连续执行部分组成的算法,应该如何应 用这个特性呢?它意味着该算法的整体效率是由 具有较大的增长次数的部分所决定的,即它的效 率较差的部分.
பைடு நூலகம்
算法分析:加法规则
t(n, m)=t1(n)+t2 (m) ∈O(max (f (n), g (m)))
两个并列循环的例子 void example (float x[ ][ ], int m, int n, int k) { float sum [ ]; for ( int i=0; i<m; i++ ) { //x[][]中各行 sum[i] = 0.0; //数据累加 for ( int j=0; j<n; j++ ) sum[i]+=x[i][j]; } for ( i = 0; i < m; i++ ) //打印各行数据和 cout << “Line ” << i << “ : ” <<sum [i] << endl; } 渐进时间复杂度为O(max (m*n, m))

算法设计与分析(第二章)

算法设计与分析(第二章)

在这里,输入规模显然是用数组元素的个数n来 度量。算法中存在两种操作:比较运算 A[i]>maxval和赋值运算maxval=A[i]。我们应 该把两种运算中的那一种作为基本运算呢?由 于每做一次运算都会做一次比较,而赋值运算 并不这样,我们应该把比较运算作为该算法的 基本操作
若C(n)记作比较运算的执行次数,
一个算法的最差效率 最差效率是指,当输入规模为n时 最差效率 算法在最坏情况下的效率。这时,相对于其他 规模为n的输入,该算法的运行时间最长。 一个算法的最优效率 最优效率是指当输入规模为n时, 最优效率 算法在最优情况下的效率。 一个算法的平均效率 平均效率是指算法在“典型”或者 平均效率 是“随机”输入的情况下会具有什么样的行为?
执 行 次 数 c1×f(n) ( ) T(n) ( ) c2×f(n) ( )
n0 之 前 的 情况无关 紧要 n0
问题规模n 问题规模
例: T(n)=5n2+8n+1 ( ) + 当n≥1时,5n2+8n+1≤5n2+8n+n ≥ 时 + ≤ + =5n2+9n≤5n2+9n2≤14n2=O(n2) ≤ ( 当n≥1时,5n2+8n+1≥5n2=Ω(n2) ≥ 时 + ≥ ( ∴ 当n≥1时,14n2≥5n2+8n+1≥5n2 ≥ 时 + ≥ 则:5n2+8n+1=Θ(n2) + = (
算法F(n) //递归计算n! //输入:非负整数n //输出:n!的值 if n=0 return 1 else return F(n-1)*n
算法的输入规模:n; 算法的基本操作:乘法,它的执行次数记作 M(n). 由于F(n)的计算是根据下面的公式 当n>0时,F(n)=F(n-1)*n 所以,计算这个公式时,用到的乘法数量M(n) 需要满足这个等式: 当n>0时,M(n)=M(n-1)+1

第二章 算法分析基础

第二章 算法分析基础
2
3
m
n
定理2.1:
若 A(n)=amnm+…+a1n+a0 是关于n的m次 多项式,则 A(n)= (nm)
算法分成两类:多项式阶算法和指数阶算 法。
O (1) O (log 2 log 2 n ) O (log 2 n ) O ( n ) O ( n log 2 n ) O ( n ) O ( n ) O ( 2 )
证明一系列语句确实做了符合规定的操作。
“正确”的含义分为以下四个层次:
①算法不含语法错误 ②算法对于几组输入数据能够得出满足 规格说明要求的结果 ③算法对于精心选择的典型、苛刻而带 有刁难性的几组数据能够得出满足规格 说明要求的结果 ④算法对一切合法的输入数据都能产生 满足规格说明要求的结果
Testing (测试)
Black
2.时间复杂性
度量时间复杂性的标准: (1)能告诉算法所采用的方法的时间效率; (2)与算法描述语言及设计风格无关; (3)与算法的许多细节无关; (4)足够精确和具有一般性。 基本运算(关键操作) 对所研究问题的基本操作 时间复杂性

一个算法的时间复杂性是指该算法的基本运算次数 算法的时间复杂性还与输入数据元素的个数(输入规 模,输入的大小)和输入数据的状态有关
评估算法的5条准则: 1 正确性 2 时间复杂性 3 占用空间(指令、数据和环境栈空间) 4 可读性 5 坚固性(健壮性)
1.正确性
一个算法包括两方面内容:一是解决问 题的方法,二是实现这一方法的一系列指 令(语句、步骤)。
确认一个算法所用方法和(或)所用公式
的正确性,可能需要相关的引理和定理。
例2.1 A是一个含有n个不同元素的实数数 组,给出求A之最大和最小元素的算法。

算法效率分析基础讲解

算法效率分析基础讲解

15
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)
• 研究实验告诉我们,对于大多数问题来说,我们在速度 上能够取得的进展要远大于在空间上的进展,
• 所以我们把主要精力集中在时间效率上。
2
2.1 分析框架
如何评价时间效率? 2.1.1 输入规模的度量
一个事实:问题规模越大,算法运行时间越长。 将算法输入规模n为时间效率的参数。 选择哪个(些)参数作为输入规模?
然而,无论是最差效率分析还是最优效率分析 都不能提供一种必要的信息:在“典型”或者 “随机”输入的情况下, 一个算法会具有什么 样的行为。这正是平均效率试图提供给我们信息。
11
2.1.5 分析框架概要
• 算法的时间效率和空间效率都用输入规模的函数进 行度量。 • 我们用算法基本操作的执行次数来度量算时间效率。 通过计算算法消耗的额外存储单元的数量来度量空 间效率。 • 在输入规模相同的情况下,有些算法的效率会的显 著差异。对于这样的算法,我们需要区分最差效率, 平均效率和最优效率。 • 本框架主要关心,当算法的输入规模趋向于无限大 的时候,其运行时间(消耗的额外空间)函数的增
9
2.1.4 算法的最优、最差和平均效率
一个算法的最差效率是指当输入规模为n时,算 法的最坏情况下的效率。这时,相对于其他规 模为n的输入,该算法的运行时间最长。 为什么要考虑最坏效率? 提供了对任何规模为n的实例,算法运行的上界 Cworst(n)

算法效率分析基础

算法效率分析基础

第2章算法效率分析基础算法分析框架介绍算法效率的符号表示非递归算法分析递归算法分析什么是算法分析?算法分析就是对算法利用两种资源的效率进行定量分析: 运行时间and 存储空间.Time efficiency:how fast an algorithm runs.Space efficiency:the space an algorithm requires.•一般来说, 算法的运行时间会随着输入规模的增长而增长•算法分析更关注输入规模和效率变化之间的关系22.1 算法分析框架输入规模度量运行时间度量增长次数(算法效率函数)算法的最差、最优和平均效率32.1.1 输入规模度量算法的时间效率和空间效率都用输入规模n为参数的函数进行度量N阶矩阵的乘积对于所有的算法,对于规模更大的输入都需要运行更长的时间。

选择输入规模的合适量度,要受到所讨论算法的操作细节影响。

拼写检查42.1.2 运行时间的度量单位我们可以使用时间的标准度量单位来度量算法程序的运行时间么?依赖于计算机的运行速度和程序质量统计算法每一步操作执行的次数?困难且无必要统计算法的基本操作执行的次数.基本操作:操作中对整个运行时间贡献程度最大的操作通常,基本操作常常是算法最内层的循环中最费时的操作.5算法运行时间估计672.1.3 增长次数要点:•仅仅考虑公式中最主要的项(leading term )•忽略乘法常量.Exponential-growth functions小规模输入在运行时间上的差别不足以将高效的算法和低效的算法区分开来2.1.4 算法的最优最差和平均效率算法效率不仅取决于输入规模n,而且某些算法受到特定输入细节的影响举例: 顺序查找–Problem:给定n个元素和一个查找键K,如果存在,查找一个与键值k 相等的元素.–Algorithm:检查列表中的连续元素,直到发现匹配查找键的元素(successful search)或到达列表的终点(unsuccessful search)给定顺序查找问题的输入规模为n,什么样的输入会导致最长的运行时间?需要多少次键值比较?8顺序查找算法ALGORITHM SequentialSearch(A[0..n-1], K)//Searches for a given value in a given array by sequential search//Input: An array A[0..n-1] and a search key K//Output: Returns the index of the first element of A that matches K or –1 if there are no matching elementsi Å0while i < n and A[i] ‡K doi Åi + 1if i < n //A[I] = Kreturn ielsereturn -192.1.5 最差、最好和平均效率最差效率是指在输入规模为n时,算法在最坏情况下的效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档