《算法导论》第4章 分治策略 个人笔记
来源:互联网 发布:scala二维数组 编辑:程序博客网 时间:2024/06/02 01:28
第4章 分治策略
本章通过两个例子介绍分治策略,然后介绍三种方法求解递归式。
4.1 最大子数组问题
FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high)left_sum = - MAXsum = 0for i = mid downto low sum = sum + A[i] if sum > left_sum left_sum = sum max_left = iright_sum = - MAXsum = 0for j = mid + 1 to high sum = sum + A[j] if sum > right_sum right_sum = sum max_right = jreturn(max_left, max_right, left_sum + right_sum)
FIND-MAXIMUN-SUBARRAY(A, low, high)if high == low return(low, high, A[low])else mid = (low + high) / 2 (left_low, left_high, left_sum) = FIND-MAXIMUN-SUBARRAY(A, low, mid) (rihgt_low, rihgt_high, rihgt_sum) = FIND-MAXIMUN-SUBARRAY(A, mid + 1, high) (cross_low, cross_high, cross_sum) = FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high) if left_sum >= right_sum and left_sum >= cross_sum return(left_low, left_high, left_sum) elseif right_sum >= left_sum and right_sum >= cross_sum return(right_low, right_high, right_sum) else return(cross_low, cross_high, cross_sum)
这里因为展现分治策略所以这样做,但复杂度略高,
这里给出一个我认为比较简单的方法,其本质是动态规划。
FIND-MAXIMUN-SUBARRAY(A, low, high)now_sum = -MAXmax_sum = -MAXleft = lowright = lowfor i = low to high if now_sum < 0 now_sum = 0 left = i now_sum +=A[i] if now_sum > max_sum max_sum = now_sum right = ireturn(left, right, max_sum)
4.2 矩阵乘法的Strassen算法
普通方法:
SQUARE-MATRIX-MULTIPLY(A, B)n = A.rowlet C be a new nxn matrixfor i = 1 to n for j = 1 to n C[ij] = 0 for k = 1 to n C[ij] += A[ik] * B[kj]
Strassen方法:
1. 将A、B和C分解成
2. 创建10个
3. 用步骤1中创建的子矩阵和步骤2中创建的10个矩阵,递归地计算7个矩阵积
4. 通过
步骤2中,创建如下10个矩阵:
步骤3中,递归地计算7次矩阵乘法:
步骤4,得到C的子矩阵:
注:反正我记不住这些矩阵计算,也不想记,Strassen方法不怎么实用=。=
到目前为止,nxn矩阵相乘的渐进复杂度最优的算法是Coppersmith和Winograd提出的,运行时间为O(n2.376) ,已经很好了,毕竟下界是Ω(n2) 。
4.3 用代入法求解递归式
步骤:
- 猜测解的形式
- 用数学归纳法求出解中常数,并且证明解释正确的
4.4 用递归树求解递归式
在2.2节中就用到过递归树,可参考2.2那节内容。
递归树主要是计算每层的代价和递归树的层数。
4.5 用主方法求解递归式
定理4.1(主定理):令
那么
1. 若对某个常数
2. 若
3. 若对某个常数
注:这里的小于大于都是指多项式意义上的小于大于,如果函数
f(n) 落在间隙中,不能用主方法来求解递归式。
0 0
- 《算法导论》第4章 分治策略 个人笔记
- 算法导论读书笔记 第4章 分治策略
- 算法导论 第4章 源程序 分治策略 最大子数组 Strassen算法
- 算法导论第4章 分治
- 【算法导论】分治策略
- 《算法导论》第2章 算法基础 个人笔记
- 《算法导论》第16章 贪心算法 个人笔记
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第4章 分治策略
- 《算法导论》第6章 堆排序 个人笔记
- 《算法导论》第7章 快速排序 个人笔记
- 《算法导论》第8章 线性时间排序 个人笔记
- 《算法导论》第11章 散列表 个人笔记
- 《算法导论》第12章 二叉搜索树 个人笔记
- 《算法导论》第13章 红黑树 个人笔记
- 《算法导论》第14章 数据结构的扩张 个人笔记
- 《算法导论》第15章 动态规划 个人笔记
- 《算法导论》第18章 B树 个人笔记
- 《算法导论》第23章 最小生成树 个人笔记
- 1047: 阿姆斯特朗数
- Python:类型
- 18. 4Sum
- opencv(9)---图像基本操作
- mysql导入数据时提示 USING BTREE 错误解决办法
- 《算法导论》第4章 分治策略 个人笔记
- secure boot 的知识
- [编程题] 度度熊回家
- 【Android】判断应用Application、Activity、Service是否处于活动状态
- 二分贪心 U题
- Tensorflow学习:单层神经网络的建立
- cipher加密解密
- HDOJ 2011 多项式求和
- hdu5391Zball in Tina Town(素数鉴别的大猜想)