第四章 分治策略

来源:互联网 发布:催收数据安全管理制度 编辑:程序博客网 时间:2024/05/16 18:57

递归情况:子问题足够大需要递归求解。
基本情况:子问题足够小,不需要递归求解。
在合并步骤中,也许需要求解和原问题完全不相同的子问题。
递归式:是一个等式或者不等式,通过一个更小的输入上的函数值来描述一个函数。
本章会介绍3种求解递归式的方法。
代入法:需要猜测界。
递归树法:把递归式转换为树,结点代表不同层次的递归调用产生的代价。采用边界和技术求解。
主方法:对递归式形式有要求。
如果递归式非等式,其刻画了上界或者下界。

4.1 最大子数组

问题

给定一个数组,求数组元素和最大的非空连续子数组。数组元素中存在负数。最大子数组可能存在多个。

暴力法

求出所有子数组的和,利用之前求得的和来获得后面的和,使得算法为Θ(n2)

分治策略

最大子数组跨越中点的话,其是受到约束的。

分治算法分析

最大子数组存在线性算法

练习:

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是存在一个常数,在等式中是变化的。注意使用n0来排除不能进入归纳的边界条件。底线边界是归纳的开始。
递归树可以帮助猜测解。
总结:这个方法

4.4 递归树

适合生成好的猜测。注意树高度的算法。这个方法只能给出上界的猜测。
猜测界,合理放缩,证明之。

4.5 用主方法求解递归式

对递归式形式有要求:

T(n)=aT(n/b)+f(n)

其中a1b>1为常数,f(n)是渐进正函数。
主定理定义见算法导论P53。
f(n)和nlogab的比较决定了解的形式。其中的小于大于都是多项式意义上的,也就是渐进的。nlogab是叶结点的数目。
这种比较是一种要求,不满足此要求,不可使用主定理。
注意主定理的3是下界。
注意调入缝隙的情况。

4.6 主定理的证明

留待之后再看。

注记中的4.30给出了更一般的主方法可求解的形式。

额外知识

斐波那契数列的计算

(Fn+1FnFnFn1)=(1110)n

用类似求幂的分治法解。

原创粉丝点击