当前位置:
文档之家› 算法设计与分析_第2章_递归与分治2
算法设计与分析_第2章_递归与分治2
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