算法导论 — 4.5 用主方法求解递归式

笔记

利用主定理可以对形如 T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n)的递归式直接求解。下面先给出主定理的描述。
  令 a ≥ 1 a ≥ 1 a1 b > 1 b > 1 b>1是常数, f ( n ) f(n) f(n)是一个函数, T ( n ) T(n) T(n)是定义在非负整数上的递归式:
       T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n)
  其中我们将 n / b n/b n/b解释为 ⌊ n / b ⌋ ⌊n/b⌋ n/b ⌈ n / b ⌉ ⌈n/b⌉ n/b。那么 T ( n ) T(n) T(n)有如下渐近界:
   若对某个常数 ε > 0 ε > 0 ε>0 f ( n ) = O ( n l o g b a − ε ) f(n)=O(n^{{\rm log}_{b}a-ε}) f(n)=O(nlogbaε),则 T ( n ) = Θ ( n l o g b a ) T(n)=Θ(n^{{\rm log}_{b}a}) T(n)=Θ(nlogba)
   若 f ( n ) = Θ ( n l o g b a ) f(n)=Θ(n^{{\rm log}_{b}a}) f(n)=Θ(nlogba),则 T ( n ) = Θ ( n l o g b a l g n ) T(n)=Θ(n^{{\rm log}_{b}a}{\rm lg}n) T(n)=Θ(nlogbalgn)
   若对某个常数 ε > 0 ε > 0 ε>0 f ( n ) = Ω ( n l o g b a + ε ) f(n)=Ω(n^{{\rm log}_{b}a+ε}) f(n)=Ω(nlogba+ε),且对某个常数 c < 1 c < 1 c<1和所有足够大的 n n n a f ( n / b ) ≤ c f ( n ) af(n/b) ≤ cf(n) af(n/b)cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=Θ(f(n)) T(n)=Θ(f(n))
  直观上来看,主定理是将函数 f ( n ) f(n) f(n) n l o g b a n^{{\rm log}_{b}a} nlogba进行比较。若 n l o g b a n^{{\rm log}_{b}a} nlogba渐近更大,则为情况1,解为 T ( n ) = Θ ( n l o g b a ) T(n)=Θ(n^{{\rm log}_{b}a}) T(n)=Θ(nlogba);若 f ( n ) f(n) f(n)渐近更大,则有可能为情况3,解为 T ( n ) = Θ ( f ( n ) ) T(n)=Θ(f(n)) T(n)=Θ(f(n));若 f ( n ) f(n) f(n) n l o g b a n^{{\rm log}_{b}a} nlogba渐近相等,则为情况2,解为 T ( n ) = Θ ( n l o g b a l g n ) T(n)=Θ(n^{{\rm log}_{b}a}{\rm lg}n) T(n)=Θ(nlogbalgn)
  需要注意的是,这里讲的“渐近大于或渐近小于”指的是“多项式意义上的渐近大于或渐近小于”。对于况1,并不是满足 f ( n ) f(n) f(n)渐近小于 n l o g b a n^{{\rm log}_{b}a} nlogba就够了,而是在“渐近小于”的基础上还要相差一个因子 n ε n^ε nε,即 f ( n ) = O ( n l o g b a − ε ) f(n)=O(n^{{\rm log}_{b}a-ε}) f(n)=O(nlogbaε),其中 ε ε ε是一个大于 0 0 0的常数。而在第3种情况中,也并不是满足 f ( n ) f(n) f(n)渐近大于 n l o g b a n^{{\rm log}_{b}a} nlogba就够了,而是在“渐近大于”的基础上还要相差一个因子 n ε n^ε nε,即 f ( n ) = Ω ( n l o g b a + ε ) f(n)=Ω(n^{{\rm log}_{b}a+ε}) f(n)=Ω(nlogba+ε)
  另外要注意的是,主定理的3种情况并未覆盖 f ( n ) f(n) f(n)的所有可能性。存在一些函数 f ( n ) f(n) f(n)并不属于3种情况中的任何一种,这时就不能应用主方法来求解递归式。
  下面通过例子来说明主方法的应用。
  先看递归式 T ( n ) = 9 T ( n / 3 ) + n T(n)=9T(n/3)+n T(n)=9T(n/3)+n。套用主定理,有 a = 9 , b = 3 a = 9, b = 3 a=9,b=3并且 f ( n ) = n f(n) = n f(n)=n,于是有 n l o g b a = n l o g 3 9 = n 2 n^{{\rm log}_{b}a}=n^{{\rm log}_{3}9}=n^2 nlogba=nlog39=n2。由于 f ( n ) = O ( n l o g b a − ε ) f(n)=O(n^{{\rm log}_{b}a-ε}) f(n)=O(nlogbaε),其中 ε = 1 ε = 1 ε=1,所以可以应用主定理的情况1,从而得到解 T ( n ) = Θ ( n l o g b a ) = Θ ( n 2 ) T(n)=Θ(n^{{\rm log}_{b}a})=Θ(n^2) T(n)=Θ(nlogba)=Θ(n2)
  再看一个递归式 T ( n ) = T ( 2 n / 3 ) + 1 T(n)=T(2n/3)+1 T(n)=T(2n/3)+1。套用主定理,有 a = 1 , b = 3 / 2 a = 1, b = 3/2 a=1,b=3/2并且 f ( n ) = 1 f(n) = 1 f(n)=1,于是有 n l o g b a = n l o g 3 / 2 1 = n 0 = 1 n^{{\rm log}_{b}a}=n^{{\rm log}_{3/2}1}=n^0=1 nlogba=nlog3/21=n0=1。由于 f ( n ) = Θ ( n l o g b a ) = Θ ( 1 ) f(n)=Θ(n^{{\rm log}_{b}a})=Θ(1) f(n)=Θ(nlogba)=Θ(1),所以可以应用主定理的情况2,从而得到解 T ( n ) = Θ ( n l o g b a l g n ) = Θ ( l g n ) T(n)=Θ(n^{{\rm log}_{b}a}{\rm lg}n)=Θ({\rm lg}n) T(n)=Θ(nlogbalgn)=Θ(lgn)
  再看递归式 T ( n ) = 3 T ( n / 4 ) + n l g n T(n)=3T(n/4)+n{\rm lg}n T(n)=3T(n/4)+nlgn。套用主定理,有 a = 3 , b = 4 a = 3, b = 4 a=3,b=4并且 f ( n ) = n l g n f(n) = n{\rm lg}n f(n)=nlgn,于是有 n l o g b a = n l o g 4 3 = O ( n 0.793 ) n^{{\rm log}_{b}a}=n^{{\rm log}_{4}3}=O(n^{0.793}) nlogba=nlog43=O(n0.793)。所以有 f ( n ) = n l g n = Ω ( n l o g b a + ε ) f(n)=n{\rm lg}n=Ω(n^{{\rm log}_{b}a+ε}) f(n)=nlgn=Ω(nlogba+ε),其中 ε ≈ 0.2 ε ≈ 0.2 ε0.2。并且当 3 / 4 ≤ c < 1 3/4 ≤ c < 1 3/4c<1时,有 a f ( n / b ) = 3 f ( n / 4 ) = 3 • ( n / 4 ) • l g ( n / 4 ) = ( 3 / 4 ) • n l g ( n / 4 ) ≤ c f ( n ) = c n l g n af(n/b) = 3f(n/4) = 3•(n/4)•{\rm lg}(n/4) = (3/4)•n{\rm lg}(n/4) ≤ cf(n) = cn{\rm lg}n af(n/b)=3f(n/4)=3(n/4)lg(n/4)=(3/4)nlg(n/4)cf(n)=cnlgn。所以可以应用主定理的情况3,从而得到解 T ( n ) = Θ ( f ( n ) ) = Θ ( n l g n ) T(n)=Θ(f(n))=Θ(n{\rm lg}n) T(n)=Θ(f(n))=Θ(nlgn)
  最后看一个递归式 T ( n ) = 2 T ( n / 2 ) + n l g n T(n)=2T(n/2)+n{\rm lg}n T(n)=2T(n/2)+nlgn。套用主定理,有 a = 2 , b = 2 a = 2, b = 2 a=2,b=2并且 f ( n ) = n l g n f(n) = n{\rm lg}n f(n)=nlgn,于是有 n l o g b a = n l o g 2 2 = n n^{{\rm log}_{b}a}=n^{{\rm log}_{2}2}=n nlogba=nlog22=n。虽然 f ( n ) = n l g n f(n) = n{\rm lg}n f(n)=nlgn渐近大于 n l o g b a = n n^{{\rm log}_{b}a}=n nlogba=n,但并不是“多项式意义上的渐近大于”,即不存在 ε > 0 ε > 0 ε>0,使得 f ( n ) = Ω ( n l o g b a + ε ) f(n)=Ω(n^{{\rm log}_{b}a+ε}) f(n)=Ω(nlogba+ε)。因此这个递归式不能应用主定理求解。

