算法设计与分析(屈婉玲) Lesson 2 递归

文章目录

  • 一.序列求和的方法
    • 1.序列求和公式
    • 2.放大法
  • 二.递推方程与算法分析
    • 1.递推方程
    • 2.递推方程与算法复杂度的关系
  • 三.迭代法求解递推方程
    • 1.直接迭代
    • 2.换元迭代
    • 3.使用数学归纳法进行验证
  • 四.差消法化简高阶递推方程
  • 五.递归树
  • 六.主定理
    • 1.主定理
    • 2.使用主定理求解递推方程
  • 七.习题

一.序列求和的方法

1.序列求和公式

  • 公式

    a.等差数列: ∑ k = 1 n a k = n ( a 1 + a n ) 2 \sum_{k=1}^{n}a_k = \frac{n(a_1+a_n)}{2} k=1nak=2n(a1+an)

    b.等比数列:

    有限项: ∑ k = 0 n a q k = a ( 1 − q n + 1 ) 1 − q \sum_{k=0}^{n}aq^k = \frac{a(1-q^{n+1})}{1-q} k=0naqk=1qa(1qn+1)

    无限项: ∑ k = 0 ∞ a q k = a 1 − q ( q < 1 ) \sum_{k=0}^\infty aq^k = \frac{a}{1-q}(q<1) k=0aqk=1qa(q<1)

    c.调和级数: ∑ k = 1 n 1 k = ln ⁡ n + O ( 1 ) \sum_{k=1}^{n}\frac1k = \ln n+O(1) k=1nk1=lnn+O(1)

  • e . g . e.g. e.g.

    ∑ t = 1 k t 2 t − 1 \sum_{t=1}^{k}t2^{t-1} t=1kt2t1

    ∑ t = 1 k t 2 t − 1 = ∑ t = 1 k t ( 2 t − 2 t − 1 ) − 拆项 = ∑ t = 1 k t 2 t − ∑ t = 1 k t 2 t − 1 = ∑ t = 1 k t 2 t − ∑ t = 0 k − 1 ( t + 1 ) 2 t − 变限 = ∑ t = 1 k t 2 t − ∑ t = 0 k − 1 t 2 t − ∑ t = 0 k − 1 2 t = k 2 k − ( 2 k − 1 ) = ( k − 1 ) 2 k + 1 \begin{align} &\sum_{t=1}^{k}t2^{t-1}\notag =\sum_{t=1}^{k}t(2^t-2^{t-1})-拆项\\\notag &=\sum_{t=1}^{k}t2^t-\sum_{t=1}^{k}t2^{t-1}\\\notag &=\sum_{t=1}^{k}t2^t-\sum_{t=0}^{k-1}(t+1)2^t-变限\\\notag &=\sum_{t=1}^{k}t2^t-\sum_{t=0}^{k-1}t2^t-\sum_{t=0}^{k-1}2^t\\\notag &=k2^k-(2^k-1)\\\notag &=(k-1)2^k+1 \end{align} t=1kt2t1=t=1kt(2t2t1)拆项=t=1kt2tt=1kt2t1=t=1kt2tt=0k1(t+1)2t变限=t=1kt2tt=0k1t2tt=0k12t=k2k(2k1)=(k1)2k+1

  • 计算二分检索算法的平均时间复杂度

    算法: BinarySearch(T,l,r,x)

    输入:数组T,下标从l到r,数x

    输出:j

    伪代码:

    while l<=r do
    m <- ceil((l+r)/2)
    if T[m]=x then
    	return m
    else
    	if T[m]>x then
    		r<-m-1
    	else
    		l<-m+1
    return 0;
    

    n = 2 k − 1 n = 2^k-1 n=2k1,n为数组长度,传入参数l = 1,r = n,x有2n+1种。其中x=T[1]…T[n]有n种,xT[n]有n+1种。设各种输入概率相同,以比较为基本运算,求平均时间复杂度

    首先考虑在数组中的元素。落在正中只需比较1次,有一个元素满足;落在 1 4 \frac14 41处需比较2次,有二个元素满足;落在 1 8 \frac18 81处需要比较3次,有八个元素满足…注意到 n = 2 k − 1 = ∑ i = 0 k − 1 2 k n=2^k-1 = \sum_{i=0}^{k-1}2^k n=2k1=i=0k12k,因此最多查找k次就可以遍历到数组中的所有元素。因此需要比较的总次数为 ∑ i = 0 k − 1 ( k + 1 ) 2 k \sum_{i=0}^{k-1}(k+1)2^k i=0k1(k+1)2k,其中k+1为比较次数, 2 k 2^k 2k为满足的元素个数。

    然后考虑不在数组中的元素,所有不在数组中的元素都需要比较k次才能找出来;因此比较的总次数为(n+1)*k。

    因此比较的总次数为
    ∑ i = 0 k − 1 ( k + 1 ) 2 k + ( n + 1 ) k = ∑ i = 1 k k 2 k − 1 + ( n + 1 ) k = ( k − 1 ) 2 k + 1 + ( n + 1 ) ∗ k = ( k − 1 ) 2 k + k ∗ 2 k + 1 = ( 2 k − 1 ) 2 k + 1 \begin{align} &\sum_{i=0}^{k-1}(k+1)2^k+(n+1)k \notag \\\notag &=\sum_{i=1}^{k}k2^{k-1}+(n+1)k \\\notag &= (k-1)2^k+1+(n+1)*k \\\notag &= (k-1)2^k+k*2^k+1\notag \\ &=(2k-1)2^k+1\notag \end{align} i=0k1(k+1)2k+(n+1)k=i=1kk2k1+(n+1)k=(k1)2k+1+(n+1)k=(k1)2k+k2k+1=(2k1)2k+1

    因为元素在各个位置的概率相等,因此
    A ( n ) = 1 2 n + 1 ( ( 2 k − 1 ) 2 k + 1 ) = 1 2 ∗ 2 k − 1 ( ( 2 k − 1 ) 2 k + 1 ) = f ( k ) ≈ O ( log ⁡ n ) \begin{align} &A(n) = \frac1{2n+1}((2k-1)2^k+1) \notag \\&= \frac1{2*2^k-1}((2k-1)2^k+1)\notag \\&= f(k)\notag \\\notag &\approx O(\log n) \end{align} A(n)=2n+11((2k1)2k+1)=22k11((2k1)2k+1)=f(k)O(logn)

