算法设计与分析——分治法

来源:互联网 发布:java int转date 编辑:程序博客网 时间:2024/06/05 21:05

算法思想:

“分而治之”。把一个复杂的问题分成两个或更多的相同问题,直到最后各个子问题可以简单的直接求解,对各个子问题的解进行合并即得原问题的解。

工作方案:

1.将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模。

2.对这些较小的实例求解。(一般使用递归的方法)。

3.如果有必要,合并这些较小规模的解,以得到原问题的解。

分治法孕育了计算机科学中许多最重要和最有效的算法。对于并行计算是非常理想的,因为各个子问题都可以由不同的CPU同时计算。

使用分治法的问题的特征:

1.该问题的规模缩小到一定的程度就可以容易地解决;

2.该问题具有最优子结构性质

3.利用子问题的解,合并为原问题的解;

4.该问题所分解出的各个子问题是相互独立,并且与原问题性质相同,即子问题之间不包含公共的子问题。

分治法的基本步骤:分解和治理

divide-and-conquer(P)  {    if ( | P | <= n0) Adhoc(P);   //解决小规模的问题    divide P into smaller subinstancesP1,P2,...,Pk;//分解问题    for (i=1,i<=k,i++)      yi=divide-and-conquer(Pi);  //递归的解各子问题    return merge(y1,...,yk);  //将各子问题的解合并为原问题的解  }


      人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。

复杂性分析:

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阀值n0=1,且Adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:

复杂性分析

 

原创粉丝点击