《算法设计与分析》-第二章 递归与分治

合集下载

算法之2章递归与分治

算法之2章递归与分治

算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式: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章
• 把n看作算法的输入规模 • 算法的基本操作是乘法,其运行时间(或执行次数)为 T(n),其递归关系式(recurrence relations,或称递归方程) T(n) = T(n - 1) + O(1), n>0
计算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) – 分治法是否适用?
• • • •

算法设计与分析实验指导1_分治与递归

算法设计与分析实验指导1_分治与递归

《算法设计与分析》实验指导实验一分治与递归一、实验目的:1. 理解递归的概念。

2. 掌握设计有效算法的分治策略。

3. 掌握C++面向对象编程方法。

二、实验指导1. 分治法的总体思想求解一个复杂问题可以将其分解成若干个子问题,子问题还可以进一步分解成更小的问题,直到分解所得的小问题是一些基本问题,并且其求解方法是已知的,可以直接求解为止。

分治法作为一种算法设计策略,要求分解所得的子问题是同类问题,并要求原问题的解可以通过组合子问题的解来获取。

分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效的算法。

2. 分治法的基本步骤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); //将各子问题的解合并为原问题的解}3. C++类定义例class Complex{public:Complex( ):real(0),imag(0) {} //构造函数Complex(double r,double i):real(r),imag(i) {} //构造函数Complex operator + (Complex c2); //重载“+”运算符operator double( ) //重载类型转换运算符{return real;}friend ostream& operator << (ostream&,Complex&); //重载流插入运算符“<<”private:double real;double imag;};三、实验内容及要求:在程序中创建一个学生对象数组并初始化数据,完成如下编程任务。

[工学]算法设计与分析第二章

[工学]算法设计与分析第二章
2018/11/20 计算机算法设计与分析 26
递归复杂性的一般形式
• 一般的,递归复杂性可描述为递归方程: 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 有两种

《算法设计与分析》(全)

《算法设计与分析》(全)
巢湖学院计算机科学与技术系
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总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) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。

计算机专业课《算法》_第二章 递归与分治策略

计算机专业课《算法》_第二章 递归与分治策略

