Recurrence
<外傳>
- 某些問題隨輸入資料大小成指數成長是無法避免的
- 雖然「Divide-and-conquer」無法獲致良好的執行效率但仍可採用
- 河內塔問題
- 每呼叫一次就需搬動圓盤一次
- 當圓盤的個數 n 為 64
- 總共需要搬動圓盤 264−1 次
- 演算法的複雜度等級是 O(2n)
- 河內塔問題圓盤搬動次序與 n 成指數關係
- 經過証明,上述河內塔問題的演算法
- 為該問題的限制下最佳的演算法
Substitution method
Concept
以經驗猜測一個邊界(bound)。
假設子問題符合此邊界,證明母問題也符合此邊界。
適用時機
- 題目比分重。
- 單向;單邊:只需要證明 O,Ω 單向,不必證明 Θ 。
- 題目要求。
經典範例
Example - T(n)=2T(⌊n2⌋)+n,T(n)=O(?)
(Substitution method)猜:T(n)=O(nlgn)
已知 g(n)=2g(n2)+n=O(nlgn)
欲證 T(n)=O(nlgn),即證明 ∃C,n0>0∋n≥n0,T(n)≤C⋅nlgn
假設子問題 T(n)≤C⋅⌊n2⌋lg⌊n2⌋ 成立
考慮 T(n)=2⋅T(⌊n2⌋)+n≤2⋅C⋅⌊n2⌋lg⌊n2⌋+n
⇒T(n)=2⋅T(⌊n2⌋)+n≤2⋅C⋅n2lgn2+n
⇒T(n)=2⋅T(⌊n2⌋)+n≤C⋅n(lgn−lg2)+n=C⋅nlgn+(1−C)n
取 C≥2,T(n)=2⋅T(⌊n2⌋)+n≤C⋅nlgn
∴T(n)=O(nlgn)
Example(97成大資工) - 解 T(n)=2T(⌊√n⌋)+lgn, 用 O 表示 - (比分重、單邊、⌊⌋) - 考慮使用「Substitution method」而不使用疊代法
lgnlglgn
Recurrence tree
- 名詞解釋
- T(n)=T(n3)+T(23n)+n
- r=13+23=1:子問題的 n 係數的相加。
- T(n):母問題。
- T(n3),T(23n):子問題。
- n:Cost,將子問題合併的代價。
- T(n)=T(n3)+T(23n)+n
- 適用時機
- 子問題個數大於二
- 子問題型態為T(na)
經典範例

- r<1
Ex ( 94 成大資工 )
- T(n)=T(n2)+T(n4)+T(n8)+n,求 Θ
Sol
r=n2+n4+n8=78<1
建立遞迴樹 T(n)=n+78n+4964n+…+Cl (等比級數)
求取其邊界 (夾擠法) 求上邊界:T(n)=n+78n+4964n+…+Cl≤n+78n+4964n+…+(78)h (有限等比級數小於無限等比級數) ⇒n1−78=8n⇒T(n)=O(n)
求下邊界:T(n)=n+78n+4964n+…+Cl≥n⇒T(n)=Ω(n)
⇒T(n)=Θ(n)

