分治算法(Divide-and-Conquer)
在计算机科学中,分而治之(简称分治法)是基于多分支递归的算法设计范例。分而治之算法的工作原理是将问题递归分解为两个或多个相同或相关类型的子问题,直到这些子问题变得足够简单以至于可以直接解决。然后将子问题的解决方案组合起来,以解决原始问题。
利用分治法解决问题有下面三个步骤:
1、分解:将原问题分解为多个子问题,每个子问题与原问题类型相同,但比原问题规模小。
2、解决:递归求解子问题,如果子问题规模足够小,直接可以求解。
3、合并:合并子问题的解,得到原问题的解。
例子一:下面以一个简单的序列(a0, a1, a2, .....an)求和问题,说明分治算法的应用。
序列可以用Python的list或Go 语言的slice 来保存它。
1、分解:如果序列的n大于1,可以从中间一分为二,分别求出左边的和和右边的和。
2、解决:按照 n / 2 ,分解为左边,右边。左边和右边可以再递归的分解,分解到只剩下单一元素时,直接可以求解了。
3、合并:合并上面递归求的解(左、右的解)
下面请看Python 代码,特别提示,该方案不是最好的解决方法,只是用一个简单的例子来说明分治算法。
例子二: 归并排序
归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
采用分治法:
分解:递归地把当前序列平均分割成两半。
合并:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。
请看Python 代码。
黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次zhuanlan.zhihu.com黄哥:黄哥Python培训是这样训练学员的zhuanlan.zhihu.com