2.放大法

  • 两种放大法的公式
    1. ∑ k = 1 n a k ≤ n a m a x 2. 若数列 a 满足 a k + 1 a k ≤ r ,则 ∑ k = 0 n a k < ∑ k = 0 ∞ a k < a 0 1 − r 1.\sum _{k=1}^{n}a_k\le na_{max}\\ 2.若数列a满足\frac{a_{k+1}}{a_k}\le r,则\sum_{k=0}^{n}a_k<\sum_{k=0}^{\infty}a_k <\frac{a_0}{1-r} 1.k=1naknamax2.若数列a满足akak+1r,则k=0nak<k=0ak<1ra0

  • e . g . e.g. e.g.

    估计 ∑ k = 1 n k 3 k \sum_{k=1}^{n}\frac{k}{3^k} k=1n3kk的上界

    k + 1 3 k + 1 ∗ 3 k k = 1 3 ( 1 + 1 k ) ≤ 2 3 ∑ k = 1 n k 3 k < 1 3 ∗ 1 1 − 2 3 = 1 \frac{k+1}{3^{k+1}}*\frac{3^k}{k} = \frac13(1+\frac1k)\le\frac23\\ \sum_{k=1}^{n}\frac{k}{3^k}<\frac13*\frac{1}{1-\frac23} = 1 3k+1k+1k3k=31(1+k1)32k=1n3kk<311321=1

