算法学习--分治法

分治法的思想是:将原问题划分为与原问题具有相似结构的小问题,然后递归地求解小问题。其解决问题的过程可归纳为以下三个步骤:

一,分解(Divide),将原问题分解为一序列子问题;

二,解决(Conquer),递归地解子问题,若子问题足够小了,那么就可以直接解决子问题;

三,合并(Combine),将子问题的结果合并为原问题的解。


这里学习学习使用分治法来求解序列排序问题,相应的排序算法叫做合并排序。根据分治法求解问题的步骤,合并排序法有以下三个步骤:

一,分解,将有n各元素的序列分解为各有n/2各元素的子序列;

二,解决,用合并排序法对两个子序列递归地排序;

三,合并,将两个已排好序的子序列合并。


算法时间复杂度分析:

假设把原问题分解为a个子问题,每个子问题的规模是原问题规模的1/b。将分解问题的时间极为D(n),将合并问题的解的时间记为C(n)。如果问题的规模足够小,比如n<=c,那么就可以直接求解问题,且所花时间为那么求解问题的总时间有以下递推式:


T(n) = \Theta(1),  n<=c

T(n) = aT(n/b) + D(n) + C(n) , n>c

因为分解和合并的时间都是\Theta(n)的。所以

T(n) =  aT(n/b) + \Theta(n),   n>c


利用主定理(main theorem)可以解得T(n) = \Theta( n ln n)。主定理后面再八卦了。另外一种求解上述递归式的方法,是利用二叉树,对子问题的分解可以构成一个二叉树,对这个二叉树进行分析同样可以得到前面的结果。


合并算法的改进

当待排序序列元素个数n较少的时候,插入排序有比较快的运算速度。这样的话,当用合并排序进行排序时,如果子问题比较小了,可以直接使用插入排序进行排序,而无须再对该子问题继续进行分解。


写的很是浅显,实际上是抄书了。不过学习就是这样一个过程,从不知道到知道一点点,再到知道更多。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值