第2章 算法分析基础

合集下载

算法2_算法分析基础

算法2_算法分析基础

关键操作通常是位于算法最内层循环的程序步(或语句), ch2.20 是算法中执行次数最多的操作(程序步) 。
(2)渐近下界记号
如果存在正常数c和自然数n0,使得当n n0时有f(n) ≥cg(n) ,则称函数f(n)当
n充分大时有下界,且g(n)是它的一个下界,记做f(n)=(g(n)) 。即f(n)的阶 不低于g(n)的阶。
//1
//1
//1
2 n0 T (n) T (n 1) 2 n 0
程序总步数为:2n+2
但递归调用引起的循环计算和使用for语句的循环计算所需的开销是不同的。递 归需要耗费更多的时间和空间资源。
可见:程序步数并不能确切反映程序运行的实际时间。
ch2.14
2.2 渐近表示法
好算法的4个重要特征: Correctness——正确性
注意区分“正确性”和“健壮性”的概念: 算法正确性——在合法的输入下,算法应实现预先规定的功能和计算精度要求。 程序健壮性——当输入不合法的数据时,程序应能做适当处理而不至于引起严 重后果。 正确性和健壮性互相补充。 程序可靠性——在正常情况下能正确地工作,在异常情况下也能做出适当处理。
表示常数计算时间,代 做f(n)=O(g(n)) 。即f(n)O(1) 的阶不高于 g(n)的阶。
表算法只需执行有限个程序 步。 上界记号O举例: 如何证明? C0=O(1) f(n)=C 0为非零常数,取c=c0 100n+6=O(n) 取c=101, n0=6 6*2n+n2=O(n2) 取c=7, n0=4 3log n+2*n+n2=O(n2) 取c=6, n0=1
执行算法所需的时间和存储空间
算法设计者常常需要在算法的简明 性和效率之间作出谨慎的选择

第二章算法效率分析基础

第二章算法效率分析基础

414
基本的效率类型
•常量(1)、对数(logn)、线性 (n)、nlogn、平方(n2)、立 方(n3)、指数(2n)、阶乘(n!)
515
非递归算法的数学分析
Example 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 • maxval A[i] •return maxval
• 考虑: 1. 循环中的操作有比较和赋值,取
哪一个作为基本操作? 2. 输入规模是多少?
•基本操作为:比较运算 •输入规模就是数组长度n •算法的效率为:
记为t(n) ∈ Θ(g(n))
•n2+3n+2∈Θ (n2) •n(n-1)/2∈Θ (n2) •4n2+5 ∈Θ (n2)
212
渐进符号的有用特性
定理 如果t1(n) ∈O(g1(n))并且t2(n) ∈O(g2(n)),则 t1(n)+ t2(n) ∈O(max{(g1(n), g2(n)})
99
符号O
定义1 对于足够大的n,t(n)的上界由g(n)的常数倍来确定 ,即:
•t(n) ≤ cg(n),c为常数 记为t(n) ∈O(g(n))
•n ∈O(n2) •100n+5 ∈O(n2) •n(n-1)/2 ∈O(n2)
010
符号Ω
定义2 对于足够大的n,t(n)的下界由g(n)的常数倍来确定 ,即:
818

算法设计与分析-第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)
间就一个常因子范围内而言是相同的。

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

算法-第2章-算法效率分析基础

The Big-O and Related Notations
2.2.7 基本的效率类型
1 log n n n log n n2 n3 2n n! constant logarithmic linear n log n quadratic cubic exponential factorial
思考
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)
2.2 渐进符号和基本效率类型
2.2.1 非正式的介绍
O(g(n)) 是增长次数小于等于g(n) (以及其常数倍,n趋 向于无穷大)的函数集合。 n∈O(n2),100n+5∈O(n2), n(n-1) /2 ∈O(n2),n3∈/ O(n2), Ω(g(n)),代表增长次数大于等于g(n)(以及其常数倍,n趋 向于无穷大)的函数集合。 n3∈ Ω(n2), n(n-1) /2 ∈ Ω(n2),但是100n+5 ∈/ Ω(n2) Θ(g(n))是增长次数等于g(n) )(以及其常数倍,n趋向于无 穷大)的函数集合。因此,每一个二次方程an2+bn+c在 a>0的情况下都包含在Θ(n2)中,除了无数类似于n2+sin n和n2+log n的函数(你能解释原因吗?)。
t(n) cg(n)
n0之前的情 况无关重要
n n0 符号Ω:t(n)∈Ω(g(n))
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)

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


