版第二讲分治策略不可更改

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

2.1 分治算法的基本思想
分治算法的基本思想是将一个规模为n的问题 分解为a个规模较小的子问题,这些子问题互 相独立且与原问题相同。递归地解这些子问题, 然后将各个子问题的解合并得到原问题的解。
PPT文档演模板
4
版第二讲分治策略不可更改
分治算法所能解决问题一般具有以下几个特征:
缩小问题规模可以降低解决问题的难度; 可以将子问题的解合并为原问题解; 问题分解出的各个子问题是相互独立的,即子问题之间 不包含公共的子问题。
❖ 现在,我们来计算一下,有多少个叶节点。第1层
有3个节点,第2层有32个节点,依次类推,第k层有
3k个节点,当k=log4n,即为叶节点,因此,叶节点
的个数为
,而每个叶节点需要的时
间为T(1),因此,整个叶节点的时间为

PPT文档演模板
14
版第二讲分治策略不可更改
将递归树每一层的时间累加,可得:
题 return merge(y1,...,ya); //合并为原问题的解
}
PPT文档演模板
6
版第二讲分治策略不可更改
分治算法的复杂性分析
一个分治算法将规模为n的问题分成a个规模为 n规/模b为的1子的问问题题。耗设费分1个解单阈位值时n0间=。1,再且设a将dh原oc问解 题分解为a个子问题以及用merge将a个子问题 的解合并为原问题的解需用f(n)个单位时间。 用T(n)表示该分治算法解规模为|P|=n的问题 所需的计算时间,则有下列递归方程:
PPT文档演模板
31
版第二讲分治策略不可更改
void perm(int[] r, int i, int n) { // r存放R集合元素,r[0]~r[n] // i,n 表示目前求解的全排列起始与终止位置 if (只有一个元素){ //递归边界条件 显示当前排列; } else { 依次将i ~ n 之间的每个元素交换 //递归到第i 个位置,并用同样的方法 (递归)求解i+1~n 之间的全排列 }
i=0
所以,由递归树猜测T(n)=O(n2)随后,再利用数 学归纳法证明。
PPT文档演模板
15
版第二讲分治策略不可更改
公式法
其中,a≥1,b>1是常数,f(n)是一个渐进函 数,描述划分问题与合并解的时间复杂性。 n/b可以是 ,也可以是
上述方程描述了如下算法的运行时间:将一个规模为n的问题 划分为a个规模为n/b的子问题,其中a和b为正常数。分别递归 地解决a个子问题,解每个子问题所需时间为T(n/b)。划分原问 题和合并子问题的解所需要的时间由f(n)决定
分治算法
递归技术
分治与递归像一对孪生兄弟
直接或间接地调用自身的算法称为递归算法。
在定义函数时调用到函数自身称为递归函数。
分治算法递归技术
PPT文档演模板
21
版第二讲分治策略不可更改
递归应用举例1: Fibonacci数列
无穷2阶数列1,1,2,3,5,8,13,21,34, 55,…,被称为Fibonacci数列。递归定义为:
1.需要先考虑P[m],如果能够求出剩余元P[m+1] 、P[m+2] 、…,P[n] 的所有排列,我们只需将P[m]放到每个排列的开头。
2.然后考虑P[m+1],通过交换P[m]和P[m+1],这样我们仍然只要考虑求剩 余元素P[m+1] 、P[m+2],… P[n]的所有排列即可。
3.然后依次考虑P[m+3],…,P[n]。
PPT文档演模板
16
版第二讲分治策略不可更改
定理:上述递归方程含有三种情形的渐进界:
(1)对于某个常数
如果

(2)如果

(3)对某个常数
如果
且对某个常数 c <1 以及任意足够大的
n,
PPT文档演模板
17
版第二讲分治策略不可更改
定理含义
将f(n)与 进行比较,
当 较大时,
相等时
当 较小时,
结论:可以通过尽量减少子问题的个数 或者减少f(n)的数量级来增强分治算法的 有效性。
4.当问题规模降为求一个元素P[m]的全排列时,问题就极为简单,可作为 递归出口。
5.值得注意的是,将P[m]和某个P[k]交换,求出剩余元素的所有排列后,为 了避免重复,发生混乱,必须将P[m] 和P[k]交换回去,然后才能继续P[m] 和P[K+1]的交换。
PPT文档演模板
30
版第二讲分治策略不可更改
直到将n放在p[n]位置上,并用p[1..n-1]产生n-1个 元素的全排列。
元素放置位置:p[1]~p[n]
PPT文档演模板
34
版第二讲分治策略不可更改
321, 312, 231, 132, 213, 123
PPT文档演模板
35
版第二讲分治策略不可更改
void perm2(int p[], int n) { // n = NUM-1 // p[1]~p[n]放置元素,初始为0, // n为当前参与排列的元素数量, 1,2,3,……, n if (参与排列的数据数量为0) { 输出结果 } else { 依次将n放在每个位置, 并采用同样的方法求解另外n-1元素的全排列; } }
(XX0518版第二讲_分治 策略-不可更改
PPT文档演模板
2020/11/21
版第二讲分治策略不可更改
算法总体思想
将一个难以直接解决的规模较大的问题分解 为若干个规模较小的子问题,并各个击破,分 而治之。
n
n/4
n/4
n/4
n/4
n/16 n/16 n/16 n/16 n/16 n/16 n/16 n/16 n/16 n/16 n/16
≤2(c(n/2)lg(n/2))+n ≤cnlg(n/2)+n ≤cnlgn-cnlg2+n = cnlgn-cn+n 当c≥1时,显然cnlgn-cn+n ≤cnlgn 根据O符号定义,证明猜测正确。
PPT文档演模板
10
版第二讲分治策略不可更改
递归树方法
❖递归树可以方便地推测递归方程的解,是描述分治算法 的运行时间复杂性的有效手段。
PPT文档演模板
5
版第二讲分治策略不可更改
分治算法的算法框架
divide-and-conquer(P){ if ( | P | <= n0) adhoc(P); //解决规模小的问题 //将问题P 分解为子问题P1,P2,...,Pa; for (i=1,i<=a,i++) yi=divide-and-conquer(Pi);//递归的求解各子问
n/16 n/16 n/16 n/16 n/16
PPT文档演模板
2
版第ห้องสมุดไป่ตู้讲分治策略不可更改
将求出的较小规模的问题解合并成一个较
大规模的问题解,并自底向上地求出原问
题的解。
最顶层问题
a 为分解的子问题数量; n/b 为每个子问题的数据规模; f(n) 为合并子问题解所消耗的时间。
PPT文档演模板
3
版第二讲分治策略不可更改
例2:T(n) = T(2n/3)+1 由上式可知a=1, b=3/2, f(n)=1, 且 又因为 满足定理(2),因此
PPT文档演模板
20
版第二讲分治策略不可更改
2.2 递归概念
分治算法的特征:将较大规模的问题分解为若 干个较小规模的子问题,每个子问题的求解过 程与原问题一样,并利用自底向上的求解策略 得到最终的解。
通过求解递归方程得到递归算法的时间复杂性。
PPT文档演模板
7
版第二讲分治策略不可更改
求解递归方程的三种方法: ❖替换方法 ❖递归树方法 ❖公式法
PPT文档演模板
8
版第二讲分治策略不可更改
替换方法
❖替换方法的主要思想是首先推测出递归方程 的解 ,然后代入递归方程,查看是否满足条件。
❖ 替换方法解递归方程的基本步骤: ① 猜测出递归解的形式 ② 用数学归纳法找出使解真正有效的常数
log4n+1
PPT文档演模板
nlog4 3
13
O(nlog4 3 )
版第二讲分治策略不可更改
递归树总共有多少层?当递归树展开一层,其规模 为n/4,当递归树展开到第2层时,其规模为 n/16=n/42,依次类推,当展开到第k层时,其规 模为n/4k=1时,不再展开,由此可以求得递归树 的层数为k=log4n。
33
PPT文档演模板
版第二讲分治策略不可更改
方法2:固定元素找位置
在n-1 个元素的全排列基础上,将某个元素插入到 每个位置上,进而得出n 个元素的全排列。
基本过程: ① 将n放在p[1]位置上,并用p[2..n]产生n-1个元素的全排列; ② 将n放在p[2]位置上,并用p[1]和p[3..n]产生n-1个元素 的全排列; ③ 将n放在p[3]位置上,并用p[1..2]和p[4..n]产生n-1个 元素的全排列; ...........
❖适用比较容易猜出递归解的情形。
PPT文档演模板
9
版第二讲分治策略不可更改
例:T(n)=2T(n/2)+n (2路归并)
v 猜测出解为T(n)=O(nlgn) v 证明存在某个常数c,使得T(n) ≤cnlgn
数学归纳法:
假设解对n/2成立,即T(n/2) ≤c(n/2)lg(n/2) 将其对递归方程进行替换,得: T(n)= 2T(n/2)+n
m=3A时(n,,m类) =似A的(A可(n以-1,m推)出,m-1) n,m≥1
PPT文档演模板
24
版第二讲分治策略不可更改
递归应用举例3: 排列问题
求解n个元素{r1,r2,…,rn}的全排列。 n个元素的全排列有n!种可能。 解题基本方法: (1)固定位置放元素 (2)固定元素找位置
PPT文档演模板
PPT文档演模板
26
版第二讲分治策略不可更改
递归公式
PPT文档演模板
27
版第二讲分治策略不可更改
PPT文档演模板
28
版第二讲分治策略不可更改
思路?
PPT文档演模板
举例,0~3共4个数值的全排列
29
将每个元素交换 到固定位置上, 并求解其余位置 元素的全排列。
版第二讲分治策略不可更改
假设: 要求P[m] 、P[m+1] 、… P[n]的全排列:
❖用递归树方法求解递归方程的基本步骤:
① 利用递归树推测出一个解 ② 利用替换方法进行证明
❖ 构造递归树的方法就是展开递归方程,然后将树 中每层的时间求和,最终获得算法的时间复杂性。
PPT文档演模板
11
版第二讲分治策略不可更改
例:T(n)=3T(n/4)+cn2
T(n) →
PPT文档演模板
12
版第二讲分治策略不可更改
25
版第二讲分治策略不可更改
方法1:固定位置找元素
假设R={r1,r2,…,rn}是待排列的n个元素,Ri=R-{ri}。 假设集合Ri中元素的全排列记为perm(Ri)。 (ri)perm(Ri)表示在全排列perm(Ri)的每一个排列的第一 个位置加前缀ri得到的排列。
当n=1时,perm(R)=(r) 其中r是集合R中唯一的元素; 当n>1时,perm(R)的全排列为: (r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)
边界条件
递归方程
边界条件与递归方程是递归函数的二要素。
PPT文档演模板
22
版第二讲分治策略不可更改
递归应用举例2: Ackerman函数
A(1,0) = 2
A(0,m) = 1
m≥0
A(n,0) = n + 2
n≥2
A(n,m) = A(A(n-1,m),m-1) n,m≥1
PPT文档演模板
23
版第二讲分治策略不可更改
从定理中可以看出,公式法只要记住三种情形, 就可以很容易地确定许多递归方程的解。
PPT文档演模板
18
版第二讲分治策略不可更改
例1:T(n)=9T(n/3)+n 由上式可知,a = 9,b = 3,f(n) = n, 且 又因为对于 有 满足定理(1),因此,
PPT文档演模板
19
版第二讲分治策略不可更改
}
PPT文档演模板
32
版第二讲分治策略不可更改
void perm(int r[], int i, int n) { if ( i == n ) { // 只有一个数值 for (int j = 0; j <= n; j++) {
// 输出结果 cout<<r[j]; } cout<<endl; } else { for (int j = i; j <= n; j++) { swap(r, i, j); // 交换r[i]与r[j] perm(r, i + 1, n); // 计算i+1~ n 全排列 swap(r, i, j); // 交换r[i]与r[j] } } }
Ackerman函数的特征: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, A(1,1)=2 可以得出A(n,1)=2*n
m=2时A(,1,A0)(n=,22)=A(A(n-1,2),1)=2A(n-1,2), A(0A,(m1,)2=)=1A(A(0,2),1)=A(1m,1)≥=02 A(可n,0以)得=出n A+(2n,2)= 2n 。 n≥2
相关文档
最新文档