练习

4.5-1 对下列递归式,使用主方法求出渐近紧确界。
  a. T ( n ) = 2 T ( n / 4 ) + 1 T(n)=2T(n/4)+1 T(n)=2T(n/4)+1
  b. T ( n ) = 2 T ( n / 4 ) + n T(n)=2T(n/4)+\sqrt{n} T(n)=2T(n/4)+n
  c. T ( n ) = 2 T ( n / 4 ) + n T(n)=2T(n/4)+n T(n)=2T(n/4)+n
  d. T ( n ) = 2 T ( n / 4 ) + n 2 T(n)=2T(n/4)+n^2 T(n)=2T(n/4)+n2
  
  a.
  应用主定理,根据递归式有 a = 2 , b = 4 , f ( n ) = 1 a = 2, b = 4, f(n) = 1 a=2,b=4,f(n)=1,所以有 n l o g b a = n l o g 4 2 = n 1 / 2 n^{{\rm log}_{b}a}=n^{{\rm log}_{4}2}=n^{1/2} nlogba=nlog42=n1/2。于是有 f ( n ) = 1 = O ( n 1 / 2 − ε ) = O ( n l o g b a − ε ) f(n)=1=O(n^{1/2-ε})=O(n^{{\rm log}_{b}a-ε}) f(n)=1=O(n1/2ε)=O(nlogbaε),其中 ε = 1 / 2 ε = 1/2 ε=1/2。因此,可以应用主定理情况1,于是 T ( n ) = Θ ( n l o g b a ) = Θ ( n 1 / 2 ) T(n)=Θ(n^{{\rm log}_{b}a})=Θ(n^{1/2}) T(n)=Θ(nlogba)=Θ(n1/2)
  b.
  应用主定理,根据递归式有 a = 2 , b = 4 , f ( n ) = n = n 1 / 2 a = 2, b = 4, f(n) =\sqrt{n}=n^{1/2} a=2,b=4,f(n)=n =n1/2,所以有 n l o g b a = n l o g 4 2 = n 1 / 2 n^{{\rm log}_{b}a}=n^{{\rm log}_{4}2}=n^{1/2} nlogba=nlog42=n1/2。于是有 f ( n ) = n 1 / 2 = Θ ( n 1 / 2 ) = Θ ( n l o g b a ) f(n)=n^{1/2}=Θ(n^{1/2})=Θ(n^{{\rm log}_{b}a}) f(n)=n1/2=Θ(n1/2)=Θ(nlogba)。因此,可以应用主定理情况2,于是 T ( n ) = Θ ( n l o g b a l g n ) = Θ ( n 1 / 2 l g n ) T(n)=Θ(n^{{\rm log}_{b}a}{\rm lg}n)=Θ(n^{1/2}{\rm lg}n) T(n)=Θ(nlogbalgn)=Θ(n1/2lgn)
  c.
  应用主定理,根据递归式有 a = 2 , b = 4 , f ( n ) = n a = 2, b = 4, f(n) = n a=2,b=4,f(n)=n,所以有 n l o g b a = n l o g 4 2 = n 1 / 2 n^{{\rm log}_{b}a}=n^{{\rm log}_{4}2}=n^{1/2} nlogba=nlog42=n1/2。于是有 f ( n ) = n = Ω ( n 1 / 2 + ε ) = Ω ( n l o g b a + ε ) f(n)=n=Ω(n^{1/2+ε})=Ω(n^{{\rm log}_{b}a+ε}) f(n)=n=Ω(n1/2+ε)=Ω(nlogba+ε),其中 ε = 1 / 2 ε = 1/2 ε=1/2。并且当 1 / 2 ≤ c < 1 1/2 ≤ c < 1 1/2c<1时,有 a f ( n / b ) = 2 f ( n / 4 ) = 2 • ( n / 4 ) = n / 2 ≤ c f ( n ) = c n af(n/b) = 2f(n/4) = 2•(n/4) = n/2 ≤ cf(n) = cn af(n/b)=2f(n/4)=2(n/4)=n/2cf(n)=cn。因此,可以应用主定理情况3,于是 T ( n ) = Θ ( f ( n ) ) = Θ ( n ) T(n) = Θ(f(n)) = Θ(n) T(n)=Θ(f(n))=Θ(n)
  d.
  应用主定理,根据递归式有 a = 2 , b = 4 , f ( n ) = n 2 a = 2, b = 4, f(n) = n^2 a=2,b=4,f(n)=n2,所以有 n l o g b a = n l o g 4 2 = n 1 / 2 n^{{\rm log}_{b}a}=n^{{\rm log}_{4}2}=n^{1/2} nlogba=nlog42=n1/2。于是有 f ( n ) = n 2 = Ω ( n 1 / 2 + ε ) = Ω ( n l o g b a + ε ) f(n)=n^2=Ω(n^{1/2+ε})=Ω(n^{{\rm log}_{b}a+ε}) f(n)=n2=Ω(n1/2+ε)=Ω(nlogba+ε),其中 ε = 3 / 2 ε = 3/2 ε=3/2。并且当 1 / 8 ≤ c < 1 1/8 ≤ c < 1 1/8c<1时,有 a f ( n / b ) = 2 f ( n / 4 ) = 2 • ( n / 4 ) 2 = n / 8 ≤ c f ( n ) = c n af(n/b) = 2f(n/4) = 2•(n/4)^2 = n/8 ≤ cf(n) = cn af(n/b)=2f(n/4)=2(n/4)2=n/8cf(n)=cn。因此,可以应用主定理情况3,于是 T ( n ) = Θ ( f ( n ) ) = Θ ( n 2 ) T(n) = Θ(f(n)) = Θ(n^2) T(n)=Θ(f(n))=Θ(n2)

