分治法的基本思想
将规模为N的问题分解为k个规模较小的子问题,使这些子问题相互独立可分别求解,再将k个子问题的解合并成原问题的解。如子问题的规模仍很大,则反复分解直到问题小到可直接求解为止。在分治法中,子问题的解法通常与原问题相同,自然导致
递归过程。
![](https://i-blog.csdnimg.cn/blog_migrate/c02a514c3d6b07fa10ca912b643fe6fb.png)
分治法是按照以下方案工作的:
1. 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模。
2.对这些较小实例的求解(一般使用递归方法,但在问题规模足够小的时候,有时也会使用一些其他方法)。
3.如果必要的话,合并这些较小问题的解,以得到原始问题的解。
分治法一定能降低复杂度?获取高效率?
A0+A1+A2+….+An
(A0+….+A[n/2])+(A[n/2+1]+….+An)
问题规模为n的实例被划分为两个规模为n/2的实例。更一般的情况下,一个规模为n的实例可以划分为若干个规模为n/b的实例,其中a个实例需要求解(a和b是常量)
为了简化分析,我们假设n是b的乘方,对于算法的运行时间,有下列递推式:
T(n)=a T(n/b)+f(n)
其中,f(n)是一个函数,表示将问题分解为小问题和将结果合并起来所消耗时间(对于求和的例子来说,a=b=2, f(n)=1)。该递推式被称为
通用分治递推式。
![](https://i-blog.csdnimg.cn/blog_migrate/15bf4a02bf8a345ee2eecd52f3fe6ad3.png)
例如,对于上面的分治法求和算法,当输入规模为n=2时,加法运算次数A(n)可以用下面的例子来说,a=2, b=2, d=0;这样一来,因为a> bd 即 2>1,
A(n)∈Θ(nlogba) = Θ(nlog22) = Θ(n)