算法设计与分析PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19
Ω的定义:如果存在正的常数C和自然数N0,使得当nN0时 有f(n)Cg(n),则称函数f(n)当n充分大时下有界,且g(n)是它的 一个下界,记为f(n)=Ω(g(n))。即f(n)的阶不低于g(n)的阶。
θ的定义:定义f(n)=θ(g(n))当且仅当f(n)=O(g(n))且f(n)= Ω(g(n))。此时称f(n)与g(n)同阶。
18
表示算法渐近复杂度的数学符号:
渐近意义下的记号:O、Ω、θ、o 设f(n)和g(n)是定义在正数集上的正函数。
O的定义:如果存在正的常数C和自然数N0,使得当 nN0时有f(n)Cg(n),则称函数f(n)当n充分大时上有界, 且g(n)是它的一个上界,记为f(n)=O(g(n))。即f(n)的阶不 高于g(n)的阶。
A(n,m)的自变量m的每一个值都定义了一个单变量函数:
m=0时,A(n,0)=n+2
m=1时,由A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2(n>1),和 A(1,1)=2,得A(n,1)=2*n
m=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2。n
else {//多元素序列,递归产生排列 for (int i=k; i<=m; i++) {swap(list[k],list[i]); perm(list,k+1,m); swap(list[k],list[i]); } }
}
1,
n1
T(n)nT(n1),n1
32
例. 产生123的所有排列
层次 栈状态 (i, k, m)
α(n)在复杂度分析中常遇到。对于通常所见到的正 整数n,有α(n)≤4。但在理论上α(n)没有上界,随 着n的增加,它以难以想象的慢速度趋向正无穷大 。
A(4,4) 2 22
6553个 6
30
例4 排列的生成问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R\{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀ri得到的排列。R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
31
perm( list[], int k, int m) {//产生前缀是list[0:k-1],后缀是 list[k:m]的所有排列
//perm(list,0,n-1)产生 list[0: n-1]的去全排列
if (k==m) {//单元素排列 for (int i=0; i<=m; i++) cout << list[i]; cout << endl; }
根据O的定义,容易证明它有如下运算规则: (1)O(f)+O(g)=O(max(f,g)); (2)O(f)+O(g)=O(f+g); (3)O(f)O(g)=O(fg); (4)如果g=O(f),则O(f)+O(g)=O(f); (5)O(Cf)=O(f),其中C是一个正的常数; (6)f=O(f)。
算法设计与分析
课程目的
对算法设计与分析进行一个较为全面的 介绍,使大家具有进行简单的算法设计 与分析的基本能力
先修课程
程序设计语言 数据结构 高等数学
离散数学 概率论
2
主要内容介绍
第1章 第2章 第3章 第4章 第5章 第6章 第7章 第8章
算法引论 递归与分治策略 动态规划 贪心算法 回溯法 分支限界法 概率算法 NP完全性理论
T(n)=T(n-1)+1, T(n)=O(n)
23
阶乘函数可以找到相应的非递归方式定义:
n ! 1 2 3 (n 1 )n
factorial(int n) { int i,p=1;
for (i=1;i<=n;i++) p=p*i; return p; }
循环n次,故 T(n)=n
24
例2 Fibonacci数列
{
T(n)=?
if (n <= 1) return 1;
else return fibonacci(n-1)+fibonacci(n-2);
}
26
Fibonacci函数也可以找到相应的非递归方式定义: 生成函数法!
F(n)15125n1125n1
27
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这
o的定义:对于任意给定的ε>0,都存在正整数N0,使得 当n N0时有f(n)/g(n)ε,则称函数f(n)当n充分大时的阶比g(n)低, 记为f(n)=o(g(n))。
例如,4nlogn+7=o(3n2+4nlogn+7)。
20
第2章 递归与分治策略
凡治众如治寡,分数是也。 ----孙子兵法
21
22
下面来看几个实例:
例1 阶乘函数 阶乘函数可递归地定义为:
边界条件
n!n(n11)!
n0 n0
递归方程
边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
factorial(int n) { if (n = 0) return 1;
else return factorial(n-1); }
5
D. E. Knuth
The Art of Computer Programming, Vol.
1 and 3, Third Edition, Addison Wesley, 1997.
6
第1章 算法引论
1.1 算法与程序
一. 算法在计算机科学中的重要地位 程序=算法+数据结构
7
二. 算法的基本概念
2,0,2
312
输出
312
2
2,1,2 2,0,2
312
,2,2
3 2,1,2
2,0,2
321
321
2
2,1,2 2,0,2
321
1 2,0,2 3 2 1
0 栈空
321
34
Leabharlann Baidu5 整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。
T(n,I*)
T(n)
tiei(n,I*)
i1
渐近时间复杂度:
算法共有k种基本步骤,
n→∞时,T(n)的主要部分
第i种步骤所需时间ti, 出现次数ei.
平均情况下的时间复杂性:
k
Tav(n g) P(I)T(n,I)P(I)tiei(n,I)
I D n
IDn
i1
15
算法复杂度的重要性
假设计算机每秒可作1000次基本运算
(通常,让A隐含在复杂性函数名当中)
14
设Dn是规模为n的合法输入的集合;I*是Dn中使T(n, I*)达到 Tmax(n)的合法输入;而P(I)是在算法的应用中出现输入I的概率。 则:
最坏情况下的时间复杂度:
用问题体积n表示的运行时 间T(n)称为时间复杂度
k
Tma(n x)m I D nT a(n x,I)
m=3时,类似的可以推出A(n,3) 2 222
n个
m=4时,A(n,4)的增长速度非常快,以至于没有适当的数学式子 来表示这一函数。
29
定义单变量的Ackerman函数A(n)为,A(n)=A(n, n)。
定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。 即α(n)是使n≤A(k)成立的最小的k值。
(1)求余数:用m除以n,得余数r(0≤r﹤n)。 (2) 判断余数:若余数r=0,输出n,结束。
否则,转(3)。 (3)更新被除数和除数:m←n,n←r,转(1)。
9
解二.
开始
输入m、n
r=m%n
r=0?


m←n,n←r
输出n
10
解三.
Euclid(int m, int n) { int r; while(n!=0)
算法复杂性是算法运行所需要的计算机资源的量, 需要时间资源的量称为时间复杂性,需要的空间资源的 量称为空间复杂性。这个量应该只依赖于算法要解的问 题的规模、算法的输入和算法本身的函数。如果分别用 n、I和A表示算法要解问题的规模、算法的输入和算法 本身,而且用C表示复杂性,那么,应该有C=F(n,I,A)。 一般把时间复杂性和空间复杂性分开,并分别用T和S来 表示,则有: T=T(n,I)和S=S(n,I) 。
16
有效算法 最佳算法 计算问题的分类
1.无法写出算法的问题. 2.有多项式算法的问题. 3.介于上述两问题之间的问题.
17
例 求 P n(x)a nxna n 1xn 1 a 1xa 0 之值 解 用最直观的方法
T (n ) (n n 1 2 1 ) n (n 1 ) 2
用Horner算法
2
1,1,2 1,0,2
,2,2
3 1,1,2
1,0,2
数组
213 213
2
2,1,2 1,0,2
231
,2,2
3 2,1,2
1,0,2
231
2,1,2
2 1,0,2
213
输出
213 231
1 2,0,2 2 1 3
2
1,1,2 2,0,2
312
33
层次 栈状态 (i, k, m)
数组
,2,2
3 1,1,2
2.1 递归的概念
直接或间接地调用自身的较小模式的算法称为 递归算法。
用函数自身的较小模式给出其定义的函数称为 递归函数。
由分治法产生的子问题往往是原问题的较小模 式,子问题的复杂度也原问题复杂度的较小模 式,这就为使用递归技术进行算法分析提供了 方便。
分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
1.定义. 一个有穷规则的有序集合称为一个算法。
2.算法的特征.
输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:算法中每条指令的执行次数有限。 可行性:执行每条指令的时间也有限。
8
例. 求正整数m、n的最大公因数。 解一.
{ r=m%n; m=n; n=r; }
printf(“%d”, m) }
11
3.算法的描述方法.
(1)自然语言 (2)流程图 (3)程序设计语言
12
三. 算法设计与分析的步骤
1.问题的描述. 2.模型的选择. 3.算法设计和正确性证明. 4.算法的分析. 5.算法的实现.
13
1.2 算法复杂性分析
数组
输出
1 0,0,2 1 2 3
2
1,1,2 0,0,2
123
,2,2
3 1,1,2 1 2 3 1 2 3
0,0,2
2
2,1,2 0,0,2 1 3 2
,2,2
3 2,1,2 1 3 2 1 3 2
0,0,2
2
2,1,2 0,0,2
123
1 1,0,2 2 1 3
层次 栈状态 (i, k, m)
P n ( x ) ( ( ( a n x ( a n 1 ) ( a n 2 ) x a n 3 ) ) x a 1 ) x a 0
T(n)n
Horner(int a[n+1],real x) { int p= a[n];
for (i=1;i<=n;i++) p=p*x+a[n-i]; return p; }
个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
A(1,0)2
A(0,m)1
A(n,0)n2
m0 n2
A(n,m)A(A(n1,m),m1) n,m1
Ackerman函数无法找到非递归的定义。
28
Ackerman函数
A(1,0)2
A(0,m)1
A(n,0)n2
m0 n2
A(n,m)A(A(n1,m),m1) n,m1
Illustration
25
Fibonacci数列的前10项为1,1,2,3,5,8,13,21, 34,55,…,它可以递归地定义为:
1
n0
F(n)
1
n1
F(n1)F(n2) n1
边界条件 递归方程
第n个Fibonacci数可递归地计算如下:
fibonacci(int n)
T(n)=T(n-1)+T(n-2),
3
教学用书
王晓东
算法设计与分析
清华大学出版社
4
教学参考书
T. Cormen, C. Leiserson, R. Rivest, and C. Stein
Introduction to Algorithms, 2nd Ed.
MIT Press and McGraw-Hill Book Company, 2001
相关文档
最新文档