“Hanoi 塔”问题演示 a 初始 a 步骤1 a
c
b
c
“Hanoi 塔”问题程序
void hanoi(int n,a,b,c)
{ if n == 1 move( 1, a, b );
else { hanoi( n-1, a, c, b );
move(n, a, b ); hanoi( n-1, c,b, a) ;
• 递归优点:结构清晰,可读性强
• 递归缺点:递归算法的运行效率较低,无论是耗 费的计算时间还是占用的存储空间都比非递归算 法要多。
整数划分问题的递归关系q(n,m)
如设p(n)为正整数n的划分数,则难以找到递归关系 • q(n,m):正整数n的不同的划分中,最大加数不 大于m的划分个数个数 q(n,m)=
1 q(n,n) 1+q(n,n-1) q(n,m-1)+q(n-m,m) n=1, m=1 n<m n=m n>m>1
递归函数举例(5)
学习要点
理解递归的概念。 掌握设计有效算法的分治策略。
通过典型范例,学习分治策略设计技巧。
2.1 递归的概念
• 递归算法:一个直接或间接地调用自身的算法 • 递归方程:对于递归算法,一般可把时间代 价表示为一个递归方程 • 递归函数:使用函数自身给出定义的函数 • 解递归方程最常用的方法是进行递归扩展
递归函数举例(1)
• 阶乘函数 n !=
1 n(n-1)! n=1 n>1
• Fibonacci数列
1 n=0
F(n)=
1 F(n-1)+F(n-2)
n=1 n>1
初始条件与递归方程是递归函数的二个要素

第二章递归与分治

第二章递归与分治
2019/3/24 计算机算法设计与分析 7
正整数的划分





在正整数的所有不同划分中,将最大加数n1不 大于m的划分个数记为q(n, m),可以建立如下 的递归关系: 的二元递归函数: n= 1 n, 或m m =1 q (n, m) { 1 (1) q(n, 1)=1, q(1, m) 最简单情形: =1 ≥1; q(n, m) = 1 + q(n, n –1) n ≤ m if (n < 1) || (m < 1) return 0; 递归关系: (2) q(n, n) = 1 + q(n, n–1),n>1; q(n, m– 1)+q(n –m, m) if (n == 1) || (m == 1) return 1; n>m>1 产生的新情况: if (n == 1) || (n < m) return 1 + q(n, n–1); return q(n, m –1) q(n m, } n>m>1 (3) q(n, m) =q (n, m+ –1) +–q (nm); –m, m), (4) q(n, m) = q(n, n),=n < mn) 。 整数 n的划分数 ρ(n) q (n, 。

2019/3/24 计算机算法设计与分析 3
Hanoi塔问题
例 Hanoi 1:Hanoi 塔的解可以很自然地看成这样一个过程: 塔问题:有A、B、C三根柱子。A
上有n个圆盘,自下而上由大到小地叠在一起。 于是可得到如下的程序: (1)先将A上面 现要将 A上的全部圆 n –1 个盘移至 C。 void Hanoi(int n, int Fr, int To, int As) { 盘移到B上,并要求: if (n > 0) { (2)再将 A上剩下 (1)每次只能移动一个 Hanoi(n–1, Fro, Ass, To); 的1 个盘移至 B。 圆盘; (2)任何时刻都 B C A Move(Fro, To); 不允许将较大的圆盘 Hanoi(n–1, Ass, To, Fro)} (3) 最后将C上的 压在较小的圆盘上; } n–(3) 1个盘移至 B。A、B、 圆盘只能在 C三个柱子间移动。

算法设计与分析递归与分治04

算法设计与分析递归与分治04
double cpair2(S)
a
n
智能信息处理研究中心(RCIIP)
总结
理解递归的概念。
掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。
1) 二分搜索技术; 2) 大整数乘法; 3) Strassen矩阵乘法; 4) 合并排序和快速排序; 5) 线性时间选择; 6) 最接近点对问题;
智能信息处理研究中心(RCIIP)
第2章 递归与分治策略
潘海为

