算法_6:分治策略

  • 分解,解决,合并
  • 递归式的求解算法:带入,递归树,主方法

最大子数组问题

  • 最大子数组的三种情况:A[low….mid]; A[mid+1……high]和跨域中点

FIND-MAX-CROSSING-SUBARRAY(A,low, mid, high)

返回:下标元组跨越中点的最大数组的边界,并返回最大数组的中值和

FIND-MAX-CROSSING-SUBARRAY(A,low, mid, high)

1. left-sum=-无穷
2. sum=0
3. for i=mid down to low
4.      sum=sum+A[i]
5.      if sum >left-sum
6.         left-sum=sum
7.         max-left=i
8. right-low=-无穷
9. sum=0
10. for j=mid+1 to high
11.     sum=sum=A[j]
12.     if sum>right-sum
13.        right-sum=sum
14.        max-right=j
15.  return (max-left,max-right,left-sum+right-sum)
  • 算法分析: O(n)
    A[low…high] 包含 n个元素

FIND-MAX-SUBARRAY算法

//FIND-MAX-SUBARRAY(A,low,high)
1. if high==low
2.   return(low,high,A[low])
3. else mid= 下取整[(low+high)/2]
4.   (left-low,left-high,left-sum)=FIND-MAX-SUMARRAY(A,low,mid)
5.   (right-low,right-high,right-sum)=FIND-MAX-SUMARRAY(A,mid+1,high)
6.   (cross-low,cross-high,cross-sum)=FIND-MAX-CROSSING-SUMARRAY(A,low,mid,high)
7. if left-sum>=right-sum and left-sm >=cross-sum
8.    return (left-low,left-high,left-sum)
9. else right-sum>=left-sum and right-sum>=cross-sum
10.   return (right-low,right-high,right-sum)
11. else return(corss-low,cross-high,cross-sum)  

算法分析

T(n){O(1).........n=12T(n/2)+O(n)......

  • 复杂度:T(n)=O(nlng)

strassen算法的矩阵乘法

暴力

  • 矩阵乘法, 计算 n2 个数
    Cij=nk=1aikbkj
//矩阵乘法
1. n=A.rows
2. let C be a new n*n matrix
3. for i=1 to n
4.   for j=1 to n
5.       c_ij=0
6.       for k=1 to n
7.           c_ij=c_ij+a_ik*b_kj
8. return C
  • 复杂度: O(n3)

简单分治

[C11C21C12C22]=[A11A21A12A22][B11B21B12B22]

//直接递归
S-M-N-R(A,B)
1. n=A.rows
2. let C be n*n matrix
3. if n==1
4.    c_11=a_11*b_11
5. else partition A,B,C as 上式
6.    C_11=S-M-N-R(A_11,B_11)+S-M-N-R(A_12,B_21)
7. ......
8. return C
  • 复杂度
    1. n==1……….T(1)=O(1)
    2. n>1…………..递归
      T(n)=8T(n/2)+O(n^2)……….T(n)=O(n^3)

strassen

  1. n==1……….T(1)=O(1)

    1. n>1…………..递归
      T(n)=7T(n/2)+O(n^2)……….T(n)=O(n^3)

      • 复杂度减少到: O(nlg7)

代入法求解递归式

  1. 猜测解得形式
  2. 归纳法求解常数,证明正确性

递归树法

T(n)=3T(n/4)+cn2

  • 计算递归树的高度
    n/4i=1..........i=log4n.........log4n

  • 每层代价,每层的结点数是上一层的3倍
    i 结点的结点数是 3i

  • 每层的子问题规模是上一层的1/4

  • 第i层的代价 nlog43 个T(1)

算法_6:分治策略_第1张图片

  • 整棵树的 代价
    T(n)=cn2+316cn2+(316)cn2+......+(316log4(n1))cn2+O(nlog43)
    <O(n2)

主方法

  • 递归式 T(n)=aT(a/b)+f(n)
    1. 若对某个常数 ϵ >0 有 f(n)= O(nlogb(aϵ)) , 则 T(n)=O(nlogba)
    2. f(n)=O(nlogba) ,则 T(n)=O(nlogbalgn)
    3. 若对某个常数 ϵ >0 有 f(n)= O(nlogb(a+ϵ)) , 且对于某个常数c<1, 和足够大的n有 af(n/b)<=cf(n) , 则T(n)=O(f(n))

你可能感兴趣的:(算法_6:分治策略)