算法设计与分析_第2章_递归与分治2
算法之2章递归与分治
![算法之2章递归与分治](https://img.taocdn.com/s3/m/40e78a5b647d27284b7351e5.png)
算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。
3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。
(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。
4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
算法设计与分析第2章
![算法设计与分析第2章](https://img.taocdn.com/s3/m/ca75add880eb6294dd886c76.png)
计算F(n-1)所需 乘法次数 计算F(n-1) ×n所需 乘法次数
初始条件(initial condition):停止递归调用的条件 T(0) = 0
• Conquer: 一个划分确定后,A[s]的位置便确定,再 对两个子数组递归地划分 • Combine: 原地排序in-place sort,无需合并
Quicksort(A[l…r]) if l < r s = Partition(A[l…r]) Quicksort(A[l…s-1]) Quicksort(A[s+1…r]) Partition(A[l…r]) p = A[l] //选择第一个元素作为划分基准 i = l; j = r + 1 repeat repeat i = i + 1 until A[i] ≥ p //left-to-right scan repeat j = j - 1 until A[j] ≤ p //right-to-left scan swap(A[i], A[j]) until i ≥ j swap(A[i], A[j]) //undo last swap when i ≥ j swap(A[l], A[j]) return j
二分搜索(Binary Search)
• 给定已按升序排好序的n个元素A[0…n-1],现要在 这n个元素中找出一特定元素k。
– 蛮力算法:遍历、 Tworst(n) =O(n) – 分治法是否适用?
• • • •
算法设计与分析 递归与分治策略
![算法设计与分析 递归与分治策略](https://img.taocdn.com/s3/m/ad15d8e49ec3d5bbfd0a7437.png)
9
2.1 递归的概念
例4 排列问题
递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素, Ri=R-{ri}。去掉元素ri。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列 前加上前缀得到的排列。 R的全排列可归纳定义如下:板
3
计划授课时间:6~8课时
2.1 递归的概念
直接或间接地调用自身的算法称为递归算法 用函数自身给出定义的函数称为递归函数(板) 使用递归技术使算法的描述简洁、易理解。 在实时系统或嵌入系统开发中,建议不使用 递归算法 下面来看几个实例。
4
2.1 递归的概念
例1 阶乘函数(板) 可递归地定义为:高低 1 n0 其中: n! n(n 1)! n 0 n=0时,n!=1为结束条件 n>0时,n!=n(n-1)!为递归方程 结束条件也称为边界条件,这二者是递归函 数的二个要素。 T=1; //递归结束条件为循环初值 递归为递推 for (i=2;i<n+1;i++){T=T*i;} 循环低高
算法设计与分析
第二章 递归与分治策略Fra bibliotek杨圣洪
学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
[工学]算法设计与分析第二章
![[工学]算法设计与分析第二章](https://img.taocdn.com/s3/m/c3999dcd5ef7ba0d4a733b29.png)
递归复杂性的一般形式
• 一般的,递归复杂性可描述为递归方程: 1 n=1 f(n) = af(n ~ b) + D(n) n>1 • 其中,a是子问题个数, ~表示递减方式, b是递减步长, D(n)是合成子问题的开销。 • 通常,递归元的递减方式~有两种: 分治法 1、除法,即n / b,的形式; 递推法 2、减法,即n – b,的形式。
第二章
递归与分治
2018/11/20
计算机算法设计与分析
1
递归的思想
• 递归(Recursion)就是通过把复杂问题分解为 较简单的同一问题来求解。 • 递归求解问题的方法通常有两步: • 第一步是考虑最简单的情况下该问题如何 求解。 • 第二步是考虑该问题的较复杂情况是如何 由较简单的所构成的。 • 由此得出该问题求解的方法。
2018/11/20 计算机算法设计与分析 28
分治法的基本思想
• 将一个规模为n的问题分解为a个规模较小的 子问题,这些子问题互相独立并且与原问题 相同。 • 递归地求解这些子问题问题。 • 然后将各个子问题的解合并在一起,从而得 到原问题的解。 • 影响其时间复杂性的因素是子问题的个数和 合并开销函数,其中较大者起主要作用。
A B C
2018/11/20
计算机算法设计与分析
4
Hanoi塔问题
• 让我们先考虑最简单的情况: • 1、若没有盘子(n=0),自然不需要做任何事情。 • 2、若只有一个盘子,也很容易。直接把它移到B 盘即可。
• 不妨设操作Move(X, Y) 将X柱上的一个盘子(最 顶上的)移到Y柱上。
A B C
GCD(x, y) = y, x, GCD(x – y, y), GCD(x, y – x), x=0 y = 0 最简单 x y 的情况 x < y 有两种
算法分析与设计 分 治 法
![算法分析与设计 分 治 法](https://img.taocdn.com/s3/m/46db2dcfda38376baf1faeba.png)
A ( n ))
I1
I2
如果MAX1和MIN1是I1中的最大和最小 元素,MAX2和 MIN2是I2中的最大和最小元 素, MAX1和MAX2中的大者就是I中的最大元 素MAX, MIN1和不需要 作任何分割直接就可得到其解。
3 3 2
2
迭代i次后 T (n) = 3 T ( n / 4 ) + 3
i i i −1
n / 4 + ... + 3n / 4 + n
i −1 i −1
当n / 4i +1 = 0,(2)不再是递归方程,这 时: T (n) = 3 n / 4 + 3
i i i −1
如果假定所分成的两个问题的输入规模大致相等, 则分治法总的计算时间可用下面的递归关系来表示:
g (n) T (n) = 2T ( n / 2 ) + f ( n )
其中,T(n)是输入规模为n的分治算法时间,g(n)是 对足够小的输入规模能直接计算出答案的时间, f(n)是合并的时间。
递归方程的形式多种多样,求其解的渐近阶的方 法也多种多样。比较实用的有以下五种方法:
I1
I2 I
procedure MERGESORT(low,high) global A[1..n] if low<high then mid← (low+high)/2 //求这个集合的分割点// { MERGESORT(low,mid) //将一个子集合排序// MERGESORT(mid+1,high) //将另一个子集合排序 MERGE(low,mid,high) //归并两个已排序的子集合// } end
算法设计与分析:递归与分治法-实验报告(总8页)
![算法设计与分析:递归与分治法-实验报告(总8页)](https://img.taocdn.com/s3/m/03b7861f2bf90242a8956bec0975f46527d3a7bd.png)
算法设计与分析:递归与分治法-实验报告(总8页)实验目的:掌握递归与分治法的基本思想和应用,学会设计和实现递归算法和分治算法,能够分析和评价算法的时间复杂度和空间复杂度。
实验内容:1.递归算法的设计与实现3.算法的时间复杂度和空间复杂度分析实验步骤:1)递归定义:一个函数或过程,在其定义或实现中,直接或间接地调用自身的方法,被成为递归。
递归算法是一种控制结构,它包含了解决问题的基础情境,也包含了递归处理的情境。
2)递归特点:递归算法具有以下特点:①依赖于递归问题的部分解被划分为若干较小的部分。
②问题的规模可以通过递推式递减,最终递归终止。
③当问题的规模足够小时,可以直接求解。
3)递归实现步骤:①确定函数的定义②确定递归终止条件③确定递归调用的过程4)经典实例:斐波那契数列递推式:f(n) = f(n-1) + f(n-2)int fib(int n) {if (n <= 0)return 0;else}5)优化递归算法:避免重复计算例如,上述斐波那契数列的递归算法会重复计算一些中间结果,影响效率。
可以使用动态规划技术,将算法改为非递归形式。
int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {f1 = f2;使用循环避免递归,重复计算可以大大减少,提高效率。
1)分治算法的定义:将原问题分解成若干个规模较小且类似的子问题,递归求解子问题,然后合并各子问题得到原问题的解。
2)分治算法流程:②将问题分解成若干个规模较小的子问题。
③递归地解决各子问题。
④将各子问题的解合并成原问题的解。
3)分治算法实例:归并排序归并排序是一种基于分治思想的经典排序算法。
排序流程:②分别对各子数组递归进行归并排序。
③将已经排序好的各子数组合并成最终的排序结果。
实现源代码:void mergeSort(int* arr, int left, int right) {if (left >= right)while (i <= mid && j <= right)temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];temp[k++] = arr[i++];1) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。
算法之2章递归与分治
![算法之2章递归与分治](https://img.taocdn.com/s3/m/40e78a5b647d27284b7351e5.png)
算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。
3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。
(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。
4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
第2章 递归与分治策略优秀课件
![第2章 递归与分治策略优秀课件](https://img.taocdn.com/s3/m/8053222a700abb68a882fb2d.png)
以Rk( c ) 记放k个车的不同放法,令R0( c ) = 1 上面的棋盘C的棋盘多项式等于:
R( c )=1+n2x+
(
n
2
)2x2
+……+
(
n
r
)2
+n!xn
但是,我们经常碰到的是不完整的棋盘,这类棋盘 称残缺棋盘。
R( )= 1+X
R(
R ( ) = R ( ) = 1+2X R(
1 2 3 45
a
b c
d
e
(1+3X+X2) (1+4X+3X2)
正交的相乘
R(C)= (1+3X+X2)*(1+4X+3X2) = 1+7X+16X2+13X3+3X4
对照得到: B(0)= 5!- 7*4!+16*3!-13*2!+3*1!+ 0
= 25
这是简单的棋盘多项式能解决的问题,如果 有不正交的情况,我们主要采用下面的方法 进行构造。
) = 1+3X+X2 ) = 1+2X+X2 = (1+X)2
R ( ) = 1+4X+2X2
R(
) = 1+6X+7X2+X3
下面我们看一些应用: example: 在a,b,c,d,e的全排列中,要求a不出现在 第1和第5位,b不出现在第2和第3位,c不出现在 第3和第4位,e不出现在第5位,问:满足这些要 求的全排列有多少?
设所有元素互不相同。在这种情况下,找 出的基准x至少比3(n-5)/10个元素大,因为在 每一组中有2个元素小于本组的中位数,而 n/5个中位数中又有(n-5)/10个小于基准x。同 理,基准x也至少比3(n-5)/10个元素小。而当 n≥75时,3(n-5)/10≥n/4所以按此基准划分所 得的2个子数组的长度都至少缩短1/4。
[理学]算法设计与分析课件 第2章 递归与分治_OK
![[理学]算法设计与分析课件 第2章 递归与分治_OK](https://img.taocdn.com/s3/m/359bd9ff4a7302768f99395b.png)
• 当n>1时,perm(R) 由
(r1)perm(R1) (r2)perm(R2) ………
(rn)perm(Rn)
• 构成。(其中:Ri=R- { ri } )
12 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例5 整数划分问题 • 将一个正整数n表示成形如下式的一系列正整数的和,称为n的一个划分。 • 形如:
2
A(n, 3) 222
A(A(n 1,m),m 1) n,m 1
n
2
A(3, 4) 222
65536
11
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例4 数列的全排列问题
perm(R) • 求n个元素R={r1,r2,…,rn}的全排列
。
• 分析:
• 当n=1时,perm(R)=(r)
第2章 递归与分治策略
• 2.1 递归的概念 • 2.2 分治法的基本思想 • 2.3 分治法的应用 • 本章小结
1 Ó 2005 四川师范大学 计算机科学学院 刘芳
• 嵌套与递归
2.1 递归的概念
2 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例1: 阶乘函数
阶乘函数可递归地定义为:
9
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例3 Ackerman函数
当一个函数及它的一个变量是由函数自身定义时,称这个函 数是双递归函数。
Ackerman函数A(n,m)定义如下:
2
A(n,
m)
1 n
2
A( A(n 1, m), m 1)
n 1, m 0 n 0, m 0 n 2, m 0
算法设计与分析习题第二章分治与递归
![算法设计与分析习题第二章分治与递归](https://img.taocdn.com/s3/m/04080e34eefdc8d376ee322b.png)
2010-12-28
12
2.11 编写针对链表的快速排序程序。
需要保存指针信息。下面给出双向链表的快速排序算法 void fast_sort( Sdata *a, Sdata *f, Sdata *t ) { Sdata *i,*j,k,p; i = f; j = t; if ( t->lnext != f ) { k = a->data; //用于比较的基准数值 i = f; j = t; p = -1; while ( j != i )
7
2.7 按2.2.4节的描述,编写从二叉树中删除一个结点 的C语言程序 二叉树节点删除有三种情况: (1)*p是叶子(即它的孩子数为0):无须连接*p的子树, 只需将*p的双亲*parent中指向*p的指针域置空即可。 (2)*p只有一个孩子*child:只需将*child和*p的双亲直接 连接后,即可删去*p。注意:*p既可能是*parent的左孩 子也可能是其右孩子,而*child可能是*p的左孩子或右孩 子,故共有4种状态。 (3)*p有两个孩子:先令q=p,将被删结点的地址保存在q 中;然后找*q的中序后继*p,并在查找过程中仍用parent 记住*p的双亲位置。*q的中序后继*p一定是 *q的右子树 中最左下的结点,它无左子树。因此,可以将删去*q的 操作转换为删去的*p的操作,即在释放结点*p之前将其 数据复制到*q中,就相当于删去了*q.
算法设计与分析习题
第二章 分治与递归
2010-12-28
1
2.1 对于顺序查找算法,分析目标值存在于数组中的 概率p趋于0的含义,这种情况下平均查找次数有什么 样的变化?当p趋于1时呢? 见教材P12。平均比较次数为 n - p(n-1)/2。 p趋于0,平均次数趋于n;p趋于1时,平均次数趋于 (n+1)/2。(求极限)
算法设计与分析知识点
![算法设计与分析知识点](https://img.taocdn.com/s3/m/4dbe9efd482fb4daa48d4bc7.png)
第一章算法概述1、算法的五个性质:有穷性、确定性、能行性、输入、输出。
2、算法的复杂性取决于:(1)求解问题的规模(N) , (2)具体的输入数据(I),( 3)算法本身的设计(A),C=F(N,I,A。
3、算法的时间复杂度的上界,下界,同阶,低阶的表示。
4、常用算法的设计技术:分治法、动态规划法、贪心法、回溯法和分支界限法。
5、常用的几种数据结构:线性表、树、图。
第二章递归与分治1、递归算法的思想:将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。
递归的时间复杂性可归结为递归方程:1 11= 1T(n) <aT(n—b) + D(n) n> 1其中,a是子问题的个数,b是递减的步长,~表示递减方式,D(n)是合成子问题的开销。
递归元的递减方式~有两种:1、减法,即n -b,的形式。
2、除法,即n / b,的形式。
2、D(n)为常数c:这时,T(n) = 0(n P)。
D(n)为线形函数cn:r O(n) 当a. < b(NT(n) = < Ofnlog^n) "n = blljI O(I1P)二"A bl吋其中.p = log b a oD(n)为幕函数n x:r O(n x) 当a< D(b)II JT{ii) = O(ni1og b n) 'ia = D(b)ll].O(nr)D(b)lHJI:中,p= log b ao考虑下列递归方程:T(1) = 1⑴ T( n) = 4T(n/2) +n⑵ T(n) = 4T(n/2)+n2⑶ T(n) = 4T(n/2)+n3解:方程中均为a = 4,b = 2,其齐次解为n2。
对⑴,T a > b (D(n) = n) /• T(n) = 0(n);对⑵,•/ a = b2 (D(n) = n2) T(n) = O(n2iog n);对⑶,•/ a < b3(D(n) = n3) - T(n) = 0(n3);证明一个算法的正确性需要证明两点:1、算法的部分正确性。
算法设计与分析:第02章 递归与分治策略
![算法设计与分析:第02章 递归与分治策略](https://img.taocdn.com/s3/m/924b3e661ed9ad51f01df27b.png)
但本例中的Ackerman函数却无法找到非递归的定义。
2.1
例3 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(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 。
2.1
递归的概念
例5 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。 例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。
下面来看几个实例。
2.1
递归的概念
边界条件
例1 阶乘函数 阶乘函数可递归地定义为:
n0 1 n! n(n 1)! n 0
递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
《算法设计与分析》课件第2章
![《算法设计与分析》课件第2章](https://img.taocdn.com/s3/m/0b300b480166f5335a8102d276a20029bc64631e.png)
我们可以用递归解决这个问题。其中递归是基于这样的 一个想法:当n=1时,只要将编号为1的圆盘从塔座X直接移 到塔座Z上即可;当n>1时,利用Z作中间塔座,依照上述 规则,将编号为n的圆盘上的n-1个圆盘从塔座X移到塔座Y 上,再将X上编号为n的圆盘直接移到塔座Z上,最后,以X 作中间塔座,将塔座Y上的n-1个圆盘从塔座Y移到塔座Z 上。而对于n-1个圆盘的移动是一个和原问题具有相同特征 的子问题,可用同样方法求解。因此,规模为n的Hanoi塔算 法如下:
HANOI(n,X,Y,Z)
1 if n = 1
2
then MOVE(X,1,Z)
3
else HANOI(n1,X,Z,Y)
4
MOVE(X,n,Z)
5
HANOI(n1,Y,X,Z)
HANOI(n,X,Y,Z)表示将塔座X上编号为1~n的n个 圆盘按照规则移到塔座Z上,以Y作中间塔座。HANOI(n-1, X,Z,Y)表示将塔座X上编号为1~n-1的n-1 个圆盘按照 规则移到塔座Y上,以Z作中间塔座。HANOI(n-1,Y,X, Z) 表示将塔座Y上编号为1~n-1的n-1个圆盘按照 规则移到塔座Z上,以X作中间塔座。MOVE(X,n,Z)表示 将编号为n的圆盘从塔座X移到塔座Z上。
随着由根开始的展开,子问题规模不断下降,最终达到
一个边界条件。当达到边界条件时,结点距根有多远呢?深
度为i的结点,其子问题的规模为n/4i。当n/4i=1或者i=log4n 时,子问题规模达到1,因此树有log4n+1层(0,1,…, log4n)。
现在,我们确定树中每一层的开销。每一层的结点数是 上一层结点数的3倍,因此,第i层的结点数为3i。由于每一 层子问题规模为上一层的1/4,由根向下,深度为i(i=0, 1,…,log4n-1)的每个结点的开销为c(n/4i)2,那么第i层上
算法第二章递归与分治策略小结
![算法第二章递归与分治策略小结](https://img.taocdn.com/s3/m/6d8f7c0b91c69ec3d5bbfd0a79563c1ec5dad710.png)
算法第⼆章递归与分治策略⼩结第2章递归与分治策略2.1.递归的概念递归算法:直接或间接地调⽤⾃⾝的算法递归函数:⽤函数⾃⾝给出定义的函数递归函数的第⼀句⼀定是if语句作为边界条件,然后就是递归⽅程如:阶乘函数的第⼀句就是if条件语句1int factorial(int n){2if( n ==0)3return1;4return n*factorial(n-1);5 }※※※递归函数中⽐较著名的是Hanoi塔问题Hanoi塔问题。
设a,b,c是3个塔座。
开始时,在塔座a上有⼀叠共n个圆盘,这些圆盘⾃下⽽上,由⼤到⼩地叠在⼀起。
各圆盘从⼩到⼤编号为1,2,…,n,现要求将塔座a上的这⼀叠圆盘移到塔座c上,并仍按同样顺序叠置。
在移动圆盘时应遵守以下移动规则:规则1:每次只能移动1个圆盘;规则2:任何时刻都不允许将较⼤的圆盘压在较⼩的圆盘之上;规则3:在满⾜规则1和2的前提下,可将圆盘移⾄a,b,c中任⼀塔座上。
hanoi塔问题题⽬描述1 #include<iostream>2using namespace std;3void move(char p1,char p2){4 cout<<p1<<"->"<<p2<<endl;5 }67//将a上的n个盘⼦经b移动到c上8void hanoi(int n,char a,char b,char c){9if(n == 0) return;//当a上没有盘⼦的时候,直接返回不需要移动10if(n == 1) move(a,c);//当a上只有⼀个盘⼦的时候,直接将盘⼦从a上移动到c上11if(n>1){12 hanoi(n-1,a,c,b);13 move(a,b);14 hanoi(n-1,c,b,a);15 }16 }1718int main(){19char x,y,z;20 x = 'a';21 y = 'b';22 z = 'c';23 hanoi(4,x,y,z);24return0;25 }Hanoi塔2.2分治法的基本思想分治法的基本思想:将⼀个规模为n的问题分解为k个规模较⼩的⼦问题,这些⼦问题相互独⽴且与原问题相同在使⽤分治法设计算法的时候,最好使⼦问题的规模⼤致相同,即将⼀个问题分为⼤⼩相等的k个⼦问题,⼀般情况k取2.※※※分治法中⽐较著名的是划分整数问题1、整数划分问题将⼀个正整数n表⽰为⼀系列正整数之和,n = n1 + n2 +…+nk其中n1≥n2≥…≥nk≥1, k≥1。
计算机算法设计与分析-递归与分治
![计算机算法设计与分析-递归与分治](https://img.taocdn.com/s3/m/0beba013ec630b1c59eef8c75fbfc77da269976e.png)
2023/10/8
计算机算法设计与分析
7
一、递减方式为减法
若~为减法,即n – b,则有:
T(n) = aT(n – b) + D(n)
= a(aT(n – 2b) + D(n – b)) + D(n) =
当a = D(b)时 当a > D(b)时
2023/10/8
计算机算法设计与分析
13
求解递归方程
考虑下列递归方程:T(1) = 1 ⑴T(n) = 4T(n/2) +n ⑵ T(n) = 4T(n/2) +n2 ⑶ T(n) = 4T(n/2) +n3
解:方程中均为a = 4,b = 2,其齐次解为n2。 对⑴, ∵ a > b1 (D(n) = n) ∴ T(n) = O(n2); 对⑵, ∵ a = b2 (D(n) = n2) ∴ T(n) = O(n2logn); 对⑶, ∵ a < b3 (D(n) = n3) ∴ T(n) = O(n3);
{p=0; /*p用于记录每次的进位值*/ for (j=0;j<m;j++)
{q=c[i+j]+a[j]*b[i]+p; c[i+j]=q%10; p=q/10; } c[i+m]=p; if (c[m+n-1]==0) k - -; /*乘积只有m+n-1位*/ return(k); /*以乘积的位数作为函数返回值*/ }
在递归算法的设计中递归元是非常重要的。
2023/10/8
计算机算法设计与分析
《计算机算法设计与分析》第二章 递归与分治策略PPT课件
![《计算机算法设计与分析》第二章 递归与分治策略PPT课件](https://img.taocdn.com/s3/m/03a44be1b307e87100f6962f.png)
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
} 2020/7/31
10
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这
个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
A(1,0) 2
12
例3 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(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)= 2n 。
第2章 递归与分治策略
2020/7/31
1
第一部分
整体概述
THE FIRST PART OF THE OVERALL OVERVIEW, PLEASE SUMMARIZE THE CONTENT
2
学习要点:
理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
T(nn/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
第2章递归与分治策略PPT课件
![第2章递归与分治策略PPT课件](https://img.taocdn.com/s3/m/6251475619e8b8f67d1cb990.png)
算法总体思想
将要求解的较大规模的问题分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则
再划分为k个子问题,如此递归的进行下去,直到问题规模足 够小,很容易求出其解为止。
4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
A(1,0)2
A(0,m)1
m0
A(n,0)n2
n2
A(n,m)A(A(n1,m),m1) n,m1
10
2.1 递归的概念
例3 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(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 。
22 2 2
M=3时,类似的可以推出 n
M=4时,A(n,4)的增长速度非常快,以至于没有适源自当的数学式子来表示这一函数。
11
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下:
(1) q(n,1)=1,n1; 当即最n大1 加 1 数n n 11不大于1时,任何正整数n只有一种划分形式,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T(n)=T(n/4)+2 =T(n/8)+8 =… =T(n/2i)+i n/2i=1时终止分解,有 T(n)=T(1)+log2n =O(log2n)
14
二分搜索技术
输入:非降序排列的n个元素数组a, x; 输出: x所在位置; int BinarySearch(Type a[], const Type& x, int l, int r){ while (r >= l){ 算法复杂度分析: int m = (l+r)/2; 每执行一次while循环, 待 if (x == a[m]) return m; 搜索数组的大小减少一半。 if (x < a[m]) r = m-1; 在最坏情况下,while循环被 else l = m+1; 执行了O(lgn) 次。循环体内 } 运算需要O(1) 时间,因此在 最坏情况下的计算时间复杂 return -1; 15 性为O(lgn) 。 }
平衡(balancing)子问题思想
实践中发现,分治法设计算法时最好使子问题的规 模大致相同。即将一个问题分成大小相等的k个子 问题的处理方法是行之有效的。 几乎总是比子问题规模不等的做法要好。
5
分治法的复杂性分析
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
若x=a[mid],则x在L中的位置就是mid; 如果x<a[mid],由于a是递增排序的,只要在a[mid]的前面查找x; 如果x>a[i],同理只要在a[mid]的后面查找x即可。
无论是在前面还是后面查找x,其方法都和在a中查找x一样, 只不过是查找的规模缩小了。这说明此问题满足分治法的 第二个和第三个适用条件。 10
二分搜索技术
问题:给定已按升序排好序的n个元素a[0:n-1],现要在 这n个元素中找出一特定元素x。 分析:
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
分析: 很显然此问题分解出的子问题相互独立,即在a[i]的前面 或后面查找x是独立的子问题,因此满足分治法的第四 个适用条件。
基本操作时间
设分解阈值n0=1,且adhoc解规模为1的问题耗费1个单位时间。
分:将规模为n的问题分成k个规模为n/m的子问题。 设将原问题divide为k个子问题以及用merge将k个子问 题的解合并为原问题的解需用f(n)个单位时间。
6
分治法的复杂性分析
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
19
Strassen矩阵乘法
传统方法:O(n3) 分治法:
复杂度分析
C11 C12 A11 A12 B11 B12 C B C A A B 22 22 21 3 22 21 21 T(n)=O(n )
Complexity analysis: Totally, 8 multiplications (subproblems), and 4 additions (n/2×n/2×4). T(1)=1, T(n) = 8T( n/2 )+n2. Applying Master Theorem, we have T(n)= O(n3).
注意:
递归方程及其解只给出n等于m的方幂时T(n)的值, 但是如果认为T(n)足够平滑,那么由n等于m的方幂 时T(n)的值可以估计T(n)的增长速度。 通常假定T(n)是单调上升的,从而当mi≤n<mi+1时, T(mi)≤T(n)<T(mi+1)。
8
二分搜索技术
问题:给定已按升序排好序的n个元素a[0:n-1],现要在 这n个元素中找出一特定元素x。 分析: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
分析:如果n=1即只有一个元素,则只要比较这个元素和x就 可以确定x是否在表中。因此这个问题满足分治法的第一个适 用条件 9
二分搜索技术
问题:给定已按升序排好序的n个元素a[0:n-1],现要在 这n个元素中找出一特定元素x。 分析:
分析:比较x和a的中间元素a[mid]
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
给定已按升序排好序的n个元素a[0:n-1], 现要在这n个元素中找出一特定元素x。
Strassen矩阵乘法
A和B的乘积矩阵C中的元素C[i,j]定义为:
传统方法:O(n3)
若依此定义来计算A和B的乘积矩阵C,则每计 算C的一个元素C[i][j],需要做n次乘法和n-1次 加法。因此,算出矩阵C的 n2个元素所需的计算 时间为O(n3)
16
Strassen矩阵乘法
two n×n matrices A and B, Complexity(C=A×B) = ? 传统方法 ........ . .. .......... .......*.. n ........ c .. ***** .......*.. ij cij aik bkj ........ . .. .......... .......*.. k 1 ........ . .. .......... .......*..
2
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
选择分治 法必要条 件,有1.2缺 3条件则选 贪心算法 或动态规 划。
可解性:该问题的规模缩小到一定的程度就可以容 易地解决; 递归性:该问题可以分解为若干个规模较小的相同 问题,即该问题具有最优子结构性质 合并性:利用该问题分解出的子问题的解可以合并 为该问题的解; 独立性:该问题所分解出的各个子问题是相互独立 的,即子问题之间不包含公共的子问题。
算法设计与分析
第2章 递归与分治策略 (2)
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
应用前提, 此特征反 映了递归 思想的应 用
可解性:该问题的规模缩小到一定的程度就可以容 易地解决; 递归性:该问题可以分解为若干个规模较小的相同 问题,即该问题具有最优子结构性质 合并性:利用该问题分解出的子问题的解可以合并 为该问题的解; 独立性:该问题所分解出的各个子问题是相互独立 的,即子问题之间不包含公共的子问题。
3
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
可解性:该问题的规模缩小到一定的程度就可以容 易地解决; 递归性:该问题可以分解为若干个规模较小的相同 问题,即该问题具有最优子结构性质 合并性:利用该问题分解出的子问题的解可以合并 为该问题的解; 独立性:该问题所分解出的各个子问题是相互独立 的,即子问题之间不包含公共的子问题。
这条特征涉及到分治法的效率,如果各子问题是不独立的, 则分治法要做许多不必要的工作,重复地解公共的子问题, 此时虽然也可用分治法,但一般用动态规划较好。
4
分治法的基本步骤
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
用T(n)表示该分治法解规模为|P|=n的问题所需的计算 时间,则) n 1 T ( n) kT (n / m) f (n) n 1
通过迭代法求得方程的解:
T ( n)
logm k n
logm n 1 j 0
k j f (n / m j )
A11 A12 A= ,B= A 21 A 22
B11 B12 , C = B B 21 22
C11 C12 C C 21 22
两个n/2×n/2矩阵 之间的加法
C11=A11B11+A12B21, C12=A11B12+A12B22 C21=A21B11+A22B21, C22=A21B12+A22B22