4.5-2 Caesar教授想设计一个渐近快于Strassen算法的矩阵相乘算法。他的算法使用分治法,将每个矩阵分解为n/4 × n/4的子矩阵,分解和合并步骤共花费 Θ ( n 2 ) Θ(n^2) Θ(n2)时间。他需要确定,他的算法需要创建多少个子问题,才能击败Strassen算法。如果他的算法创建 a a a个子问题,则描述运行时间 T ( n ) T(n) T(n)的递归式为 T ( n ) = a T ( n / 4 ) + Θ ( n 2 ) T(n) = aT(n/4) + Θ(n^2) T(n)=aT(n/4)+Θ(n2)。Caesar教授的算法如果要渐近快于Strassen算法, a a a的最大整数值应是多少?
  
  对递归式 T ( n ) = a T ( n / 4 ) + Θ ( n 2 ) T(n) = aT(n/4) + Θ(n^2) T(n)=aT(n/4)+Θ(n2)应用主定理,有 b = 4 , f ( n ) = Θ ( n 2 ) b = 4, f(n) = Θ(n^2) b=4,f(n)=Θ(n2),所以有 n l o g b a = n l o g 4 a n^{{\rm log}_{b}a}=n^{{\rm log}_{4}a} nlogba=nlog4a
  Strassen算法的时间为 n l g 7 n^{{\rm lg}7} nlg7。要让新算法的时间小于 n l g 7 n^{{\rm lg}7} nlg7,必须满足 n l o g 4 a < n l g 7 n^{{\rm log}_{4}a}nlog4a<nlg7,得到 a < 49 a < 49 a<49。因此, a a a的最大值为 48 48 48

