天天看点

第四章 分治策略

Divide-Conquer-Combine

4.1 最大子数组问题

FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high) 
    /*
    接受数组A和下表low,mid,high为输入,
    返回一个下标元组划定跨越种点的最大子数组的边界,并返回最大子数组中值的和
    */
left-sum = -∞
sum = 0
for i = mid downto low
    sum = sum + A[i]
    if sum > left - sum
        left-sum = sum
        max-left = i
right-sum = -∞
sum = 0
for j = mid + 1 to high
    sum = sum + A[j]
    if sum > right-sum
        right-sum = sum
        max-right = j
return(max-left, max-right, left-sum + right-sum)

FIND-MAXIMUM-SUBARRAY(A,low,high) //求出A[1...n]的最大子数组
if high == low
    return (low,high,A[low])
else mid = (low + high)/2
    (left-low, left-high, left-sum) = 
    	FIND-MAXIMUM-SUBARRAY(A,low,mid)
    (right-low, right-high, right-sum) = 
    	FIND-MAXIMUM-SUBARRAY(A,mid+1,high)
    (cross-low, cross-high, cross-sum) = 
    	FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
    if left-sum >= cross-sum and right-sum >= cross-sum
        return(left-low, left-high, left-sum)
    else right-sum >= cross-sum and right-sum >= cross-sum
        return(right-low, right-high, right-sum)
    else return(cross-low, cross-high, cross-sum)

           

4.2 矩阵乘法的Strassen算法

常规算法花费Θ(n3),Strassen算法花费Θ(nlg7)≈Θ(n^2.81)

基本思想:减少多余的乘法,把乘法变成乘法+加法

4.3 代入法求解递归式

步骤

  1. 猜测解的形式
  2. 用数学归纳法求出解种的常数,并证明解是正确的

4.4 递归树方法求解递归式

将递归式转换成一棵树,其节点表示不同层次的递归调用产生的代价。然后采用边界和技巧来求解递归式。

4.5 主方法求解递归式

求解形式如 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)递归式的界

4.5 主方法求解递归式

求解形式如 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)递归式的界

继续阅读