1
智能信息处理研究中心(RCIIP)
线性时间选择
将n个输入元素划分成n/5个组,每组5个元素,只可能 P 有一个组不是5个元素。用任意一种排序算法,将每组中的 元素排好序,并取出每组的中位数,共n/5个。 递归调用select来找出这n/5个元素的中位数。如果 n/5是偶数,就找它的2个中位数中较大的一个。以这个 元素作为划分基准。 设所有元素互不相同。在这种情况下,找出的基准 x至少比3(n-
4
n
智能信息处理研究中心(RCIIP)
Type Select (Type a[], int p, int r, int k) { if (r-p<75) { 用某个简单排序算法对数组a[p:r]排序; return a[p+k-1]; };
复杂度分析
P
for ( int i = 0; i<=(r-p-4)/5; i++ ) 与a[p+i]交换位置;
C1 n 75 T ( n) C 2 n T (n / 5) T (3n / 4) n 75
将a[p+5*i]至a[p+5*i+4]的第3小元素
T(n)=O(n)

[理学]算法设计与分析课件 第2章 递归与分治_OK

[理学]算法设计与分析课件 第2章 递归与分治_OK

• 当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

算法设计与分析(霍红卫)-第2章-分治法

算法设计与分析(霍红卫)-第2章-分治法

第2章 分 治 法
我们可以很容易解决这个问题。利用这样一个事实:渐近 表示法只要求对n≥n0,T(n)≤cn lb n成立,其中n0是一个可以选择 的常数。由于对于n>3,递归方程并不直接依赖T(1),因此可设 n0=2,选择T(2)和T(3)作为归纳证明中的边界条件。由递归方程 可得T(2)=4和T(3)=5。此时只要选择c≥2,就会使得T(2)≤c·2·lb 2 和 T(3)≤c·3·lb 3 成 立 。 因 此 , 只 要 选 择 n0=2 和 c≥2 , 则 有 T(n)≤cn lb n成立。
3ic(n/4i)2=(3/16) icn2 i=0,1,…,log4n-1
深度为log4n的最后一层有3log4 n nlog4 3 个结点,每个结点的
开销为T(1),该层总开销为 nlog4 3T (1) ,即 Θ(nlog4 3)。
第2章 分 治 法
将所有层的开销相加得到整棵树的开销:
T (n) cn2
T(n)=2T(n/2)+n ≤2(c[n/2]lb[n/2])+n =cn lb n/2+n =cn lb n-cn lb 2+n =cn lb n-cn+n =cn lb n-(c-1)n
最后一步在c≥1时成立。≤cn lb n
第2章 分 治 法
下面证明猜测对于边界条件成立, 即证明对于选择的常 数c,T(n)≤cn lb n对于边界条件成立。 这个要求有时会产生 一些问题。 假设T(1)=1是递归方程的惟一边界条件,那么对 于n=1,T(1)≤c·1·lb 1=0与T(1)=1发生矛盾。因此,归纳法中 的归纳基础不成立。
3
cn2
3
2
cn2
3

算法设计与分析习题第二章分治与递归

算法设计与分析习题第二章分治与递归

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。(求极限)

计算机算法设计与分析-递归与分治

计算机算法设计与分析-递归与分治
通常,递归元的递减方式~有两种: 1、减法,即n – b,的形式 2、除法,即n / b,的形式
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
计算机算法设计与分析

算法设计与分析_第2章_递归与分治1

算法设计与分析_第2章_递归与分治1

算法设计与分析第2章递归与分治策略(1)2理解递归的概念。

掌握设计有效算法的分治策略。

通过下面的范例学习分治策略设计技巧。

二分搜索技术; 大整数乘法; Strassen 矩阵乘法; 合并排序和快速排序; 线性时间选择; 最接近点对问题; 重点和难点:递归和分治的概念与基本思想递归方程的求解方法学习要点3引言设计算法有许多方法 排序问题Bubble sort: bubblingInsertion sort: incremental approach (增量靠近) Merge sort: divide-and conquer (分而治之)Quick sort: location (元素定位)……分治算法的最坏运行时间远比插入排序还少4引言分而治之 清·俞樾《群经平议·周官二》“巫马下士二人医四人”:“凡邦之有疾病者,疕疡者造焉,则使医分而治之,是亦不自医也。

” 各个击破集中红军相机应付当前之敌,反对分兵,避免被敌人各个击破。

(毛泽东《中国的红色政权为什么能够存在》)5天下大事,必做于细天下难事,必做于易--------老子《道德经》引言分治法总体思想分治法总体思想分治法总体思想分治法总体思想10¾Divide=整个问题划分为多个子问题¾Conquer=求解每个子问题(递归调用正在设计的算法)¾Combine=合并子问题的解,形成原始问题的解。

分治法总体思想11分治法总体思想分治法的设计思想是:1)将一个难以直接解决的大问题,分割成一些规模较小的子问题;这些子问题互相独立且与原问题相同;2)递归地解子问题;3) 将各个子问题的解合并得到原问题的解.12问题: X 和Y 是两个n 位的二进制整数,分别表示为X=x n-1x n-2...x 0, Y=y n-1y n-2...y 0,其中0 ≤x i , y j ≤1 (i, j=0,1,…n-1) ,设计一个算法求X ×Y ,并分析其计算复杂度。

《计算机算法设计与分析》第二章 递归与分治策略PPT课件

《计算机算法设计与分析》第二章 递归与分治策略PPT课件