二.递推方程与算法分析

1.递推方程

设序列为 a 0 , a 1 , … , a n , … a_0,a_1,\dots,a_n,\dots a0,a1,,an,,简记为 a n {a_n} an,一个把 a n a_n an与某些 a i ( i ∈ [ 0 , n − 1 ] ) a_i(i\in[0,n-1]) ai(i[0,n1])联系起来的等式叫做关于序列 a n {a_n} an的递推方程。

  • e . g . e.g. e.g.

    Fibonacci数 递推方程: f n = f n − 1 + f n − 2 f_n = f_{n-1}+f_{n-2} fn=fn1+fn2;初值: f 0 = 1 , f 1 = 1 f_0=1,f_1=1 f0=1,f1=1

    解: f n = 1 5 ( 1 + 5 2 ) n + 1 − 1 5 ( 1 − 5 2 ) n + 1 f_n = \frac1{\sqrt 5}(\frac{1+\sqrt 5}2)^{n+1}-\frac1{\sqrt 5}(\frac{1-\sqrt 5}2)^{n+1} fn=5 1(21+5 )n+15 1(215 )n+1

2.递推方程与算法复杂度的关系

  • 汉诺塔问题

    算法设计与分析(屈婉玲) Lesson 2 递归_第1张图片

    n个盘子从大到小顺序放在A柱上,要把它们从A移动到C,每次移动1个盘子,移动时不允许大盘压在小盘上,设计一种移动方法

    思路:将n-1个盘子从A移动到B,将最大的盘子移动到C,最后将n-1个盘子从B移动到C。

    伪代码为

    Hanoi(A,C,n)//从A移动到C,n个盘子
    if n = 1 then
    	move from A to C
    else 
    	Hanoi(A,B,n-1)
    	move from A to C
    	Hanoi(B,c,n-1)
    

    以一个盘子移动一次为基本操作,则n个盘子的移动次数为
    T ( n ) = 2 T ( n − 1 ) + 1 ; 其中 T ( 1 ) = 1 解得 T ( n ) = 2 n − 1 T(n) = 2T(n-1)+1;其中T(1)=1\\ 解得T(n) = 2^n-1 T(n)=2T(n1)+1;其中T(1)=1解得T(n)=2n1

  • 插入排序

    算法:InsertSort(A,n)

    输入:数组A,数组大小n

    输出:排好序的数组A

    伪代码:

    for j<-2 to n do
    	x<-A[j]
    	i<-j-1  //把A[j]插入
    	while i>0 and x

    以一次比较为基本运算,求算法的最差时间复杂度

    思路:可以从递归的角度来分析,对于n个元素的数组来说,排列n个元素等于先排列好前面n-1个元素,再排列最后的元素。在最坏情况下,最后的元素需要比较n-1次。因此我们得到了递推方程为 W ( n ) = W ( n − 1 ) + n − 1 W(n) = W(n-1)+n-1 W(n)=W(n1)+n1。解得 W ( n ) = n ( n − 1 ) 2 = O ( n 2 ) W(n) = \frac{n(n-1)}{2} = O(n^2) W(n)=2n(n1)=O(n2)

三.迭代法求解递推方程

不断用递推方程的右部替换左部;

每次替换,随着n的降低在和式中多处一项;

直到出现初值停止迭代;

将初值带入并对和式求和;

可以用数学归纳法来验证解的正确性