4.5-3 使用主方法证明:二分查找递归式 T ( n ) = T ( n / 2 ) + Θ ( 1 ) T(n) = T(n/2) + Θ(1) T(n)=T(n/2)+Θ(1)的解是 T ( n ) = Θ ( l g n ) T(n) = Θ({\rm lg}n) T(n)=Θ(lgn)。(二分查找的描述见练习2.3-5)。
  
  应用主定理,根据递归式有 a = 1 , b = 2 , f ( n ) = Θ ( 1 ) a = 1, b = 2, f(n) = Θ(1) a=1,b=2,f(n)=Θ(1),所以有 n l o g b a = n l o g 2 1 = n 0 = 1 n^{{\rm log}_{b}a}=n^{{\rm log}_{2}1}=n^0=1 nlogba=nlog21=n0=1。于是有 f ( n ) = Θ ( 1 ) = Θ ( n l o g b a ) f(n)=Θ(1)=Θ(n^{{\rm log}_{b}a}) f(n)=Θ(1)=Θ(nlogba)。因此,可以应用主定理情况2,于是 T ( n ) = Θ ( n l o g b a l g n ) = Θ ( l g n ) T(n)=Θ(n^{{\rm log}_{b}a}{\rm lg}n)=Θ({\rm lg}n) T(n)=Θ(nlogbalgn)=Θ(lgn)