{
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章递归与分治(3)

第2章递归与分治(3)
算法设计与分析 > 递归与分治
2.2 分治算法的基本思想
将规模为N的问题分解为k个规模较小的子问题,使这些子问题相互 独立可分别求解,再将k个子问题的解合并成原问题的解.如子问题 的规模仍很大,则反复分解直到问题小到可直接求解为止. 在分治法中,子问题的解法通常与原问题相同,自然导致递归过程.
应用当中,通常将问题分解为k个(k=2)大小相等的子问题. 算法一般模式 阀值 Divide-and-Conquer(P) if ( |P|<=n0) Adhoc(P); 直接求解问题p 问 divide P into smaller subinstances P1 ,P2,... ,Pk; 题 for (i = 1;i <= k; i++) 的 规 yi=Divide-and-Conquer(Pi); 模 return Merge( yl ,..., yk); 将p1,p2,…pk的解y1,y2,…yk 合并成p的解
13
算法设计与分析 > 递归与分治
[n]
[n/2] [n/2]
[n/4] [1] [1]
[n/4]

[n/4] [1]
[n/4]
log n +
1
[1]
• 二分搜索的每次循环查找区间减半,查找区间 构成一棵二叉树,最坏的情况是一直走到二叉 树的叶子。因此算法的复杂度为 log n + 1。
k–1
k–1
= n + nlog(n /2i) = n + n(logn –log2i ) i) ilog2)
i=0 i=0
i=0 k–1
i=0 k–1
= n + knlogn – n(k /2 1)k/2 nk2 – + nk/2

算法设计与分析耿国华第二章

算法设计与分析耿国华第二章

Chapter
Hale Waihona Puke 22.4.1替换方法
例2.6 汉诺塔算法(见例2.5)的时间复杂 度分析。 假设汉诺塔算法的时间复杂度为T(n),例 2.5的算法递归方程为:
n 1 1 T ( n) 2T (n 1) 1 n 1
Chapter
2
2.4.1替换方法
利用替换法求解该方程:
T (n) 2T (n 1) 1
2
2.2具有递归特性的问题
• (2)递归定义的数据结构
在数据结构中,如广义表、二叉树、树等结构 其本身均具有固有的递归特性,可以自然地采 用递归法进行处理。 (3)递归求解方法 许多问题的求解过程可以用递归分解的方法描 述,例如:计算两非负整数最大公约数的欧几 里得算法和著名的汉诺塔问题(Hanoi)问题。
T (n) O(2n )
得到该算法的时间复杂度
Chapter
2
2.4.1替换方法
例2.7 2-路归并排序的递归算法分析。 假设初始序列含有n个记录,首先将这n个记 录看成n个有序的子序列,每个子序列的长度为1, 然后两两归并,得到 n / 2个长度为2(n为奇数 时,最后一个序列的长度为1)的有序子序列; 在此基础上,再对长度为2的有序子序列进行两 两归并,得到若干个长度为4的有序子序列;如 此重复,直至得到一个长度为n的有序序列为止。 这种方法被称作2-路归并排序。
F(6) F(5) F(4) F(3) F(2) F(1) F(0) F(1) F(1) F(2) F(3) F(2) F(1) F(2) F(1) F(0) F(3) F(1) F(1) F(4) F(2) F(0)
F(0) F(1) F(0)
图2-1 斐波那契算法的递归结构(n=6)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.1 分治法的基本思想

将求出的小规模的问题的解合并为一个更大规模的问题的解,自 底向上逐步求出原来问题的解。
T(n)
n/2
=
n/2
n
n/2 n/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.1 分治法的基本思想

将求出的小规模的问题的解合并为一个更大规模的问题的解,自 底向上逐步求出原来问题的解。
T(n)
n/2
=
n/2
n
n/2 n/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.1 分治法的基本思想
分治法的设计思想是,将一个难以直接解决的大 问题,分割成一些规模较小的相同问题,以便各 个击破,分而治之。
2.1 分治法的基本思想
2.2 分治法的适用条件
分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该 问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的 解; 该问题所分解出的各个子问题是相互独立的,即子问 题之间不包含公共的子问题。
2.4 分治法的应用
例3 二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个 元素中找出一特定元素x。 分析:


该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
由此可得:
C11 A11 B11 A12 B21 复杂度分析 O(1 C(n) A11 B12 ) A12 n 2 B22 12 T 8T (n / 2) O(n 2 ) n 2 C21 A21 B11 A22 B21 T(n)=O(n3) 没有改进 C22 A21 B12 A22 B22
2.1 分治法的基本思想

