第二章 递归与分治策略

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HackQ_sxj/article/details/80560430

思想:将一个难以解决的大问题分割成一些规模较小的相同问题,以便各个击破,分而治之。而后求出小规模问题的解,逐步合并为原来的问题的解。

  递归算法:直接或间接的调用自身的算法

  分治法:将大问题分解成小问题,反复使用分治手段,可使子问题与原问题类型一致而其规模不断缩小,最终使子问题缩小到很容易直接求解。这自然导致了递归过程的产生。

  递归与分治如孪生兄弟,常同时应用在算法设计中。

  分治法适用问题多为

  *该问题的规模缩小到一定程度就可以容易的解决。

  *该问题可以分解为若干个规模较小的相同问题。

  *利用该问题分解出的子问题的解可以合并为该问题的解。

  *该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

1.整数划分问题

  若n = n1+n1+...+nk, (n1>=n2>=...>=nk>=1, k>=1)。将最大加数n1不大于m的划分个数记做q(n, m)

2.二分搜索技术

  思想:令所查找元素为x,与有序数组a的中间元素a[mid]比较

  若x=a[mid],则xL中的位置就是mid

  如果x<a[mid],则xa[mid]的前面,二分查找a[p:mid-1]

  如果x>a[mid],则xa[mid]的后面,二分查找a[mid+1:p]

3.快速排序

在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面的单元,总的比较和移动次数较少。对于输入的数组a[p:r],做法为:

*分解:以a[p]为基准元素将a[p: r]划分成三部分,分别为a[p: q-1], a[q] a[q+1:r], 使得a[p: q-1]中任一元素不大于 a[q], a[q+1:r]中任一元素不小于 a[q]

*递归求解:分别对a[p:q-1]a[q+1:r]进行递归排序。

*合并:将排好序的a[p:q-1]a[q+1:r]合并,得到a[p:r]

4.归并排序

n个元素分成2个子集合,分别对子集合进行排序,最终将排好序的子集合合并为有序集合。n=1是中止。

5.棋盘覆盖

k>0时,将2k×2k棋盘分割为42k-1×2k-1 子棋盘。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为将无特殊方格子棋盘转化为特殊棋盘,可以用一个骨牌覆盖3个较小棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1 

猜你喜欢

转载自blog.csdn.net/HackQ_sxj/article/details/80560430