算法设计基本方法课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析
“好”的算法应当达到以下指标
正确性(Correctness):算法应当满足具体问题的需 求
可读性(Readability):算法是连接数学模型和程序的 桥梁,可读性好有助于人对算法的理解
健壮性(Robustness):算法对于异常情况有充分的考
虑和处理方法
效率高和存储量少:
n指算法规模
算法设计基本方法(2)
归纳法:
通过分析少量特殊情况,找出关系,得到结论
例:搏彩问题
第一期 3 十一 2
二 5 十二 1
三 6 十三 1
四 8 十四 0
五 9 十五 2
六 8 十六 2
七 7 十七 3
八 5 十八 4
九 5 十九 4
十
算3法设计基本二方十法
4
根这据期曲彩线票, 该买买5比几较呢?
好
可见初始的小扰动 |E0|0.51 08迅速积累,误差呈递增走势
造成这种情况的是不稳定的算法 /* unstable algorithm */
我们有责任改变。
公式二:
In 1 n In 1
1 In 1n (1 In )
方法:先估计一个IN ,再反推要求的In ( n << N )。 注 意在e此理(N 公论1式上1)与等公价IN 式。一N11
题 缺点:算法的复杂性与计算顺序有关
算法设计基本方法
算法分析
1. 分析算法的目的 在于:通过对算法的分析,在把算法变成程序实际运行前,
就知道为完成一项任务所设计的算法的好坏,从而运行好的算 法,改进差的算法,避免无益的人力和物力浪费。
算法分析是计算机领域的“古老”而“前沿”的课题。
算法设计基本方法
时间复杂度:指执行算法所需要的计算工作量 算法的工作量=f(n)
空间复杂度:执行算法所需要的内存空间
算法设计基本方法
时间复杂度(1)
平均性态(average
behavior):
最坏情况复杂性
用各种特定输入下的基本 (WorstCase Complexity)
运算次数的带权平均值来 规模在n时,算法所执行的基
??
I* 14
1 14
I
* 13
94 .959424
?!
算法设计基本方法
I 15
1 15
I
14
1423
.3914
!!
考察第n步的误差 E n
|E n | |I n I n * | |( 1 n n 1 ) I ( 1 n n * 1 ) I |n| E n 1 |...n!|E 0|
算法设计基本方法
例:计算 In1 e0 1xnexdx , n0,1,2,... ...
公式一: In1nIn1
I0
1 e
01exdx11e0.63212记0为5I60*
则初始误差 E 0 I0I0 0.51 0 8
注意此公式精 确成立
1 e0 1 x n e 0 d I x n 1 e0 1 x n e 1 d x e1 ( 1 ) n I n n 1 1
算法效率:对F(n-1) 、F(n-2)存在大量的重复计算 改 进:保存中间结果
算法设计基本方法
例 :欧几里得算法 已知两个非负整数a和b,且a>b≥0,求这两个数的最大公
因数。 辗转相除法:若b=0,则a和b的最大公因数等于a;若b>0,
则a和bቤተ መጻሕፍቲ ባይዱ最大公因数等于b和用b除a的余数的最大公因数。 算法 求最大公因数
基本运算:x与数组元素的比较。
算法设计基本方法
平均性态分析:
最坏情况分析: W(n)=max{ti | 1≤i≤n+算法1设计}=基本方n法
如何进行算法分析?
对算法进行全面分析,可分两个阶段进行:
事前分析:求算法的一个时间/空间限界函数,即通过对算
特性
法的“理论”分析,得出关于算法时间和空间
的特征函数(Ο、Ω)——与计算机物理软硬
件没有直接关系。
事后测试:将算法编制成程序后实际放到计算机上运行,
收集其执行时间和空间占用等统计资料,进行
分析判断——直接与物理实现有关。
算法设计基本方法
1)事前分析
目的:试图得出关于算法特性的一种形式描
述(限界函数),以“理论上”衡量算法 的“好坏”。
如何给出反映算法特性的描述?
统计算法中各种运算的执行情况,包括:
BJ
递推
据说,美军 1910 年的一次部队的命令传递是这样的: 营长对值班军官: 明晚大约 8点钟左右,哈雷彗星将可能在这个地区看到,这种彗星
每隔 76年才能看见一次。命令所有士兵着野战服在操场上集合,我将向他们解释 这一罕见的现象。如果下雨的话,就在礼堂集合,我为他们放一部有关彗星的影 片。 值班军官对连长: 根据营长的命令,明晚8点哈雷彗星将在操场上空出现。如果下雨的 话,就让士兵穿着野战服列队前往礼堂,这一罕见的现象将在那里出现。 连长对排长: 根据营长的命令,明晚8点,非凡的哈雷彗星将身穿野战服在礼堂中出现。 如果操场上下雨,营长将下达另一个命令,这种命令每隔76年才会出现一次。 排长对班长: 明晚8点,营长将带着哈雷彗星在礼堂中出现,这是每隔 76年才有的事。 如果下雨的话,营长将命令彗星穿上野战服到操场上去。 班长对士兵: 在明晚8点下雨的时候,著名的76岁哈雷将军将在营长的陪同下身着野战 服,开着他那“彗星”牌汽车,经过操场前往礼堂。
归纳法
特点:适用面广,高效使用,常能解决许多实际问题 适用范围:样本空间有一定规律,多用于预测领域,数
据难以获得的工程计算科学计算等领域 缺点:归纳出的数学模型需要证明,且代码实现不规范 改进方法:常采用不同归纳方法共同求解一个问题 软肋:不能求解样本空间过于零散的问题
算法设计基本方法
算法设计基本方法(3)
else return 1;
}
算法设计基本方法
例:斐波那契(Fibonacci)序列: F0 = F1 = 1 Fi = Fi-1 + Fi-2 (i>1)
算法 求斐波那契数 int F(n) { //返回第n个斐波那契数// int n; if (n<= 1) return(1); else return F(n-1) + F(n-2); }
GCD(int a,int b) // 约定a>b // {
if (b==0) return(a); else return (GCD(b,a % b)); }
例: GCD(22,8) = GCD(8,6) = GCD(6,2) = GCD(2,0) = 2;
算法设计基本方法
递归
特点:结构清晰,可读性强,容易用数学归纳法 证明算法正确性
例 二分检索
二分检索:每次选取中间元素的下标
算法 二分检索
Int BINSRCH(int A[],int n,int x) {
注:
int low,high,mid; low=1; high=n; while (low<=high){
mid = (lowhigh)/2
if(x<A[mid]) high=mid-1;
➢
引用了哪些运算
➢
每种运算被执行的次数
➢
该种运算执行一次所花费的时间等。
算法的执行时间=∑fi*ti
算法设计基本方法
工作量
适用范围:难以用循环或递推直观描述的复杂问 题
缺点:资源耗费多,执行效率低,所以在算法优 化时采用消递归策略
算法设计基本方法
算法设计基本方法(5)
减半递推技术(分治法)
所谓“减半”,是指将问题的规模减半,而问题的 性质不变。所谓“递推”,是指重复“减半”的过 程。
例:二分法求方程实根的减半递推过程(算法及程序见书p13) 首先取给定区间的中点c=(a+b)/2。 然后判断f(c)是否为0。
表1 运行轨迹示例
x=101
x=-14
low high mid low high mid
1
9
5
1
9
5
6
9
7
1
4
2
8
9
811
1
x=82
low high mid
19
5
69
7
8
9
8
9
9
9 2 1 找不到
找到
找到
成功的检索
算法不设计成基功本方的法 检索
成功的检索
递推减半技术
特点:迅速缩小计算规模 适用范围:工程计算,矩阵计算,数值计算中能
度量算法的工作量
本运算的最大次数
A(n)p(x)t(x) xDn
W(n)ma{tx(x)} xDn
由于最坏情况复杂性给出
算法工作量的一个上界,所
算法设计基本方法
以更具实用价值
时间复杂度(2)
例:顺序搜索法的时间复杂度分析(教材p17) 采用顺序搜索法,在长度为n的一维数组中查 找为x的元素。
算法:即从数组的第一个元素开始,逐个与被 查值x进行比较。
若f(c)=0,则说明c即为所求的根,求解过程结束; 如果f(c)≠0,则根据以下原则将原区间减半:
若f(a)f(c)<0,则取原区间的前半部分; 若f(b)f(c)<0,则取原区间的后半部分。 最后判断减半后的区间长度是否已经很小: 若|a-b|<ε,则过程结束,取(a+b)/2为根的近似值; 若|a-b|≥ε,则重复上述的减算半法设过计基程本方。法
What
I* 1
1
1
I* 0
0 .36787944
happened
... ... ... ...
I* 10
1 10
I
* 9
0 .08812800
?!
I* 11
1 11
I
* 10
0 .03059200
I* 12
1 12
I
* 11
0 .63289600
?
I* 13
1 13
I
* 12
7 .2276480
给定一个按非降次序排列 的元素数组A(1:n),n≥1, 判断x是否出现。
•若是,返回当前角标mid
if(x>A[mid])
•若非,返回0,表示没有找
low =mid+1;
到
else
return mid;
}
return 0; }
算法设计基本方法
例:设A(1:9)=(-15,-6,0,7,9,23,54,82,101) 在A中检索x=101,-14,82。执行轨迹见下表1
可取 IN * 1 2 e(N 11)N 1 1 IN
当 N 时 , 算E 法设N 计基 本方法IN IN * 0
取
I
* 15
1 2
1 e 16
1 16
0 .042746233
I
* 14
1 15
(1
I
* 15
)
0 .063816918
I
* 13
1 14
(1
I
* 14
)
0 .066870220
类似例子见教材p8
算法设计基本方法
算法设计基本方法(4)
递归
将一个复杂的问题归结为若干个较简单的问题,然后将 这些较简单的每一个问再归结为更简单的问题,这个过 程可以一直做下去,直到最简单的问题为止。
例: 计算阶乘: n! = n(n1)
int f2act1or,ial0( i!nt=n1) .
We just got lucky?
考察反推一步的误差:
|E N 1|N 1(1 IN )N 1(1 IN *)N 1|E N |
以此类推,对 n < N 有:
|E n|N (N 1)1 . .(n .1)|E N|
误差逐步递减, 这样的算法称为稳定的算法 /* stable algorithm */
I
* 12
1 13
(1
I
* 13
)
0 .071779214
I
* 11
1 12
(1
I
* 12
)
0 .077351732
I
* 10
1 11
(1
I
* 11
)
0 .083877115
.. .. .. ..
I
* 1
1 2
(1
I
* 2
)
0 .36787944
I
* 0
1 1
(1
I
* 1
)
0 .63212056 算法设计基本方法
递推 从已知的初始条件出发,逐次推出所要求的各中间结果和最后结 果 特点:采用递推关系式数学模型,理论正确性得到保证,由于递推关 系式来源于归纳,所以本质上属于归纳法 适用范围:数值计算等工程应用 缺点:需考虑数值计算中稳定性问题,易产生蝴蝶效应 软肋:无递推关系式的问题不可解
算法设计基本方法
NY
{ int i, result; result =1; if ( n > 0 ) { for ( i = 1; i <= n; i++ ) result = result * i ; } /* end if */ return result;
}
int factorial ( int n ) {
if ( n > 0 ) return n * factorial ( n 1 );
够迅速将问题分治的情况
算法设计基本方法
算法设计基本方法(6)
回溯法
通过对问题的分析,找出一个解决问题的线索,然后沿着这 个线索逐步试探,对于每一步的试探,若试探成功,就得到 问题的解,若试探失败,就逐步回退,换别的路线再进行试 探。
例:八皇后问题(教材p15)迷宫问题 实际上是一种图的深度优先遍历的方法 特点:算法效率高,直观清楚 适用范围:适用于解决“是否存在”或者“有多少种可能”问