1.直接迭代

  • 汉诺塔算法

    T(n) = 2T(n-1)+1;T(1) = 1

    T ( n ) = 2 T ( n − 1 ) + 1 = 2 [ 2 T ( n − 2 ) + 1 ] + 1 = 2 2 T ( n − 2 ) + 2 + 1 … = 2 n − 1 T ( 1 ) + 2 n − 2 + 2 n − 3 + ⋯ + 1 = 2 n − 1 + ( 2 n − 1 − 1 ) = 2 n − 1 \begin{align}\notag &T(n) = 2T(n-1)+1\\\notag &=2[2T(n-2)+1]+1\\\notag &=2^2T(n-2)+2+1\\\notag &\dots\\\notag &=2^{n-1}T(1)+2^{n-2}+2^{n-3}+\dots+1\\\notag &=2^{n-1} +(2^{n-1}-1)\\\notag &=2^n-1 \end{align} T(n)=2T(n1)+1=2[2T(n2)+1]+1=22T(n2)+2+1=2n1T(1)+2n2+2n3++1=2n1+(2n11)=2n1

  • 插入排序算法

    W(n) = W(n-1)+n-1;W(n) = 0

    W ( n ) = W ( n − 1 ) + n − 1 = W ( n − 2 ) + n − 2 + n − 1 … = W ( 1 ) + 1 + ⋯ + n − 1 = ( n − 1 ) n 2 \begin{align}\notag &W(n) = W(n-1)+n-1\\\notag &=W(n-2)+n-2+n-1\\\notag &\dots\\\notag &=W(1)+1+\dots+n-1\\\notag &=\frac{(n-1)n}{2}\notag \end{align} W(n)=W(n1)+n1=W(n2)+n2+n1=W(1)+1++n1=2(n1)n

2.换元迭代

  • 二分归并排序

    算法:MergeSort(A,p,r)

    输入:数组A[p…r]

    输出:按照递增顺序排列的数组

    伪代码

    if p

    递推公式为W(n) = 2W(n/2)+n-1,W(1) = 0,求W(n),其中 n = 2 k n=2^k n=2k

    将n换元为n=2^k,方程变为 W ( 2 k ) = 2 W ( 2 k − 1 ) + n − 1 W(2^k) = 2W(2^{k-1})+n-1 W(2k)=2W(2k1)+n1

    W ( 2 k ) = 2 W ( 2 k − 1 ) + n − 1 = 2 [ 2 W ( 2 k − 2 + 2 k − 1 − 1 ) ] + 2 k − 1 = … = 2 k W ( 1 ) + k 2 k − ( 2 k − 1 + 2 k − 2 + ⋯ + 2 + 1 ) = k 2 k − 2 k + 1 = n log ⁡ n − n + 1 \begin{align}\notag &W(2^k) = 2W(2^{k-1})+n-1\\&=\notag 2[2W(2^{k-2}+2^{k-1}-1)]+2^k-1\\&\notag =\dots\\&=\notag 2^kW(1)+k2^k-(2^{k-1}+2^{k-2}+\dots+2+1)\\&=\notag k2^k-2^k+1\\&=\notag n\log n -n+1 \end{align} W(2k)=2W(2k1)+n1=2[2W(2k2+2k11)]+2k1==2kW(1)+k2k(2k1+2k2++2+1)=k2k2k+1=nlognn+1

3.使用数学归纳法进行验证

  • e . g . e.g. e.g.

    证明:递推方程的解为W(n) = n(n-1)/2;递推方程为:W(n) = W(n-1)+n-1;W(1) = 0

    使用数学归纳法证明: W ( 1 ) = 0 设对于 n , 解满足方程 W ( n + 1 ) = W ( n ) + n = n ( n − 1 ) 2 + n = n ( n + 1 ) 2 使用数学归纳法证明:\\ W(1) = 0\\ 设对于n,解满足方程\\ W(n+1) = W(n)+n = \frac{n(n-1)}{2}+n=\frac{n(n+1)}{2} 使用数学归纳法证明:W(1)=0设对于n,解满足方程W(n+1)=W(n)+n=2n(n1)+n=2n(n+1)

