第1章 算法概述

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

二、算法的性质
举例:求一个数a的平方根 ①对x赋初值x0 ②判断一下,如果|x2-a|﹤ε(足够小),转④ ③使x=(x+a/x)/2,然后转② ④输出x
理论基础———牛顿-拉夫逊法是一种求解非线性方程的 数值解法,由于便于编写程序用计算机求解,应用较广。
1.1 算法与程序
二、算法的性质
(1)输入:有0个或多个外部提供的量作为算法的输入。
对所有n,f(n) 0,g(n) 0
(1)渐近上界记号O O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0 有:0 f(n) cg(n) },则称f(n)当n充分大且有上界, g(n)是它的一个上界。记为: f(n)= O(g(n)) ,即f(n)的 阶不高于g(n) 的阶 例: 8/3* n2 = O(n2) 2/3* n2 = O(250n2)= O(n2) n*(n-1)/2= O(n2) 6n6+3n3-9= O(6n6) = O(n6)
size ( I ) n
p(I )T (I )
其中I是问题的规模为n的实例,p(I)是实 例I出现的概率。
例:顺序查找 解题思路:j=1 while(j<=n&&L[j]!=x) do j++; if(j>n) then j=0 output j
设x在L[n]中的概率是q, x在各个L[k]中的 在表中的概率为1-q 概率相等q/n, 不

例如:设T(n)=3n2+4nlogn+7 是算法A的复杂性函数 t(n)=3n2 T(n)渐近于t(n)吗?
as n
(T(n) - t(n) )/ T(n)=4nlogn+7/ 3n2+4nlogn+7 0 当n趋近无穷时, T(n)渐近于t(n),所以可以用t(n)替 代T(n)作为算法A在n趋近于无穷时的时间复杂性的度 量。
1.2 算法复杂性分析
算法的时间复杂性

(1)最坏情况下的时间复杂性
Tmax(n) = max{ T(I) | size(I)=n } (2)最好情况下的时间复杂性 Tmin(n) = min{ T(I) | size(I)=n } (3)平均情况下的时间复杂性 Tavg(n) =
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令是清晰,无歧义的。
(4)有限性:算法
的执行次数Fra Baidu bibliotek有限的,执行每条指令的
时间也是有限的。
(5)可行性:算法中的所有运算都是基本的,原则
上它们都
能够精确地进行,而且进行有穷次即可完成。
1.1 算法与程序
三、算法的形式化表示
计算机算法设计与分析(第3版) 王晓东 编著 电子工业出版社
第一章 算法概述
学习要点:

理解算法的概念。 理解什么是程序,程序与算法的区别和内在联系。 掌握算法的计算复杂性概念。 掌握算法渐近复杂性的数学表述。 掌握用C++语言描述算法的方法。
程序: 计算机指令的序列
算法设计
行为特性设计----处理数据的步骤设计 程序设计 结构性设计----对输入输出数据存储结构的设计
p n p(n 1) i n1 p n(1 p) n i 1 2
算法分析的基本法则
非递归算法:
(1)for / while 循环 循环体内计算时间*循环次数; (2)嵌套循环 循环体内计算时间*所有循环次数; (3)顺序语句
各语句计算时间相加;
(4)if-else语句
程序=数据结构+算法
分析算法 设计程序
程序正确性证明

算法理论正确,但设计出的算法并不正确
B=-1012 C=1,计算A+B+C的值
例1:已知A=1012
计算方法有两个:A+B+C=1
A+C+B=0
出现上述情况原因:使用工具只能表示七位,即计算机的 精度问题
例2:求解方程x2-(1015+1)*x+1015=0的根
算法是一个四元组(Q、I、Ω 、f ) Q 是一个集合,表示计算的状态 I 是Q的一个子集,表示计算的输入 Ω 是Q的一个子集,表示计算的输出 f 是Q到它自身的一个映射,表示计算的规则
1.1 算法与程序
四、程序 (Program)与算法区别和联系


程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)。
例如操作系统,是一个在无限循环中执行的程序,因
而不是一个算法。