4.5-4 主方法能应用于递归式 T ( n ) = 4 T ( n / 2 ) + n 2 l g n T(n) = 4T(n/2) + n^2{\rm lg}n T(n)=4T(n/2)+n2lgn吗?请说明为什么可以或者为什么不可以。给出这个递归式的一个渐近上界。
  
  应用主定理,根据递归式有 a = 4 , b = 2 , f ( n ) = n 2 l g n a = 4, b = 2, f(n) = n^2{\rm lg}n a=4,b=2,f(n)=n2lgn,所以有 n l o g b a = n l o g 2 4 = n 2 n^{{\rm log}_{b}a}=n^{{\rm log}_{2}4}=n^2 nlogba=nlog24=n2。虽然 f ( n ) = n 2 l g n f(n) = n^2{\rm lg}n f(n)=n2lgn渐近大于 n l o g b a = n 2 n^{{\rm log}_{b}a}=n^2 nlogba=n2,但不是多项式意义上的渐近大于,即不存在 ε > 0 ε > 0 ε>0,使得 f ( n ) = Ω ( n l o g b a + ε ) f(n)=Ω(n^{{\rm log}_{b}a+ε}) f(n)=Ω(nlogba+ε)。因此该递归式不能应用主定理求解。考虑用递归树方法求解。创建递归树,如下图所示。
  算法导论 — 4.5 用主方法求解递归式_第1张图片
  在递归树中,深度为 i i i的结点对应规模为 n / 2 i n/2^i n/2i的子问题。当 n / 2 i = 1 n/2^i = 1 n/2i=1时,即 i = l g n i = {\rm lg}n i=lgn时,子问题规模变为 1 1 1,这对应于叶结点 T ( 1 ) T(1) T(1),因此树的高度 h = l g n h = {\rm lg}n h=lgn
  每层的结点数都是上一层的 4 4 4倍,因此深度为 i i i的结点数为 4 i 4^i 4i。深度为 i i i的结点对应的子问题规模为 n / 2 i n/2^i n/2i,除叶结点外,深度为 i i i的每个结点的代价为 ( n / 2 i ) 2 • l g ( n / 2 i ) (n/2^i)^2•{\rm lg}(n/2^i) (n/2i)2lg(n/2i)。因此,除叶结点外,深度为 i i i的所有结点的代价为 4 i • ( n / 2 i ) 2 • l g ( n / 2 i ) = n 2 • l g ( n / 2 i ) = n 2 ( l g n − i ) 4^i•(n/2^i)^2•{\rm lg}(n/2^i)=n^2•{\rm lg}(n/2^i)=n^2({\rm lg}n-i) 4i(n/2i)2lg(n/2i)=n2lg(n/2i)=n2(lgni)。叶结点一共有 4 l g n = n 2 4^{{\rm lg}n}=n^2 4lgn=n2个,所以叶结点那一层的代价为 Θ ( n 2 ) Θ(n^2) Θ(n2)
  现在将每一层的代价加起来,得到
  在这里插入图片描述
  下面用代入法验证这一结果。我们要证明的是:存在正常数 c c c,使得 T ( n ) ≤ c n 2 l g 2 n T(n)≤cn^2{\rm lg}^2n T(n)cn2lg2n对足够大的 n n n都成立。
  取初始情况 T ( 1 ) = 1 T(1) = 1 T(1)=1。无论取 c c c为多少,都不能使得 T ( 1 ) ≤ c • 1 2 • l g 2 1 = 0 T(1) ≤ c•1^2•{\rm lg}^21 = 0 T(1)c12lg21=0成立。于是我们要取初始情况为 T ( 2 ) T(2) T(2)。根据递归式,有 T ( 2 ) = 4 T ( 1 ) + 1 2 • l g 1 = 4 T(2) = 4T(1) + 1^2•{\rm lg}1 = 4 T(2)=4T(1)+12lg1=4。只要取 c ≥ 1 c ≥ 1 c1,就能使得 T ( 2 ) ≤ c • 2 2 • l g 2 2 = 4 c T(2) ≤ c•2^2•{\rm lg}^22 = 4c T(2)c22lg22=4c成立。
  现在考虑 n ≥ 3 n ≥ 3 n3的情况。假设 T ( n ) ≤ c n 2 l g 2 n T(n)≤cn^2{\rm lg}^2n T(n)cn2lg2n 2 , 3 , … , n − 1 2, 3, …, n−1 2,3,,n1都成立,于是有
  算法导论 — 4.5 用主方法求解递归式_第2张图片
  现在要选取合适的 c c c,使得不等式 c n 2 l g 2 n − 2 c n 2 l g n + c n 2 + n 2 l g n ≤ c n 2 l g 2 n cn^2{\rm lg}^2 n-2cn^2{\rm lg}n+cn^2+n^2{\rm lg}n≤cn^2{\rm lg}^2n cn2lg2n2cn2lgn+cn2+n2lgncn2lg2n成立。对该不等式做一下变换。
  在这里插入图片描述
  当 n ≥ 3 n ≥ 3 n3时, 1 2 − 1 / l g n \frac{1}{2-1/{\rm lg}n} 21/lgn1是单调递减的,并且在 n = 3 n = 3 n=3时取得最大值 1 2 − l o g 3 2 \frac{1}{2-{\rm log}_32} 2log321。因此,只要取 c ≥ 1 2 − l o g 3 2 c≥\frac{1}{2-{\rm log}_32} c2log321,就能使得不等式 c n 2 l g 2 n − 2 c n 2 l g n + c n 2 + n 2 l g n ≤ c n 2 l g 2 n cn^2{\rm lg}^2 n-2cn^2{\rm lg}n+cn^2+n^2{\rm lg}n≤cn^2{\rm lg}^2n cn2lg2n2cn2lgn+cn2+n2lgncn2lg2n成立,此时 T ( n ) ≤ c n 2 l g 2 n T(n)≤cn^2{\rm lg}^2n T(n)cn2lg2n成立。
  综合考虑初始情况 T ( 2 ) T(2) T(2),我们最终要取 c ≥ 1 c≥1 c1。于是 T ( n ) = O ( n 2 l g 2 n ) T(n)=O(n^2{\rm lg}^2n) T(n)=O(n2lg2n)得证。

4.5-5 考虑主定理情况3的一部分:对某个常数 c < 1 c < 1 c<1,正则条件 a f ( n / b ) ≤ c f ( n ) af(n/b) ≤ cf(n) af(n/b)cf(n)是否成立。给出一个例子,其中常数 a ≥ 1 , b > 1 a ≥ 1,b > 1 a1b>1且函数 f ( n ) f(n) f(n)满足主定理情况3中除正则条件外的所有条件。
  

你可能感兴趣的:(算法导论)