分治算法

来源:互联网 发布:银行家算法过程详解 编辑:程序博客网 时间:2024/06/03 19:52

分治的思想

简单讲就是,分:大化小,治:以最小划分单元开始,逐个处理,最后整合。大单元计算划分成独立的小单元计算,计算的过程是一样的,比如比较大小,乘除法,最后能整合到一起才行

分治典型方法

递归,递归就是符合分治的思想,根据条件划分成最小单元最后整合,当然也有不利用递归实现的。

为什么要使用分治

提高算法的时间效率

从实例中体验分治算法

归并排序

1、先阅读博文内容:
http://raytaylorlin.com/Tech/algorithm/divide-and-conquer/#2-__u5F52_u5E76_u6392_u5E8F

2、先明确划分的最小单元是什么?注意这里的划分n是2^k。有人问如果n是普通整数怎么办,后面会说。
这个最小单元是含有一个元素的数组,划分的最终结果就是n个一元数组所以划分的条件,也就是递归的终止条件是n=1,递归关键点就是终止条件。
3、划分完后怎么合并?
博文里面给出了一个合并函数,实现的逻辑也讲得很清楚,就是把两个升序数组和并成一个升序数组
4、当n为一般整数怎么办?
整数n有偶数奇数,抓住一点划分结果是n个一元数组,所以可以加个判断,

if(n%2==0){    leftList = mergeSort(data[len(data) / 2])    rightList = mergeSort(data[len(data) / 2])}else{    leftList = mergeSort(data[len(data) -1/ 2 ])    rightList = mergeSort(data[len(data)+1 / 2 ])}

整数幂 m^n

当n非常大时,如果采用简单的循环语句,程序时间复杂度为O(n),采用分治可以为O(logn)
这里介绍递归分治求正整数幂,先看博文
http://blog.csdn.net/zwhlxl/article/details/44086105
1、这划分的最小元就是 底数m,然后合并,比较简单
2、这里也是做了奇偶数判断
非递归的分治求正整数幂,请看上一篇博文快速幂

其他典型案例

原创粉丝点击