摘要訊息 : 使用替代法和歸納法解一個遞迴方程式.
0. 前言
在《分而治之演算法》中, 我們提到對採用了分而治之演算法的解決方案, 其時間複雜度可以寫成 T(n)={Θ(1)aT(bn)+D(n)+C(n)n≤cn>c. 要分析分而治之演算法的時間複雜度, 必須要解這個遞迴方程式.
更新紀錄 :
- 2022 年 5 月 29 日進行第一次更新和修正.
1. 替代法
替代法將所有運算式中包含遞迴的部分都進行替換, 使用非遞迴的運算式表示. 最終, 通過整理和合併得到遞迴方程式的非遞迴表示.
例題 1. 使用替代法求解遞迴方程式 f(n)={2f(n−1)+2n=0n≥1.
解 :當 n≥1 時, 有 f(n)=f(n−1)+2=f(n−2)+2+2=f(n−3)+2+2+2=...=n−2 個2+2+...+2+f(2)=n−1 個2+2+...+2+2+f(1)=n 個2+2+...+2+2+2+f(0)=n+1 個2+2+...+2=2n+2. 由於 n=0 的時候, f(0)=2 同樣滿足 f(n)=2n+2, 故當 n≥0 的時候, 有 f(n)=2n+2.
■
例題 2. 使用替代法求解遞迴方程式 f(n)={c1f(2n)+c2n=1n>1. 其中, c1 和 c2 為任意常數.
解 :當 n>1 時, 有 f(n)=f(2n)+c2=c2+c2+f(4n)=...=kc2+f(2kn). 當 2k=n 時, 有 f(n)=kc2+f(1)=kc2+c1. 而考慮到 k=log2n, 故 f(n)=c2log2n+c1.
■
例題 3. 使用替代法求解遞迴方程式 f(n)={caf(bn)+cnn=1n>1.
解 :僅考慮 n=bk 時的情況. 當 n>1 時, 有 f(n)=cn+af(an)=cn+a(af(b2n)+cbn)=a2f(b2n)+cn(ba+1)=a2(cb2n+af(b3n))+cn(ba+1)=a3f(b3n)+cn(b2a2+ba+1)=a3(cb3n+af(b4n)+cn(b2a2+ba+1))=a4f(b4n)+cn(b3a3+b2a2+ba+1)=...=akf(bkn)+cni=0∑k−1(ba)i. 當 bk=n 時, 有 f(n)=akf(1)+cni=0∑k−1(ba)i=akc+cni=1∑k−1(ba)i. 而 bkn=1, 故有 f(n)=akc+cni=1∑k−1(ba)i=akc⋅1+cni=1∑k−1(ba)i=akc⋅bkn+cni=1∑k−1(ba)i=(ba)k⋅cn+cni=0∑k−1(ba)i=cni=0∑k(ba)i.
顯然, ba 很大程度上影響了 f(n), 接下來我們討論 a 和 b 的取值. 當 a=b 時, 有 i=0∑k(ba)i=k+1; 當 a=b 時, 有 i=0∑k(ba)i=ba−1(ba)k+1−1=1−ba1−(ba)k+1. 當 a<b 時, 則 ba<1, 從而有 i=0∑k(ba)i=1−ba1−(ba)k+1<1−ba1. 當 a>b 時, 則有 i=0∑k(ba)i=ba−1(ba)k+1−1.
由於 k=logbn. 根據《漸近分析基礎》中的定義 3, 即 Θ 記法的定義, 當 a=b 時, 我們可以得到 i=0∑k(ba)i=k+1=logbn+1=Θ(logn). 當 a<b 時, 由於 n→∞lim1−ba1=n→∞lim1−kna1=1, 因此有 i=0∑k(ba)i≤1−ba1=Θ(1). 當 a>b 時, 經過縮放我們可以得到 ba−1(ba)k+1−1≥ba(ba)k+1−1≥ba(ba)k+1=(ba)k. 根據《漸近分析基礎》中的定義 4, 即小 o 記法的定義, 有 ba−1(ba)k+1−1≤ba−1(ba)k+1=t(t+1)k+1=ttk+1+o(tk+1)=tk+o(tk)=(ba)k+o((ba)k). 其中, t=ba−1. 結合《漸近分析基礎》中的定理 6, 即 Θ 記法比率定理, 於是有 i=0∑k(ba)i=Θ((ba)k)=Θ(blogbnalogbn). 對於 alogbn, 對其取自然對數可得 lnalogbn=logbnlna=lnblnnlna=lnblnalnn=logba⋅lnn=lnnlogba, 故 alogbn=nlogba. 那麼 i=0∑k(ba)i=Θ(blogbnalogbn)=Θ(nnlogba)=Θ(nlogba−1).
綜上所述, f(n)=cni=0∑k(ba)i=⎩⎪⎪⎨⎪⎪⎧Θ(n)Θ(nlogn)Θ(nlogba)a<ba=ba>b.
■
現在, 我們重新審視分而治之演算法的時間複雜度 T(n), 它可以更加詳細地表示為 T(n)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧Θ(1)Θ(n)+D(n)+C(n)Θ(nlogn)+D(n)+C(n)Θ(nlogba)+D(n)+C(n)n≤cn>c 且 a<bn>c 且 a=bn>c 且 a>b. 實際上我們可以看到, 例題 3 只是 T(n) 的一種特殊形式.
2. 查表法
如果我們記 g(n)=D(n)+C(n), 那麼 T(n) 實際上還可以進一步進行演算. 當 n≥c 時, 有 T(n)=aT(bn)+g(n)=a(aT(b2n)+g(bn))+g(n)=a2T(b2n)+ag(bn)+g(n)=...=akT(1)+i=0∑k−1aig(bin)(其中, k=logbn)=akT(1)+j=1∑kak−jg(bk−jn)(令 j=k−i)=akT(1)+j=1∑kak−jg(bjbkn)=akT(1)+j=1∑kak−jg(blogbnnbj)=akT(1)+j=1∑kak−jg(bj)=akT(1)+akj=1∑ka−jg(bj)=ak(T(1)+j=1∑ja−jg(bj)). 在例題 3 中, 我們已經得到 ak=alogbn=nlogba, 故有 T(n)=nlogba(T(1)+j=1∑kajg(bj)). 又因 aj=(blogba)j=(bj)logba, 因此有 T(n)=nlogba(T(1)+j=1∑k(bj)logbag(bj)). 記 h(n)=nlogbag(n), 則 T(n)=nlogba(T(1)+j=1∑kh(bj)). 再記 f(n)=j=1∑kh(bj), 最終有 T(n)=nlogba(T(1)+f(n)).
現在, 對於不同的 h(n), 我們可以使用查表法使用對應的 f(n) 進行替換 :
h(n) | f(n) |
O(nr) (r<0) | O(1) |
Θ(login) (i≥0) | Θ(i+1logi+1n) |
Ω(nr) (r>0) | Θ(h(n)) |
例題 4. 使用查表法計算 T(n)={c1T(2n)+c2n=1n>1.
解 :容易地, 我們得到 a=1,b=2,g(n)=c2. 因此, logba=0. 另外, 由於 h(n)=nlogbag(n)=c2=c2⋅log0n=Θ(1), 通過查表可知 f(n)=Θ(logn). 最終有 T(n)=Θ(logn).
■
例題 5. 使用查表法計算 T(n)={d7T(2n)+cn2n≤1n>1. 其中 log2n 為整數.
解 :通過觀察, 我們可以得到 a=7,b=2,g(n)=cn2. 因此, logba=log27. 另外, h(n)=nlogbag(n)=nlog27cn2=cn2−log27. 由於 2−log27<0, 故 h(n)=O(1). 通過查表可知, 對應的 f(n) 為 f(n)=O(1). 於是, T(n)=nlog27(T(1)+O(1))=Θ(nlog27).
■
3. 歸納法
使用歸納法求解遞迴方程式更多時候並不是在求解, 而是在驗證. 歸納法證明一個遞迴方程式的非遞迴表示成立, 基本步驟為 :
- 歸納基礎 : 這是歸納法的起始步驟. 對於一個或者多個基礎值進行結論的驗證, 檢驗結論是否成立;
- 歸納假設 : 假設 n≤k (或者 n<k) 時結論成立. 其中, k 為任意一個大於或者等於最大基礎值的整數;
- 歸納推遞 : 根據歸納假設, 證明當 n=k+1 (或者 n=k) 時, 結論成立;
- 綜合上述三個步驟的結論, 得出結論成立.
例題 6. 證明遞迴方程式 f(n)={2f(n−1)+3n=0n>0 滿足 f(n)=3n+2=Θ(n).
證明 :當 n=1 時, f(1)=3+f(0)=5.
不妨假設當 n≤k 時, f(n)=3n+2 成立.
當 n=k+1 時, 有 f(k+1)=3+f(k)=3+3k+2=3k+5. 因此, 當 n=k+1 時, 結論仍然成立.
綜上所述, f(n)=3n+2=Θ(n) 成立.
■