利用主定理可以对形如 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 a≥1和 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/4≤c<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/2≤c<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/2≤cf(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/8≤c<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/8≤cf(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}
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+ε)。因此该递归式不能应用主定理求解。考虑用递归树方法求解。创建递归树,如下图所示。
在递归树中,深度为 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)2•lg(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)2•lg(n/2i)=n2•lg(n/2i)=n2(lgn−i)。叶结点一共有 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)≤c•12•lg21=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)+12•lg1=4。只要取 c ≥ 1 c ≥ 1 c≥1,就能使得 T ( 2 ) ≤ c • 2 2 • l g 2 2 = 4 c T(2) ≤ c•2^2•{\rm lg}^22 = 4c T(2)≤c•22•lg22=4c成立。
现在考虑 n ≥ 3 n ≥ 3 n≥3的情况。假设 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,…,n−1都成立,于是有
现在要选取合适的 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 cn2lg2n−2cn2lgn+cn2+n2lgn≤cn2lg2n成立。对该不等式做一下变换。
当 n ≥ 3 n ≥ 3 n≥3时, 1 2 − 1 / l g n \frac{1}{2-1/{\rm lg}n} 2−1/lgn1是单调递减的,并且在 n = 3 n = 3 n=3时取得最大值 1 2 − l o g 3 2 \frac{1}{2-{\rm log}_32} 2−log321。因此,只要取 c ≥ 1 2 − l o g 3 2 c≥\frac{1}{2-{\rm log}_32} c≥2−log321,就能使得不等式 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 cn2lg2n−2cn2lgn+cn2+n2lgn≤cn2lg2n成立,此时 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 c≥1。于是 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 a≥1,b>1且函数 f ( n ) f(n) f(n)满足主定理情况3中除正则条件外的所有条件。
略