指数函数
对于正整数m,n和实数a>0:
a0=1;

a1=a ; a-1=1/a ; (am)n = amn ; (am)n = (an)m ;
x 2 x3 xi e 1 x 2! 3! i 0 i! ex 1+x |x| 1 1+x ex 1+x+x2 ∴ 当 x0,有ex = 1+x+ (x2) x
AVA(n) = ∑Pi(n)ti(n)
i∈ I
= ∑Psi(n)ti(n) + ∑Pui(n)ti(n)
= ∑[(1-q) / n · (j + 1)] + q ·(n +1)

平均复杂度 设:I是问题规模为n的所有输入的集合, i∈I是 问题的一个输入实例。ti(n)是输入i下,算法A的 “关键操作”数。Pi(n)是输入i出现在I中的概率。 则,算法A的平均时间复杂度: AVA(n) = ∑(Pi(n)ti(n))
i∈ I
例2-4:“顺序表查找”算法的平均复杂度: 设:“失败”概率为q(0≤q ≤1)。而且假设“成功” 查找时,各种输入“等概率”,即: 成功查找的输入概率为psi(n) = (1-q) / n

若存在正整数c和n0,使得对于所有n≥n0,都有:
f(n)≥cg(n),则称g(n)是f(n)的下界,记为: f(n) = Ω(g(n))
若存在正整数c1、c2和n0,使得对于所有n≥n0,都
有:c1g(n) ≤ f(n) ≤ c2g(n),则称g(n)是f(n)的精确界, 记为: f(n) = Θ(g(n)) 如果对于任意c>0,都存在非负整数n0,使得当 n≥n0时,有f(n) < cg(n),则称g(n)是f(n)的非紧上 界,记为: f(n) = o(g(n)) 如果对于任意c>0,都存在正数n0 >0,使得当n≥ n0 时,有: f(n) > cg(n),则称g(n)是f(n)的非紧下界, 记为: f(n) = (g(n))

第2章-算法的分析基础分析解析

第2章-算法的分析基础分析解析

