算法之分治法

1.分治法总体思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。(算法设计中:1+1 可能小于2!)
2.分治法的几个步骤:
   1、将原始问题划分为k个相同类型的子问题。(问题:为什么?)
   2、子问题不可解还可继续划分。(问题:分到什么时候结束?)
   3、求解每个子问题。
   4、将每个最小子问题的解合并成原问题的解。
3.分治法所能解决的问题一般具有以下几个特征:
该问题的规模缩小到一定的程度就可以容易地解决;
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
利用该问题分解出的子问题的解可以合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 
(能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划。)
4.分治法的效率分析
    一般情况下,一个规模为n的实例可以划分为若干个规模为n/b的实例,其中a个实例需要求解。
    对于算法的运行时间,有下列递推式:
              T(n)=aT(n/b)+f(n) 
    其中,f(n)是一个函数,表示将问题分解为小问题和将结果合并起来所消耗时间。该递推式被称为通用分治递推式。 


The Master Theorem(主定理)
T(n) = aT(n/b) + f (n),
 where f (n) ∈ (nk) , k>=0


5.合并排序(也叫归并排序)的分治策略是:
(1)划分:将待排序序列r1, r2, …, rn划分为两个长度相等的子序列r1, …, rn/2和rn/2+1, …, rn;
(2)求解子问题:分别对这两个子序列进行排序,得到两个有序子序列;
(3)合并:将这两个有序子序列合并成一个有序序列。


6.算法 Mergesort (A[0...n-1])
// 递归调用Mergesort来对数组A排序
// 输入:可排序数组A[0..n-1]
// 输出:非降序列数组A[0..n-1]
if (n>1)
     copy A[ 0.. n/2-1 ]  to  B[ 0.. n/2 -1 ] ;
     copy A[ n/2 .. n-1 ] to C[ 0.. n/2-1 ];
     Mergesort ( B[ 0.. n/2 -1] );
     Mergesort ( C[ 0.. n/2 -1] );
     Merge(B,C,A);
7.合并函数MERGE
算法 Merge( B[0..p-1], C[0..q-1]), A[0..p+q-1] )
//将两个有序数组合并成一个有序数组
//输入:两个有序数组B[0..p-1]和C[0..q-1]
//输出:非降序列数组A[0..p+q-1]
i0;  j0;  k0;
while (i<p and j<q) do
     if (B[i] ≤ C[j]) 
          A[k]B[i]; ii+1;
     else 
          A[k]C[j]; jj+1;
     kk+1;
if  (i=p)
    copy C[j..q-1] to A[k...p+q-1]
else
    copy B[i..p-1] to A[k...p+q-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值