操作系统的各种任务可看成是单独的问题,每一个问 题由操作系统中的一个子程序通过特定的算法来实现。 该子程序得到输出结果后便终止。
1.1 算法与程序
问题求解(Problem Solving)
理解问题 精确解或近似解 选择数据结构 算法设计策略 设计算法 证明正确性
(1)Tmax(n) = max{ T(I) | size(I)=n }=O(n)
(2)Tmin(n) = min{ T(I) | size(I)=n }=O(1)
template<class Type> { for(int i=0;i<n;i++) if (a[i]==x) return i;
(3)Tavg(n) = p( I )T ( I )
1.2 算法复杂性分析
利用某一算法处理一个问题尺度为n的输入所需的时间, 称为该算法的时间复杂性。记为T(n) 当问题的尺度递增时,时间复杂性的极限称为渐进时间 复杂性。
T(n) , as n ; (T(n) - t(n) )/ T(n) 0 ,as n; t(n)是T(n)的渐近性态,为算法的渐近复杂性。 在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低 阶项留下的主项。它比T(n) 简单。
数据结构设计
程序=算法+数据结构
1.1 算法与程序
定义:

算法是指解决问题的一种方法或一个过程。 算法是若干指令的有穷序列,其中每一条指令 表示一个或多个操作 。

算法是求解一个问题类的无二义性的有穷过程。
算法设计的任务是对各类具体问题设计良好的算法 及研究设计算法的规律和方法。常用的算法有:穷 举搜索法、递归法、回溯法、贪心法、分治法等。
I20 = 0.423988*108
??
1.2 算法复杂性分析

算法复杂性 = 算法所需要的计算机资源 1、算法的时间复杂性T(n) ; 指执行算法所需计算工作量 2、算法的空间复杂性S(n)。 指执行算法所需的内存空间

其中n是问题的规模(输入大小), T(n) 指基本运算次
数(假设基本运算所需时间均为单位时间)
1.2 算法复杂性分析
一般地,对于足够大的n,常用的时间复杂性存在以下顺序:
O(1)< O(logn)< O(n)< O(n*logn)<O(n2)<O(n3)… <O(2n)<O(3n)<…<O(n!)
典型的计算时间函数的增长情况

小规模数据
中等规模数据
1.3 算法分析方法

例1:顺序搜索算法
if语句计算时间和else语句计算时间的较大者。
例2 template<class Type> void insertion_sort(Type *a, int n) { Type key; // cost times for (int i = 1; i < n; i++){ // c1 n key=a[i]; // c2 n-1 int j=i-1; // c3 n-1 while( j>=0 && a[j]>key ){ // c4 sum of ti a[j+1]=a[j]; // c5 sum of (ti-1) j--; // c6 sum of (ti-1) } a[j+1]=key; // c7 n-1 } n 1 n 1 n 1 } T (n) c1n c2 (n 1) c3 (n 1) c4 ti c5 (ti 1) c6 (t i 1) c7 (n 1)
size ( I ) n
int seqSearch(Type *a, int n, int x)
在平均情况下,假设: (a) 搜索成功的概率为p ( 0 p 1 );
return -1;
}
(b) 在数组的每个位置i ( 0 i < n )搜索成功
的概率相同,均为 p/n。
要求:求出最坏、最好和平均情况下的时间复杂度?
n(n 1) ( i 1 ) 1 2 i 1
n 1
i
i 1
n 1
n(n 1) 2
输入数据a[i]=n-i, i=0,1,…,n-1
Tmax (n) c1n c2 (n 1) c3 (n 1) n(n 1) n(n 1) n(n 1) c4 1 c5 c 6 c7 (n 1) 2 2 2 c c c c c c 4 5 6 n 2 c1 c2 c3 4 5 6 c7 n (c2 c3 c4 c7 ) 2 2 O(n 2 )

Tmax(n) =n Tmin(n) =1
size ( I ) n
容易求出
Tavg (n)
p(I )T (I )
1、基本运算
2、问题规模
Tavg (n)
size ( I ) n
p(I )T (I )
p p p p 1 2 3 n n 1 p n n n n
A=1 B= 1015+1
D=SQRT(B*B-4*A*C) X =(-B+D)/(2*A) 1 X =(-B-D)(2*A) 2
C= 1015
输出结果:x1=
2
1015
避免两个大数相减 避免小的数做除数
X =0
改进算法:使用韦达定理
X2=C/(2*X1)
例3:求In=∫0 1 xn /(x+5) dx, n=0,1,2,….,20
i 1 i 1 i 1
T (n) c1n c2 (n 1) c3 (n 1) c4 t i c5 (t i 1) c6 (t i 1) c7 (n 1)
i 1 i 1 i 1
n 1
n 1
n 1
1、在最好情况下,ti=1, for 1 i <n;
T(L[i])=i Tavg(n)=
i ∈[1…n]
T(L[i])=n i>n
size ( I ) n
p(I )T (I )
=1
=(n+1)/2
Tmax(n) Tmin(n)
= max{ T(I) | size(I)=n } =n
1.2 算法复杂性分析
例:求n阶行列式的值 一个n阶行列式应该做n!(n-1)次乘法。若每个乘法运算的 时间是10-6 s,则求n阶行列式之所用的时间为 T(n)=n!*(n-1)*10 -6 s 当n=10时,T(10)=32.65s 当n=50时,T(50)=4.7*1052y(年) 当问题的规模越来越大时,求解它所需要的时间和空间 的增长率,也就是把时间和空间的增长率作为衡量算法的标 准。
Tmin (n) c1n c2 (n 1) c3 (n 1) c4 (n 1) c7 (n 1)
(c1 c2 c3 c4 c7 )n (c2 c3 c4 c7 ) O(n)
2、在最坏情况下,ti i+1, for 1 i <n;
根据理论推导,导出递推公式 In+5*In-1 =1/n => In =1/n-5 *In-1 问题就出在这里 I0=∫ 0 1 1/(x+5)dx= ㏑6/5=0.182322 I1=1-5*I0 I2=1/2-5*I1 ………,I20=1/20-5*I19
计算机得出结果:I0=0.182322 I1=0.883900*10-1 ………………….. I19 = -0.847975*107
总结:简化算法复杂性分析方法步骤 前提—只考察当问题的规模充分大时情况 1、求出算法的复杂性函数--一般从最坏角度 2、简化算法复杂性函数--求出渐进复杂性 忽略次要项,只考虑最高阶,且不必关心 常数因子; 设所有不同的元运算各执行一次所需时间 都是单位时间

如果对某一常数C,一个算法在时间Cn2内 能处理尺度为n的输入,则称此算法的时间 复杂性是O(n2)。
相关文档
最新文档