通过程序步来分析算法的时间复杂度
求数组元素累加之和的迭代程序: (P20 程序2-1) float Sum(float list[],const int n) { float tempsum=0.0; //1 for (int i=0;i<n;i++) //n+1 { tempsum+=list[i]; //n } return tempsum; //1 } 程序总步数为:2n+3 求数组元素累加之和的递归程序: (P21 程序2-2) float RSum(float list[],const int n) { if (n) //1 { return RSum(list,n-1)+list[n-1]; //1 } return 0; //1 }
(1)最好情况下的时间复杂性: B(n) = Tmin(n) = min{ T(n,I) | I∈Dn } (2)最坏情况下的时间复杂性: W(n) = Tmax(n) = max{ T(n,I) | I∈Dn }
(3)平均情况下的时间复杂性:
A(n) = Tavg(n) =
IDn
p(I)T(n,I)
南京邮电大学 计算机学院计科系
第2章 算法分析基础
柯昌博 日期:2015-2-6
2018/10/20
1
2.1 算法复杂度

好算法的4个重要特征: Correctness——正确性
注意区分“正确性”和“健壮性”的概念: 算法正确性——在合法的输入下,算法应实现预先规定的功能和计算精度要求。
程序健壮性——当输入不合法的数据时,程序应能做适当处理而不至于引起严重后果。



好算法的4个重要特征: Correctness——正确性 Simplicity, clarity——简明性 Amount of time/space used——效率 Optimality——最优性
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法2 改进的百鸡问题 1. void chicken_problem(int n,int &k,int g[],int m[],int s[]) 2. {int i,j,a,b,c; k = 0; i = n/5; j = n/3; 3. for (a=0;a<=i;a++){ 4. for (b=0;b<=j;b++) { 5. c = n–a–b; 6. if ((5*a+3*b+c/3==n)&&(c%3==0)) { 7. g[k] = a; 8. m[k] = b; 9. s[k] = c; 10. k++; 11. } 12. } 13. } 14. }
第二章 算法分析基础
1 2 3 4
算法时间复杂性分析 算法空间复杂性分析 最优算法 小 结
思考如下问题 案例一——百鸡问题
公元5世纪末,我国古代数学家张丘建在 他所撰写的《算经》中,提出了这样一个 问题:“鸡翁一,值钱五;鸡母一,值钱 三;鸡雏三,值钱一。百钱买百鸡,问鸡 翁、母、雏各几何?”意思是公鸡每只5 元、母鸡每只3元、小鸡3只1元,用100元 钱买100只鸡,求公鸡、母鸡、小鸡的只 数。
非递归算法分ቤተ መጻሕፍቲ ባይዱ的一般步骤
1. 决定用哪个(或哪些)参数作为算法问题规模的度量 可以从问题的描述中得到。 2. 找出算法中的基本语句 通常是最内层循环的循环体。 3. 检查基本语句的执行次数是否只依赖于问题规模 如果基本语句的执行次数还依赖于其他一些特性,则 需要分别研究最好情况、最坏情况和平均情况的效率。 4. 建立基本语句执行次数的求和表达式 计算基本语句执行的次数,建立一个代表算法运行时 间的求和表达式。 5. 用渐进符号表示这个求和表达式 计算基本语句执行次数的数量级,用大O符号来描述 算法增长率的上限。
执 行 次 数 c1×f(n) T(n) c2×f(n)
n0 之 前 的 情况无关 紧要 n0 问题规模n
渐进符号——运行时间的准确界
例1.1 T(n)=3n-1 【解答】 当n≥1时,3n-1≤3n=O(n) 当n≥1时,3n-1≥3n-n=2n=Ω(n) 当n≥1时,3n≥3n-1≥2n,则3n-1=Θ(n) 例1.2 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)
如果能够证明求解问题 Π 的任何算法的运行时
间下界是 Ω(g(n)) ,那么,对以时间 O(g(n)) 来求解 问题Π的任何算法,都认为是最优算法。
延伸阅读 算法的后验分析
算法的后验分析(Posteriori)也 称算法的实验分析,它是一种事后计 算的方法,通常需要将算法转换为对 应的程序并上机运行。
}
H(1) = 1 H(n) = 2*H(n-1)+1
(n=1) (n>1)
关键:根据递归过程建立递推关系式,然 后求解这个递推关系式。 1. 猜测技术:对递推关系式估计一个上限, 然后(用数学归纳法)证明它正确。
2. 扩展递归技术
7 T ( n) = 2 + 2T ( n 2 ) 5 n
算法时间复杂度分析——定理
练习: 1. T(n)=4096 2. T(n)=5n+2 3. T(n)=8n2+3n+2 4. T(n)=5×2n+n2 5. T(n)=logn2
定理1.1 若T(n)=amnm +am-1nm-1 + … +a1n+a0 (am>0),则有T(n)=O(nm),且T(n)=Ω(nm), 因此,有T(n)=Θ(nm)。
渐进符号——运行时间的准确界
Θ符号(运行时间的准确界) 定义1.3 若存在三个正的常数c1、c2和 n0,对于任意n≥n0,都有 c1f(n)≥T(n)≥c2×f(n),则称 T(n)=Θ(f(n))。 Θ符号意味着T(n)与f(n)同阶,用来表 示算法的精确阶。
3. Θ 符号
定义1.3 若存在三个正的常数c1、c2和n0,对于任意n≥n0 都有c1×f(n)≥T(n)≥c2×f(n),则称T(n)=Θ (f(n))
渐进符号——运行时间的下界
定义 若存在两个正的常数c和n0,对于任意n≥n0, 都有T(n)≥cg(n),则称T(n)=Ω(g(n)) 。 大Ω符号用来描述增长率的下限,也就是 说,当输入规模为n时,算法消耗时间的 最小值。与大O符号对称,这个下限的阶 越高,结果就越有价值。
该算法的运行时间至少是Ω(g(n)) 。
1. 大O符号
定义1.1 若存在两个正的常数c和n0,对于任意 n≥n0,都有T(n)≤c×f(n),则称T(n)=O(f(n))
执 行 次 数 c×f(n) T(n)
n0 之 前 的 情况无关 紧要
n0
问题规模n
渐进符号——运行时间的上界
例如: 当有T(n) ≤100n+n 取n0=5,对任意n≥ n0,有: T(n) ≤100n+n=101n 令c=101, f(n)=n,有: T(n) ≤cn=cf(n) 所以T(n)=O(f(n)) =O(n) 练习: 当有T(n) ≤19/15n2+161/15n+28 则T(n)=O( ?)
for (i=1; i<=n; i++) for (j=1; j<=n; j++) x++;
问题规模:n 基本语句:x++
渐进符号——运行时间的上界
定义: 若存在两个正的常数c和n0,对于任意n≥n0, 都有T(n)≤cf(n),则称T(n)=O(f(n)) 。 大O符号描述增长率的上限,表示T(n)的 增长最多像f(n)增长的那样快,换言之, 当输入规模为n时,算法消耗时间的最大 值,这个上限的阶越低,结果越有价值。 该算法的运行时间至多是O(f(n)) 。
优<---------------------------<劣 O(1)<O(㏒2n)<O(n)< O(n㏒2n): <O(n2)<O(2n)
典型的计算时间函数曲线
空间复杂度
2.3 最优算法
所谓最优算法(Optimality Algorithm)是 指在某一种度量标准下,优于该问题的所有 (可能的)算法。
T (n) = 2T ( n 2) + 5n2
n =1
n>1
= 2( 2T ( n 4) + 5( n 2)2 ) + 5n2
= 2( 2( 2T ( n 8) + 5( n 4)2 ) + 5( n 2)2 ) + 5n2 = 2k T (1) + 2k -1 5(
k -1 2
n2 + 2 ×´ + + ) L 2 5( ) 5n k -1 2 2
算法分析——时间复杂性
基本概念
算法分析:对算法所需要的两种计算 机资源——时间和空间进行估算。 问题规模:指输入量的多少。运行算 法所需要的时间T是问题规模n的函数, 记作T(n)。
基本语句:执行次数与整个算法的执 行次数成正比的语句。
时间复杂性分析的关键:
问题规模:输入量的多少; 基本语句:执行次数与整个算法的执行时间 成正比的语句
案例一——百鸡问题
令a为公鸡只数,b为母鸡只数,c为小鸡只数。 列出约束方程: a+b+c=100 ( 1) 5a+3b+c/3=100 (2) c%3=0 ( 3) 分析: a、b、c的可能取值范围为0~100,对a、 b、c的所有组合进行测试,满足约束方程的组 合是问题的解。把问题转化为用 n 元钱买 n 只 鸡,则上式变为:
2.1.3 最好、最坏和平均情况
例: 在一维整型数组A[n]中顺序查找与给定值k相 等的元素(假设该数组中有且仅有一个元素值为k)
int Find(int A[ ], int n) { for (i=0; i<n; i++) if (A[i]= =k) break; return i; }
结论:如果问题规模相同,时间代价与输 入数据有关,则需要分析最好情况、最坏 情况、平均情况。 最好情况:出现概率较大时分析 最差情况:实时系统 平均情况:已知输入数据是如何分布的, 通常假设等概率分布
c T ( n) = k + aT ( n b ) cn n =1 n>1
k > a b k = a b k < a b
O ( nlog a ) k = T ( n) O ( n log b n) k O ( n )
b
算法复杂度分析小结
渐近复杂度: 选取基本语句 基本技术: 、 、 根据循环统计基本 标准: 语句次数 平均时间复杂 用递归关系统计基 最坏时间复杂 统计基本语句频数 本语句次数 最好时间复杂度 用平摊方法统计基 基本技术: 本语句次数 常用求和公式 定积分近似求和 计算并简化统计结果 递归方程求解
a+b+c=n 5a+3b+c/3=n ( 1 ') ( 2 ')
算法1 百鸡问题 1. void chicken_question(int n,int &k,int g[],int m[],int s[]) 2. { 3. int a,b,c; 4. k = 0; 5. for (a=0;a<=n;a++){ 6. for (b=0;b<=n;b++){ 7. for (c=0;c<=n;c++) { 8. if ((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. } 14. } 15. } 16. } 17. }
相关文档
最新文档