第四章 分治策略
来源:互联网 发布:催收数据安全管理制度 编辑:程序博客网 时间:2024/05/16 18:57
递归情况:子问题足够大需要递归求解。
基本情况:子问题足够小,不需要递归求解。
在合并步骤中,也许需要求解和原问题完全不相同的子问题。
递归式:是一个等式或者不等式,通过一个更小的输入上的函数值来描述一个函数。
本章会介绍3种求解递归式的方法。
代入法:需要猜测界。
递归树法:把递归式转换为树,结点代表不同层次的递归调用产生的代价。采用边界和技术求解。
主方法:对递归式形式有要求。
如果递归式非等式,其刻画了上界或者下界。
4.1 最大子数组
问题
给定一个数组,求数组元素和最大的非空连续子数组。数组元素中存在负数。最大子数组可能存在多个。
暴力法
求出所有子数组的和,利用之前求得的和来获得后面的和,使得算法为
分治策略
最大子数组跨越中点的话,其是受到约束的。
分治算法分析
最大子数组存在线性算法
练习:
4.1-5 从左向右遍历,左边的贴边的子数组如果小于0,则抛弃之,用新进入的数代替,继续向右遍历。返回值中的right指向最后一个元素的后一个元素。
def maxSubarrayline(l, n): sum = -sys.maxsize temp = -sys.maxsize for i in range(n): if temp < 0: temp = l[i] leftTemp = i rightTemp = i + 1 else: temp += a[i] rightTemp = i + 1 if sum < temp: sum = temp left = leftTemp right = rightTemp return (left, right, sum)
4.2 矩阵乘法的Strassen算法
略
练习:
4.2-7
实部:ac-bd 虚部:ad+bc
辅助:f1=(a-b)(c+d)=ac+bd-bc-bd
f2=ad f3=bc
故实部=f1-f2+f3 虚部=f2+f3
4.3 用代入法求解递归式
分两步:
1. 猜测解的形式
2. 用数学归纳法求出解中的常数,并证明解是正确的。
注意第一个示例中的c是存在一个常数,在等式中是变化的。注意使用
递归树可以帮助猜测解。
总结:这个方法
4.4 递归树
适合生成好的猜测。注意树高度的算法。这个方法只能给出上界的猜测。
猜测界,合理放缩,证明之。
4.5 用主方法求解递归式
对递归式形式有要求:
其中
主定理定义见算法导论P53。
f(n)和
这种比较是一种要求,不满足此要求,不可使用主定理。
注意主定理的3是下界。
注意调入缝隙的情况。
4.6 主定理的证明
留待之后再看。
注记中的4.30给出了更一般的主方法可求解的形式。
额外知识
斐波那契数列的计算
用类似求幂的分治法解。
- 第四章 分治策略
- 第四章 分治策略
- 算法导论第四章-分治策略-Cpp代码实现
- 算法导论_第四章_分治策略
- 算法导论-第四章-分治策略:最大子数组C++实现
- 第 4 章 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 分治策略
- 词法作用域之欺骗词法
- poj3237 Tree(树链剖分)
- 转时间复杂度和空间复杂度详解
- Leetcode :2 Add Two Numbers
- XListView上拉加载下拉刷新
- 第四章 分治策略
- Fast Input
- CSS实现多栏布局的几种方式
- G
- 33muduo_net库源码分析(九)
- ChokBox的全选反选以及计算数量
- 淡入淡出放大放小
- Lattice Animals UVA
- 关于Unity3D的学习平台