四.差消法化简高阶递推方程

  • 快速排序

    设A[p…r]的元素彼此不等,以首元素A[1]对数组进行划分,使得:

    小于x的元素放在A[p…q-1];大于x的元素放在A[q+1…r]

    递归对A[p…q-1]和A[q+1…r]进行排序,则

    工作量 = 子问题的工作量 + 划分工作量

    有n种可能的输入

    x排好序的位置 子问题1的规模 子问题2的规模
    1 0 n-1
    2 1 n-2
    n n-1 0

    其中对于每个输入,划分所需要的比较次数都为n-1(需要遍历比较数组中的其他元素)

    求快速排序的平均工作量T(n)

    首先计算总工作量,用总工作量除以n即可得到A(n)。
    T ( 0 ) + T ( n − 1 ) + n − 1 T ( 1 ) + T ( n − 2 ) + n − 1 … T ( n − 1 ) + T ( 0 ) + n − 1 \begin{align}\notag &T(0) +T(n-1)+n-1\\&\notag T(1) + T(n-2)+n-1\\&\notag \dots\\&\notag T(n-1)+T(0)+n-1 \end{align} T(0)+T(n1)+n1T(1)+T(n2)+n1T(n1)+T(0)+n1
    上面的n个式子累加得到
    2 ∑ i = 0 n − 1 T ( i ) + n ( n − 1 ) 2\sum_{i=0}^{n-1}T(i)+n(n-1) 2i=0n1T(i)+n(n1)
    因此平均工作量的递推表达式为
    T ( n ) = 1 n [ 2 ∑ i = 0 n − 1 T ( i ) + n ( n − 1 ) ] = 1 n ( 2 ∑ i = 0 n − 1 T ( i ) + c n ) \begin{align}\notag &T(n) =\frac1n[2\sum_{i=0}^{n-1}T(i)+n(n-1)]\\& = \frac1n(2\sum_{i=0}^{n-1}T(i)+cn)\notag \end{align} T(n)=n1[2i=0n1T(i)+n(n1)]=n1(2i=0n1T(i)+cn)

    计算上面的式子需要用到差消化简的技巧
    T ( n ) = 1 n ( 2 ∑ i = 0 n − 1 T ( i ) + c n ) T ( n − 1 ) = 1 n − 1 [ 2 ∑ i = 0 n − 2 T ( i ) + c ( n − 1 ) ] n T ( n ) − ( n − 1 ) T ( n − 1 ) = 2 ∑ i = 0 n − 1 T ( i ) + c n 2 − 2 ∑ i = 0 n − 2 T ( i ) + c ( n − 1 ) 2 = 2 T ( n − 1 ) + c 1 n T ( n ) n + 1 = T ( n − 1 ) n + c 1 n + 1 经过迭代化简得 T ( n ) = ( n + 1 ) c 1 ∑ i = 3 n + 1 1 i = Θ ( n log ⁡ n ) \begin{align}\notag &T(n) = \frac1n(2\sum_{i=0}^{n-1}T(i)+cn)\\&\notag \\&\notag T(n-1) = \frac1{n-1}[2\sum_{i=0}^{n-2}T(i)+c(n-1)]\\&\notag \\&\notag nT(n)-(n-1)T(n-1)\\&=\notag 2\sum_{i=0}^{n-1}T(i)+cn^2 - 2\sum_{i=0}^{n-2}T(i)+c(n-1)^2\\&=\notag 2T(n-1) +c_1n\\&\notag \\&\notag \frac{T(n)}{n+1} = \frac{T(n-1)}{n}+\frac{c_1}{n+1}\\&\notag 经过迭代化简得 \\&T(n) = (n+1)c_1\sum_{i=3}^{n+1}\frac1i = \Theta(n\log n)\notag \end{align} T(n)=n1(2i=0n1T(i)+cn)T(n1)=n11[2i=0n2T(i)+c(n1)]nT(n)(n1)T(n1)=2i=0n1T(i)+cn22i=0n2T(i)+c(n1)2=2T(n1)+c1nn+1T(n)=nT(n1)+n+1c1经过迭代化简得T(n)=(n+1)c1i=3n+1i1=Θ(nlogn)

