分治算法例子集锦

描述:两部分组成

分(divide):递归解决较小的问题 治(conquer):然后从子问题的解构建原问题的解

三个步骤

1、分解(Divide):将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; 2、解决(Conquer):若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; 3、合并(Combine):将各个子问题的解合并为原问题的解。

四个适用条件

1、该问题的规模缩小到一定的程度就可以容易地解决; 2、该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3、利用该问题分解出的子问题的解可以合并为该问题的解; 4、该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 (上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,,此时虽然可用分治法,但一般用动态规划法较好。)

伪代码表示:

Divide-and-Conquer(P) 1. if |P|≤n0 2. then return(ADHOC(P)) 3. 将P分解为较小的子问题 P1 ,P2 ,…,Pk 4. for i←1 to k 5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi 6. T ← MERGE(y1,y2,…,yk)△ 合并子问题 7. return(T)

典型实例求x的n次幂

复杂度为 的分治算法

power(int x, int n){int result;if(n == 1)return x;if( n % 2 == 0)result = power(x, n/2) * power(x, n / 2);elseresult = power(x, (n+1) / 2) * power(x, (n-1) / 2);return result;}int main(){int x = 5;int n = 3;printf(“power(%d,%d) = %d \n”,x, n, power(x, n));}归并排序

最大子序列问题

参考文章

1、 2、 3、

让你的心情地落到极点,一直学习生活等各个方面都做不好,最终害的还是自己。

分治算法例子集锦

相关文章:

你感兴趣的文章:

标签云: