算法效率分析基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

拼写检查
4
2.1.2 运行时间的度量单位
我们可以使用时间的标准度量单位来度量算法程序的运行时间么?
依赖于计算机的运行速度和程序质量
统计算法每一步操作执行的次数?
困难且无必要
统计算法的基本操作执行的次数.
基本操作:
操作中对整个运行时间贡献程度最大的操作
通常,基本操作常常是算法最内层的循环中最费时的
操作.
5
算法运行时间估计
6
7
2.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 elements
i Å0
while i < n and A[i] ‡K do
i Åi + 1
if i < n //A[I] = K
return i
else
return -1
9
2.1.5 最差、最好和平均效率
最差效率是指在输入规模为n时,算法在最坏情况下的效率。

最优效率是指在输入规模为n是,算法在最优情况下的效率。

平均效率是指在“典型typical”或“随机random”输入的情况下,算法具有的行为(效率)。

例:顺序查找
10
2.2 渐进符号和基本效率类型
算法效率的主要指标是基本操作的增长次数。

为了对这些增长次数进行比较和归类,计算
机科学家们使用了3种符号:
O (读“O”):上界
Ω(读”omega”):下界
Θ(读”theta”):近似
11
符号O
定义1 :
对于足够大的n,t(n)的上界由g(n)的常数倍来确定,即:
t(n) ≤cg(n),c为常数
记为t(n) ∈O(g(n))
10n2∈O(n2)
10n2+ 2n∈O(n2)
100n + 5∈O(n2)
5n+20 ∈O(n )
12
符号Ω
定义2
对于足够大的n,t(n)的下界由g(n)的常数倍来确定,即:
t(n) ≥cg(n),c为常数
记为t(n) ∈Ω(g(n))
10n2∈Ω(n2)
10n2+ 2n∈Ω(n2)
10n3∈Ω(n2
)
13
符号Θ
定义3
对于足够大的n,t(n)的上界和下界由g(n)的常数倍来确定,即:
c2g(n) ≤t(n) ≤c1g(n),c1,c2为常数
记为t(n) ∈Θ(g(n))
10n2∈Θ(n2)
10n2+ 2n ∈Θ(n2)
(1/2)n(n-1)∈Θ(n2)
14
渐进符号的有用特性
For example, 5n2+ 3nlog(n)∈O(n2) 15
利用极限比较增长次数Examples:
•10n vs. 2n2
•n(n+1)/2 vs. n2
•log
b n vs. log
c
n
16
17基本效率类型
阶乘factorial n!指数exponential 2n
立方cubic n 3
平方quadratic n 2
n log n n log n
线性linear n
对数logarithmic log n
常数constant 1
fast slow
High time efficiency low time efficiency
大多数算法的时间效率可以分为少数几种类型
基本的效率类型
18
算法效率增长的几个要点
所有对数函数log
a n属于同一类型
Θ(log n)无论算法的对数底a > 1 是多少.
所有多项式的次数为k的函数属于同一类型: a
k n k+ a k-1n k-1
+ …+ a0 ∈Θ(n k).
指数函数a n对于不同的底a’增长速度各有不同
增长次数
order log n < order nα(α>0) < order a n< order n! < order n n
19
2.3
非递归算法的数学分析
20
非递归算法效率通用分析步骤
21
22
Example
:考虑以下算法的效率
2.4 递归算法的数学分析
n!的递归分析
汉诺塔问题的递归方法
23
Example1: n!的递归分析问题描述
F(n)=n!
对于任意非负正整数n 求解
24
25
Example 1:n !的递归分析
两个递归关系表达式
阶乘函数的计算公式: F(n)
计算n !公式用到的乘法数量,M(n)
F(n) = F(n –1) * n for every n > 0
F(0) = 1
M(n) = M(n –1) + 1 for every n > 0
M(0) = 0
M(n) ∈Θ
(n)
递归算法时间效率分析通用步骤决定度量输入规模的参数
确定算法的基本操作
检查对于相同规模的不同输入,基本操作的执行次数是否不同对于算法基本操作的执行次数,建立递归关系以及初始条件
求解递推式,或确定它解得增长次数
26
Example 2: 汉诺塔
1
3
2
27
28汉诺塔问题
递归关系
移动次数表示为M(n)
简洁vs. 效率
M(n) = 2M(n –1) + 1 for every n > 0
M(1) = 1M(n) ∈Θ(2n
)
Example3: 计算正十进制整数的二进
制表示位数
加法计算次数
A(n) = A(⎣n/2⎦)+1
初始条件
A(1) = 0
A(n) = A(⎣n/2⎦)+1 with A(1) = 0 ÆA(n) ∈Θ(log n)
29
30 2.5 斐波那契数列
Fibonacci’s original question:
Suppose that you are given a newly-born pair of rabbits, one male, one female.
Rabbits are able to mate at the age of one month so that at the end of its second month a female can produce another pair of rabbits. Suppose that our rabbits never die.
Suppose that the female always produces one new pair (one male, one female) every month.
Question : How many pairs will there be in one year? 1. In the beginning: (1 pair)
2. End of month 1: (1 pair) Rabbits are ready to mate.
3. End of month 2: (2 pairs) A new pair of rabbits are born.
4. End of month 3: (3 pairs) A new pair and two old pairs.
5. End of month 4: (5 pairs) ...
6. End of month 5: (8 pairs) ...
7. after 12 months, there will be 233 rabits (image of Leonardo Fibonacci from http://www.math.ethz.ch/fibonacci)
Fibonacci 数列递归关系fib(n):
{0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …}
31
斐波那契数列计算公式斐波那契数列:
0, 1, 1, 2, 3, 5, 8, 13, 21, …
斐波那契递归:
F(n) = F(n-1) + F(n-2)
F(0) = 0
F(1) = 1
带常系数的齐次二阶线性递归递推式:
a X(n) +
b X(n-1) +
c X(n-2) =0
34
求解a X(n) + b X(n-1) + c X(n-2) =0
建立特征方程
ar2+ br+ c=0
and r2
求根r
1
递归的一般求解表达式
if r1 and r2 是两个不相等的实根: X(n) = αr1n + βr2n
if r1 =r2 = r是两个相等的实根: X(n) = αr n + βnr n
利用初始条件求解系数
35
求解斐波那契数列
F(n) = F(n-1) + F(n-2) or F(n) -F(n-1) -F(n-2) = 0特征方程
特征方程的根:
递归的一般求解表达式:
初始条件F(0) =0, F(1)=1:
36
37
黄金分割比
ratio golden as known is 61803.12
51integer nearest the to rounded 5
1)()ˆ(51)251(51)251(51)(≈+==−=−−+=φφφφn n n n n n F n F
斐波那契算法Algorithm 1 fib(n)
if n = 0 then
return (0)
if n = 1then
return (1)
return (fib(n−1) + fib(n−2))三个问题.
1. 算法是否正确?
2. 算法效率如何?
3.有办法改进么?
38
斐波那契算法效率
基本操作的加法次数:
A(n) = A(n-1) + A(n-2) + 1 for n > 1
A(0) = 0, A(1) = 0
A(n) = F(n+1) –1 ∈Θ( φn)
39
非递归的实现算法
我们能改进么?
能,因为在计算过程中存在大量的重复计算. Algorithm 2: fib(n)
comment: Initially we create an array A[0: n] A[0] ←0,A[1] ←1
for i = 2 to n do
A[i] = A[i−1] + A[i−2]
return (A[n])
40
补充:卡西尼悖论请解释该悖论64=65
????
41。

相关文档
最新文档