五.递归树

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

    若递归树上的某节点标记为W(m),且 W ( m ) = ∑ i = 1 t W ( m i ) + f ( m ) ⋯ + g ( m ) W(m) = \sum_{i=1}^{t}W(m_i)+f(m)\dots+g(m) W(m)=i=1tW(mi)+f(m)+g(m),则其中 W ( m i ) W(m_i) W(mi)称为函数项,W(m)可以表示如下图的形式

    算法设计与分析(屈婉玲) Lesson 2 递归_第2张图片

    e . g e.g e.g

    二分归并排序的递推方程为 W ( n ) = 2 W ( n 2 ) + n − 1 W( n) = 2W(\frac n2)+n-1 W(n)=2W(2n)+n1,试画出这个递推方程所对应的递归树

    算法设计与分析(屈婉玲) Lesson 2 递归_第3张图片

  • 递归树的生成

    • 初始,递归树只有根节点,其值为W(n)

    • 不断重复下述过程:

      将函数项叶节点的迭代式W(n)表示为二层子树

      用该子树替换叶节点

    • 继续递归树的生成,直到书中没有函数项(只有初值)为止

    e . g . e.g. e.g.

    生成 W ( n ) = 2 W ( n 2 ) + n − 1 W( n) = 2W(\frac n2)+n-1 W(n)=2W(2n)+n1的递归树

    第一步 W(n)->2 W(n/2)+n-1

    算法设计与分析(屈婉玲) Lesson 2 递归_第4张图片

    第二步W(n/2)->2 W(n/4)+n/2-1

    算法设计与分析(屈婉玲) Lesson 2 递归_第5张图片

    最后结果为

    算法设计与分析(屈婉玲) Lesson 2 递归_第6张图片

    可以看到,递归树的第一层的和为n-1,第二层为n-2,最后一层为 n − 2 k − 1 n-2^{k-1} n2k1,因此可以直观的求得递推方程的通式

  • e . g . e.g. e.g.

    利用递归树的方法求得 T ( n ) = T ( 1 3 ) + T ( 2 n 3 ) + n T(n)=T(\frac13)+T(\frac{2n}3)+n T(n)=T(31)+T(32n)+n的渐进上界

    得递归树如下图所示

    算法设计与分析(屈婉玲) Lesson 2 递归_第7张图片

    但是图中的递归树并不对称,左边短于右边。但由于求的是渐进上界,所以只需要按最多层数算即可。

    树的层数为 log ⁡ 3 2 n \log{\frac32}n log23n,因此 T ( n ) = Θ ( n log ⁡ n ) T(n) = \Theta(n\log n) T(n)=Θ(nlogn)

六.主定理

1.主定理

当递推方程的形式如下时,可以使用主定理

T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac nb)+f(n) T(n)=aT(bn)+f(n),其中a为规约后的子问题个数, n b \frac n b bn为归约后的子问题规模,f(n)为归约过程及子问题的解的工作量

  • 若 ∃ ϵ > 0 , s . t . f ( n ) = O ( n log ⁡ b a − ϵ ) , 那么 T ( n ) = Θ ( n log ⁡ b a ) 若\exists \epsilon >0,s.t. f(n) = O(n^{\log_ba-\epsilon}),那么T(n) = \Theta(n^{\log_ba}) ϵ>0,s.t.f(n)=O(nlogbaϵ),那么T(n)=Θ(nlogba)

  • 若 f ( n ) = Θ ( n log ⁡ b a ) , 那么 T ( n ) = Θ ( n log ⁡ b a log ⁡ n ) 若f(n) = \Theta(n^{\log_ba}),那么T(n) = \Theta(n^{\log_ba}\log n) f(n)=Θ(nlogba),那么T(n)=Θ(nlogbalogn)

  • 若 ∃ ϵ > 0 , s . t . f ( n ) = Ω ( n log ⁡ b a + ϵ ) , 且对于某个常数 c < 1 和充分大的 n ,满足 a f ( n b ) ≤ c f ( n ) , 那么 T ( n ) = Θ ( f ( n ) ) 若\exists \epsilon >0,s.t. f(n) = \Omega(n^{\log_ba+\epsilon}),且对于某个常数c<1和充分大的n,满足af(\frac nb)\le cf(n),那么T(n) = \Theta(f(n)) ϵ>0,s.t.f(n)=Ω(nlogba+ϵ),且对于某个常数c<1和充分大的n,满足af(bn)cf(n),那么T(n)=Θ(f(n))

    定理的三条分别代表f(n)的阶小于 n log ⁡ b a n^{\log _b a} nlogba、等于 n log ⁡ b a n^{\log _b a} nlogba和大于 n log ⁡ b a n^{\log _b a} nlogba的情况。其中大于 n log ⁡ b a n^{\log _b a} nlogba时,需要验证额外的条件

  • 证明略