- r=1
- Ex (100 政大)(90 ,91 台大)
- T(n)=T(n3)+T(23)+n
- Sol
- r=13+23=1
- 建立遞迴樹 T(n)=n+n+n+…+Cl
- 求取其邊界 求上邊界:因為(23)k∗n=1⇒k=log32n⇒高度=k+1 ,所以T(n)=n+n+n+…+Cl≤n⋅log32n+1 ⇒T(n)=O(nlogn) br>求下邊界:T(n)=n+n+n+…+Cl≥n⋅log3n+1 ⇒T(n)=Ω(nlogn)
- ⇒T(n)=Θ(nlgn)
- Ex (100 政大)(90 ,91 台大)
- r>1
- 無,因為子問題的數量比母問題大。
Master theorem
令 T(n)=aT(nb)+f(n),a≥1,b>1 。
- 若 ∃ϵ>0∋f(n)=O(nlogba−ϵ) ,則 T(n)=Θ(nlogba)。
- 若 ∃ϵ>0,0<c<1∋f(n)=O(nlogba+ϵ)andaf(nb)<cf(n),則 T(n)=Θ(f(n))。
- ☆若 f(n)=Θ(nlogba⋅lgkn),k≥0,則 T(n)=Θ(nlogba⋅lgk+1n) (與 f(n) 相差 lg 的次方)。
經典例題
- Ex ( 100 政大 )
- T(n)=7T(n2)+n2
- sol
- By master theorem ⇒∃ϵ=lg7−2∋n2=O(nlog27−ϵ),所以T(n)=Θ(nlg7)。
- Ex ( 99 交大 )
- T(n)=3T(n4)+nlgn
- sol
- By master theorem ⇒nlog43=n1−ϵ,where0<ϵ<1
⇒nlogn=ω(n)=ω(n1−ϵ),所以T(n)=Θ(nlogn)。
- By master theorem ⇒nlog43=n1−ϵ,where0<ϵ<1
- Ex ( 98 交大 )
- T(n)=3T(n2)+nlgn
- sol
- By master theorem ⇒nlog23=n1+ϵ,where0<ϵ<1
⇒nlogn=o(n1+ϵ),所以T(n)=Θ(nlog23)。
- By master theorem ⇒nlog23=n1+ϵ,where0<ϵ<1
- T(n)=4T(n2)+nlgn
- sol
- By master theorem ⇒nlog24=n2
⇒n2=ω(nlogn),所以T(n)=Θ(n2)。
- By master theorem ⇒nlog24=n2
- <Note> ☆ 與 f(n) 比較,f(n) 多了1lgn
- T(n)=4T(n2)+
- sol
- 不可使用 Master Theorem。
- nlogba=n2,f(n)=n2lgn⇒T(n)=n2lglgn
- <Note> ☆ 與 f(n) 比較,f(n) 多了1lgan,a>1
- 直接為 O(nlogab)
進階遞迴問題
Ackermann's function
{A(0,n)=n+1(1)A(m,0)=A(m−1,1)(2)A(m,n)=A(m−1,A(m,n−1))(3)
- 求取 A(1,n) 的通解
令an=A(1,n)=A(0,A(1,n−1))By(3)=A(0,an−1)By自定義的an=an−1+1By(1)
且
a0=A(1,0)=A(0,1)=2
所以
an=an−1+1=(an−2+1)+1=((an−3+1)+1)+1…=a0+∑n−1i=1+1=2+n∀n≥0
- 求取 A(2,n) 的通解
令bn=A(2,n)=A(1,A(2,n−1))By(3)=A(1,bn−1)By自定義的an=abn−1By第一題結論=bn−1+2=(bn−2+2)+2=((bn−3+2)+)+2…=b0+∑n−1i=12+2=b0+2nb0=A(2,0)=A(1,1)=a1=3=2n+3∀n≥0
- 求取 A(3,n) 的通解
令cn=A(3,n)=A(2,A(3,n−1))By(3)=A(2,cn−1)By自定義的an=bcn−1By第一題結論=2cn−1+3
cn 特徵多項式為 α−2=0⇒α=2,所以令齊次解為 c(h)n=C0×2n,接著 cn 的特解為 c(p)n=C1×(1) 代回求 C1
⇒C1=2×C1+3⇒C1=−3∴cn=chn+c(p)n=C0×2n−3c0=5=C0−3⇒C0=8∴cn=2n+3−3,∀n≥0
Strassen 演算法(分治矩陣乘法)
長久以來人們普遍認為矩陣乘法定義本身即為最佳的算法,這個迷思直到1969年才被施特拉森打破──他提出了一個更快捷的分治(Divide-and-conquer)矩陣乘法,為 Strassen 演算法
- 給定兩個方陣 A、B
- 其大小均為 n×n
- n = 2k
- 若 n 非 2 的冪次方
- 可將 A 和 B 擴充為 [A00I] 和 [B00I]
- 其大小均為 n×n
考慮 2×2 階分塊矩陣乘法
[C11C12C21C22]=[A11A12A21A22][B11B12B21B22]
- 傳統矩陣乘法
- Cij=Ai1B1j+Ai2B2j
![]()
C11=A11B11+A12B21C12=A11B12+A12B22C21=A21B11+A22B21C22=A21B12+A22B22
- 遞迴式為:T(n)=8T(n2)+cn2
- 8 個分塊矩陣乘法
- 4 個分塊矩陣加法
- cn2⇒3×22
- 「Master theorem」
- T(n)=Θ(n3)
- Strassen 演算法
P1=(A11+A22)(B11+B22)P2=(A21+A22)B11P3=A11(B12−B22)P4=A22(B21−B11)P5=(A11+A12)B22P6=(A21−A11)(B11+B12)P7=(A12−A22)(B21+B22)C11=P1+P4−P5+P7C12=P3+P5C21=P2+P4C22=P1+P3−P2+P6
- 遞迴式為:T(n)=7T(n2)+cn2
- 7 個分塊矩陣乘法
- 18 個分塊矩陣加法
- 「Master theorem」
- T(n)=Θ(nlog27)≈Θ(n2.807)
- 根據 2000 年的硬體架構
- 矩陣尺寸必須超過1000,Strassen 演算法才可能擊敗經過高度優化的傳統算法
- 即便矩陣尺寸增大至 10000 相較於傳統算法
- Strassen 演算法所能提昇的運算效率依然十分有限(約小於10%)
算法推導
- 考慮 2×2 階矩陣 [wxyz]=[abcd][pqrs]
- 乘開後 w=ap+bry=cp+drx=aq+bsz=cq+ds
- 將四個式子合併成矩陣表達式 [wyxz]=[ab00cd0000ab00cd][prqs]
- 欲將 4×4 階的矩陣分解成數個矩陣之和以減少乘法運算
- 分解出來的矩陣至多僅含4個非零元,且所有非零元都位於一 2×2 階子陣
- 如:[∗∗00∗∗0000000000]、[0000∗0∗00000∗0∗0]、[∗00∗00000000∗00∗]
考慮三種分解型態
- 型態 I
- 子陣有相同的元
- 需要一個乘法運算
- [aaaa][uv]=[a(u+v)a(u+v)]
- 型態 II
- 子陣的元有相同的絕對值
- 兩行或兩列不同號
- 需要1個乘法運算
- [a−aa−a][uv]=[a(u−v)a(u−v)]
- 型態 III
- 子陣為上或下三角矩陣
- (非零)非主對角元等於兩主對角元之差
- 需要2個乘法運算
- [a0a−bb][uv]=[auau+b(v−u)]
- 可分解為兩個退化的型態 I和型態 II(退化是指存在零行或零列)
- [a0a−bb]=[a0a0]+[00−b−b]
分解矩陣製造型態 I和型態 II
[ab00cd0000ab00cd]=[−dd00−dd0000a−a00a−a]+[a+db−d00c+d000000a+b00c−aa+d]
- 等號右邊的第一個矩陣
- [−dd00−dd0000000000]+[0000000000a−a00a−a]
- 等號右邊的第一個矩陣
令 M1 表示上式等號右邊的第二個矩陣
- 觀察發現 $(M_1){11}=(M_1){44}=a+d $
- M1=[a+d00a+d00000000a+d00a+d]+[0b−d0−(a+d)c+d000000a+b−(a+d)0c−a0]
令 M2 表示上式等號右邊的第二個矩陣
觀察發現 M2 可分解成兩個型態 III
M2=[0000c+d0000000(c−a)−(c+d)0c−a0]+[0b−d0(b−d)−(a+b)0000000a+b0000]
等號右邊的第一個矩陣
- [0000c+d0000000−(c+d)000]+[000000000000c−a0c−a0]
等號右邊的第二個矩陣
- [0b−d0b−d000000000000]+[0000−(a+b)0000000a+b0000]
整理所有的分解矩陣,按照「Strassen 演算法」給定的排序
- [ab00cd0000ab00cd]=[a+d00a+d00000000a+d00a+d]+[0000c+d0000000−(c+d)000]+[0000000000a−a00a−a]+[−dd00−dd0000000000]+[000−(a+b)0000000a+b0000]+[000000000000c−a0c−a0]+[0b−d0b−d000000000000]
- 可以表示為「行列展開」的矩陣乘法
- [ab00cd0000ab00cd]=[1001](a+d)[1001]+[010−1](c+d)[1000]+[0011](a)[001−1]+[1100](d)[−1100]+[−1010](a+b)[0001]+[0001](c−a)[1010]+[1000](b−d)[0101]
- [ab00cd0000ab00cd] 乘上[prqs]
- [wyxz]=[1001](a+d)(p+s)+[010−1](c+d)(p)+[0011](a)(q−s)+[1100](d)(−p+r)+[−1010](a+b)(s)+[0001](c−a)(p+q)+[1000](b−d)(r+s)
- [abcd] 代 [A11A12A21A22]
- [pqrs] 代 [B11B12B21B22]
- [wxyz] 代 [C11C12C21C22]
- 即為「Strassen 演算法」
補充例題
Example(100 交通大學資料結構與演算法)
- Let d and k be two non-negative integers, where k > d ≧ 0.
- A dk-binary sequence is a binary sequence that satisfies the following two constraints:
- d constraint:two 1's are separated by a run of consecutive 0 of length at least d
- k constraint:any run of consecutive 0's is of length at most k
- For example, 010010001001 is a dk-binary sequence of length 12 width d=0 and k=3.
- Let n indicate the length of dk-binary sequence
- Given n=6, d=0, k=6, then how many dk-binary sequences are there?
- (A)8
- (B)16
- (C)32
- (D)64
- (E)128
由 0、1 組成長度為六的字串個數 ⇒26
- Given n=10, d=4, k=5, then how many dk-binary sequences are there?
- (A)8
- (B)6
- (C)12
- (D)10
- (E)11
在序列中有 0 個 1
- 不可能發生
在序列中有 1 個 1
- 0000010000
- 0000100000
在序列中有 2 個 1(兩個 1 最多只能將序列切成 3 段)
轉換題目成整數分割
字串長度為 10
兩個位子置 1
剩下 8 個位子置 0
必須有連續 4 個零或 5 個零出現
- 在序列中有連續 4 個 0(必有連續 4 個 0 出現,則必有一個 4 在此整數分割)
- 8=4+4'
- 序列:0000100001
- 8=4+3+1
- 序列:0001000010
- 8=4+2+2
- 序列:0010000100
- 8=4+1+3
- 序列:0100001000
- 8=4'+4
- 序列:1000010000
- 8=4+4'
- 有連續5個零的狀況
- 8=5+3
- 序列:0001000001
- 8=5+2+1
- 序列:0010000010
- 8=5+1+2
- 序列:0100000100
- 8=3+5
- 序列:1000001000
- 8=5+3
- Given n=14, d=1, k=14, then how many dk-binary sequences are there?
- (A)81
- (B)160
- (C)821
- (D)987
- (E)1024
由 0、1 組成長度為十四且 1 不得連續出現的字串個數
- an=an−1+an−2
- a1=2、a2=3
- a14=987