算法效率分析基础讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)
10
一个算法的最优效率是指当输入规模为n时,算法 在最优情况下的效率。这时,与其它规模为n的 输入相比,该算法运行得最快。
第二个符号Ω(g(n)),代表增长次数大于等于 g(n)(以及其常数倍,n趋向于无穷大)的函数集合。 n3∈ Ω(n2), 1/2(n(n-1)) ∈ Ω(n2), 但是100n+5 ∈ Ω(n2)
14
最后,Θ(g(n))是增长次数等于g(n) (以及其常数 倍,n趋向于无穷大)的函数集合。 例:每一个二次方程an2+bn+c在a>0的情况下都 包含在Θ(n2)中。
• 2.1.3增长次数(增长幅度)
• 特别考虑大规模的输入要强调执行次数的增长 次数呢?这是因为小规模输入在运行时间上差别 不足以将高效的算法和低效的算法法区分开来。
7
•
图1-2 各种函数的曲线
8
• 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
长次数。
12
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),
13
基本操作的 执行时间
基本操作次数
5
• 对下面的三个时间效率函数表达式,哪一个效率 高? • 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=非常大 6
第2章 算法效率分析基础
• 一个问题往往有多个算法 • 应当分析算法的品性
–怎样评价一个算法?
1
• 一个算法好不好体现在运行该算法所需要的计算机资源 的多少上
–所需资源越少,该算法越好;
• 计算机最重要的资源是
–时间和空间
• 算法分析对算法利用这两种资源的效率做研究 • 时间效率:指出正在讨论的算法运行得有多快; • 空间效率:关心算法需要的额外空间。
3
2.1.2 运行时间的度量单位
可以采用秒,分,小时吗?
可以统计算法每一步的操作次数吗?
一般的做法:
把基本操作(最重要的操作)次数作为算法运 行时间的度量单位。 思考下面算法的重要操作:
排序
矩阵乘法
4
• 建立一个算法时间效率的分析框架 • 对于输入规模为n的算法 • 统计基本操作执行次数C(n),来对其效率进行度 量。 • 在某个特定计算机上的某个算法程序的运行时间 • T(n)≈copC(n)
17
• 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) –Ω
定义2 把函数t(n)包含在Ω(g(n))中,记作t(n)∈Ω(g(n)) 。称t(n) 的阶不低于g(n)的阶。 成立条件:对于所有足够大的n, t(n)的下界由g(n)的常数倍所 确定, 即,存在大于0的常数c和非负的整数n0,使得:
n0之前 的情况 无关重 要 ,为 什么?
n0
cg(n)
t(n)
常用函数符号: t(n) 一个算法运行的时间函数 C(n)基本操作次数函数 g(n) 用来比较的函数
n
16
符号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)