2.2 分治法的基本思想

来源:互联网 发布:mac鼠标滚轮没反应 编辑:程序博客网 时间:2024/05/30 12:30

2.2 分治法的基本思想

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。

它的一般的算法设计模式如下:

  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)

其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,…,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,…,Pk的相应的解y1,y2,…,yk合并为P的解。
子问题的划分:人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的k个子问题的处理方法是行之有效的。许多问题可以取 k = 2。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。
分治范式在每一层递归包括3个步骤:

  • 分解 将问题分解成若干个子问题。
  • 治理 递归地解决各子问题。不过若子问题的规模足够小,就以直接的方式(不再递归)解决子问题。
  • 合并 将子问题的解合并成原问题的一个解。

    递归是分治策略的基础。


0 0
原创粉丝点击