对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划 将要求解的较大规模的问题分割成k个更小规模的子问题。 分为k个子问题,如此递归的进行下去,直到问题规模足够小,很 容易求出其解为止。
T(n)
=
n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
2.1 分治法的基本思想
2.4 分治法的应用
例3 二分搜索技术
二分搜索算法:
int binarySearch(int a[], int x, int n) { left = 0; right = n - 1; while (left <= right) { int middle = (left + right)/2; if (x == a[middle]) return middle; if (x > a[middle]) left = middle + 1; else right = middle - 1; } return -1; // 未找到x }
第二章 递归与分治策略
第二章 递归与分治

2.1 分治法的基本思想 2.2 分治法的适用条件 2.3 分治法的基本步骤 2.4 分治法的应用
2.1 分治法(divide-and-conquer)的基本 思想

为求解大问题,可以:



分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然 不够小,则再划分为k个子问题,如此递归的进行 下去,直到问题规模足够小,很容易求出其解为止。 将求出的小规模的问题的解合并为一个更大规模的 问题的解,自底向上逐步求出原来问题的解。

对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划 分为k个子问题,如此递归的进行下去,直到问题规模足够小,很 容易求出其解为止。
T(n)
n/2
=
n/2
n
n/2 n/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
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
M 5 ( A11 A22 )(B11 B22 ) M 6 ( A12 A22 )(B21 B22 ) M 7 ( A11 A21 )(B11 B12 )
C M M C21 M 3 M 4 C22 M 5 M1 M 3 M 7
2.4 分治法的应用
2.3 分治法的基本步骤
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); //将各子问题的解合并为原问 题的解 } 大量实践证明:在用分治法设计算法时, 将一个问题分成大小相等的k个子问题的 处理方法是行之有效的
ห้องสมุดไป่ตู้
棋盘覆盖
void chessBoard(int tr, int tc, int dr, int dc, int size) { board[tr + s - 1][tc + s] = t; if (size == 1) return; // 覆盖其余方格 int t = tile++, // L型骨牌号 chessBoard(tr, tc+s, tr+s-1, tc+s, s);} s = size/2; // 分割棋盘 // 覆盖左下角子棋盘 // 覆盖左上角子棋盘 if (dr >= tr + s && dc < tc + s) if (dr < tr +复杂度分析 s) s && dc < tc + // 特殊方格在此棋盘中 O(1) k 0 // 特殊方格在此棋盘中 chessBoard(tr+s, tc, dr, dc, s); T (k s); chessBoard(tr, tc, dr, dc, ) 4T (k else){// 用 +1s][tck+ -01] = t; board[tr ( 号L型骨牌覆盖右上角 1 Ot ) else {// 此棋盘中无特殊方格 s // 用 t 号L型骨牌覆盖右下角 k) 渐进意义下的最优算法 // 覆盖其余方格 T(n)=O(4 board[tr + s - 1][tc + s - 1] = t; chessBoard(tr+s, tc, tr+s, tc+s-1, s);} // 覆盖其余方格 // 覆盖右下角子棋盘 chessBoard(tr, tc, tr+s-1, tc+s-1, s);} if (dr >= tr + s && dc >= tc + s) // 覆盖右上角子棋盘 // 特殊方格在此棋盘中 if (dr < tr + s && dc >= tc + s) chessBoard(tr+s, tc+s, dr, dc, s); // 特殊方格在此棋盘中 else {// 用 t 号L型骨牌覆盖左上角 chessBoard(tr, tc+s, dr, dc, s); board[tr + s][tc + s] = t; else {// 此棋盘中无特殊方格 // 覆盖其余方格 // 用 t 号L型骨牌覆盖左下角 chessBoard(tr+s, tc+s, tr+s, tc+s, s);} }
例5 棋盘覆盖
在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格 不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在 棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定 的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌 不得重叠覆盖。
棋盘覆盖
当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。 特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特 殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可 以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示, 从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用 这种分割,直至棋盘简化为棋盘1×1。
Strassen矩阵乘法
改进: 为了降低时间复杂度,必须减少乘法的次数。
C11 C12 A11 A12 B11 C A C22 21 A22 B21 21 复杂度分析 M 1 A11 ( B12 B22 ) O(1)
相关文档
最新文档