2.使用主定理求解递推方程

  • 主定理第一条

    求解递推方程 T ( n ) = 9 T ( n 3 ) + n T(n) = 9T(\frac n3) + n T(n)=9T(3n)+n

    log ⁡ b a = log ⁡ 3 9 = 2 n = O ( n 2 ) T ( n ) = Θ ( n 2 ) \log_ba = \log_39 = 2\\ n=O(n^2)\\ T(n) = \Theta(n^2) logba=log39=2n=O(n2)T(n)=Θ(n2)

  • 主定理第二条

    求解递推方程 T ( n ) = T ( 2 n 3 ) + 1 T(n) =T(\frac{2n}{3})+1 T(n)=T(32n)+1

    log ⁡ b a = log ⁡ 3 2 1 = 0 1 = Θ ( 1 ) T ( n ) = Θ ( log ⁡ n ) \log_ba = \log_\frac 3 2 1 = 0\\ 1 = \Theta(1)\\ T(n) = \Theta(\log n) logba=log231=01=Θ(1)T(n)=Θ(logn)

  • 主定理第三条

    求解递推方程 T ( n ) = 3 T ( n 4 ) + n log ⁡ n T(n) = 3T(\frac n4)+n\log n T(n)=3T(4n)+nlogn

    log ⁡ b a = log ⁡ 4 3 < 1 n log ⁡ n = Ω ( n ) 验证条件 : 3 f ( n 4 ) = 3 4 n log ⁡ n 当 c ∈ [ 3 4 , 1 ) 时,有 3 f ( n 4 ) ≤ c f ( n ) T ( n ) = Θ ( n log ⁡ n ) \log_ba = \log_43 <1 \\ n\log n=\Omega(n)\\ 验证条件:\\ 3f(\frac n 4) = \frac 3 4 n\log n\\ 当c\in[\frac 34 ,1)时,有3f(\frac n 4)\le cf(n)\\ T(n) = \Theta(n\log n) logba=log43<1nlogn=Ω(n)验证条件:3f(4n)=43nlognc[43,1)时,有3f(4n)cf(n)T(n)=Θ(nlogn)

  • 不能使用主定理的例子

    求解递推方程 T ( n ) = 2 T ( n 2 ) + n log ⁡ n T(n) = 2T(\frac n 2)+n\log n T(n)=2T(2n)+nlogn

    log ⁡ b a = log ⁡ 2 2 = 1 n log ⁡ n = Ω ( n ) 验证条件 : a f ( n b ) = n log ⁡ n 不存在这样的 c ∈ ( 0 , 1 ) , 满足 a f ( n b ) ≤ c f ( n ) 因此不能使用主定理 \log _b a =\log_22 =1\\ n\log n=\Omega(n)\\ 验证条件:\\ af(\frac n b) = n\log n\\ 不存在这样的c\in(0,1),满足af(\frac n b)\le cf(n)\\ 因此不能使用主定理\\ logba=log22=1nlogn=Ω(n)验证条件:af(bn)=nlogn不存在这样的c(0,1),满足af(bn)cf(n)因此不能使用主定理

    可以使用递归树来求解。递推方程的递推树如下图

    算法设计与分析(屈婉玲) Lesson 2 递归_第8张图片

    然后根据递归树求解方程

