程序设计方法与实践-分治法

分而治之

  • 一个问题可以分成若干个子问题进行求解(子问题规模最好相同)
  • 对子问题进行求解(可以递归进行)
  • 然后对子问题的解进行合并

所以分治法的通用步骤可以概括为:分、治、合。 

分治法与主定理

这里大家回忆一下,算法效率分析中的主定理法分析递归算法的原则:

T\left ( n \right )=a\left ( T\left [ n/b \right ] \right )+\Theta (n^{2}) 

这不就是分治法的一种体现吗?也就是将规模为T\left ( n \right )的问题,划分成a个规模为T\left [ n/b \right ]的子问题,后面跟着的余项\Theta (n^{2})即为”合“的时间复杂度。 

归并排序

  • 将待排序数组分成两部分:a\left [ 0..n/2 \right ]a\left [ n/2...n-1 \right ]
  • 分别将两部分递归方式进行排序
  • 然后将两部分有序数列合并

伪码描述: 

MergeSort(A[0...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)
}

看起来好像什么都没干,但却是解决了这个问题。这就是递归函数的魅力,同样它可能会让你忽视时间的效率。 当然这个算法是比较优的啦:

如果使用主定理法去计算该算法的时间复杂度的话,不难发现其时间复杂度为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值