【算法设计与分析】第三章 递归与分治策略

分治和递归

  • 分治:分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
  • 递归:程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归

递归需要有边界条件、递归前进段和递归返回段。
(1)当边界条件不满足时,递归前进;
(2)当边界条件满足时,递归返回。
注意:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。

递归的缺点
(1)递归算法解题的运行效率较低。
(2)在递归调用过程中,系统为每一层的返回点、局部变量等开辟了堆栈来存储。递归次数过多容易造成堆栈溢出

分治

  • 分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同。
  • 递归地解这些子问题,然后将各子问题的解合并得到原问题的解

分治法在每一层递归上都有三个步骤:

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

分治法适用条件:

  • 该问题的规模缩小到一定的程度就可以容易地解决;
  • 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
  • 利用该问题分解出的子问题的解可以合并为该问题的解;
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

递归树

  • 递归树是迭代计算的模型
  • 递归树的生成过程与迭代过程一致
  • 递归树上所有项恰好是迭代之后产生和式中的项
  • 对递归树上的项求和就是迭代后方程的解.

迭代在递归树中的表示
如果递归树上某结点标记为W(m)。
W(m) = W(m1)+…+W(mt)+ f(m)+…+g(m),m1, … , mt< m
其中W(m1),…,W(mt)称为函数项.
在这里插入图片描述
递归树的生成规则

  • 初始,递归树只有根结点, 其值为W(n)
  • 不断继续下述过程:将函数项叶结点的迭代式W(m)表示成二层子树,用该子树替换该叶结点
  • 继续递归树的生成,直到树中无函数项(只有初值)为止

主定理及其证明

定理:设a>=1, b>1为常数, f(n)为函数, T(n)为非负整数,且T(n)=aT(n/b)+f(n), 则:

  1. f ( n ) = O ( n l o g b a ε ) , ε > 0 f(n)=O(n^{log_b^a-ε}), ε >0 , 那么 T ( n ) = θ ( n l o g b a ) T(n)=θ(nlog_b^a)
  2. f ( n ) = θ ( n l o g b a ) f(n)=θ(nlog_b^a) , 那么 T ( n ) = θ ( n l o g b a l o g n ) T(n)=θ(nlog_b^a log n)
  3. f ( n ) = Ω ( n l o g b a + ε ) , ε > 0 f(n)=Ω(n^log_b^a+ε), ε>0 ,且对于某个常数 c<1和充分大的 n 有 a f ( n / b ) < = c f ( n ) af(n/b)<=cf(n) , 那么 T ( n ) = θ ( f ( n ) ) T(n)=θ(f(n))
发布了328 篇原创文章 · 获赞 107 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43460224/article/details/104761534
今日推荐