T ( n ) = ∑ i = 0 k − 1 n ( log ⁡ n − i ) , 其中 k = log ⁡ n 则 T ( n ) = k ( n log ⁡ n ) − n [ k ( 0 + k − 1 ) 2 ] = n log ⁡ 2 n − n log ⁡ 2 n − log ⁡ n 2 = Θ ( n l o g 2 n ) T(n) = \sum_{i=0}^{k-1}n(\log n-i) ,其中k = \log n\\ 则T(n) = k (n\log n)-n[\frac {k(0+k-1)}2]\\ =n\log ^ 2 n-n\frac{\log ^2 n-\log n}{2} = \Theta(nlog^2n) T(n)=i=0k1n(logni),其中k=lognT(n)=k(nlogn)n[2k(0+k1)]=nlog2nn2log2nlogn=Θ(nlog2n)

七.习题

求解以下递推方程
T ( n ) = T ( n − 1 ) + n 2 ; 其中 T ( 1 ) = 1 T(n) = T(n-1)+n^2;其中T(1) = 1 T(n)=T(n1)+n2;其中T(1)=1

求解以下递推方程
T ( n ) = 9 T ( n 3 ) + n ; 其中 T ( 1 ) = 1 T(n) = 9T(\frac n 3)+n;其中T(1) = 1 T(n)=9T(3n)+n;其中T(1)=1

求解以下递推方程
T ( n ) = T ( n 2 ) + T ( n 4 ) + c n ; 其中 T ( 1 ) = 1 T(n) = T(\frac n2)+T(\frac n4)+cn;其中T(1) = 1 T(n)=T(2n)+T(4n)+cn;其中T(1)=1


参考答案(答案为笔者自己所做,限于水平,其中存在错误在所难免,欢迎大家指正)

思路:使用迭代法
T ( n ) = T ( n − 1 ) + n 2 = T ( n − 2 ) + ( n − 1 ) 2 + n 2 = … = T ( 1 ) + ∑ i = 0 n − 1 ( n − i ) 2 = ∑ i = 1 n i 2 \begin{align}\notag &T(n) = T(n-1)+n^2\\&=\notag T(n-2)+(n-1)^2+n^2\\&=\notag \dots\\&=\notag T(1)+\sum_{i=0}^{n-1}(n-i)^2\\&=\notag \sum_{i=1}^ni^2 \end{align} T(n)=T(n1)+n2=T(n2)+(n1)2+n2==T(1)+i=0n1(ni)2=i=1ni2

思路:使用主定理
log ⁡ b a = log ⁡ 3 9 = 2 n = O ( n 2 ) T ( n ) = Θ ( n 2 ) \log _ba = \log _3 9 = 2\\ n = O(n^2)\\ T(n) = \Theta(n^2) logba=log39=2n=O(n2)T(n)=Θ(n2)

思路:使用递归树

画出递归树后,第一层的和为cn,第二层的和为 3 4 c n \frac 3 4cn 43cn,第k层的和为 ( 3 4 ) k c n (\frac34)^kcn (43)kcn,而递归树最多有 log ⁡ n \log n logn层,因此有
T ( n ) ≤ ∑ i = 0 log ⁡ n 3 4 c n ≤ ∑ i = 0 ∞ 3 4 c n = 1 1 − 3 4 c n = Θ ( n ) T(n)\le\sum_{i=0}^{\log n}\frac 3 4 cn\le \sum_{i=0}^{\infty}\frac 3 4 cn = \frac{1}{1-\frac34}cn = \Theta(n) T(n)i=0logn43cni=043cn=1431cn=Θ(n)

你可能感兴趣的:(算法设计与分析,算法)