Algorithm - Recurrence

Recurrence

<外傳>

  • 某些問題隨輸入資料大小成指數成長是無法避免的
    • 雖然「Divide-and-conquer」無法獲致良好的執行效率但仍可採用
  • 河內塔問題
    • 每呼叫一次就需搬動圓盤一次
      • 當圓盤的個數 n 為 64
      • 總共需要搬動圓盤 2641
      • 演算法的複雜度等級是 O(2n)
    • 河內塔問題圓盤搬動次序與 n 成指數關係
    • 經過証明,上述河內塔問題的演算法
      • 為該問題的限制下最佳的演算法

Substitution method

  • Concept

    1. 以經驗猜測一個邊界(bound)

    2. 假設問題符合此邊界,證明問題也符合此邊界。

  • 適用時機

    • 題目比分重。
    • 單向;單邊:只需要證明 O,Ω 單向,不必證明 Θ
    • 題目要求。

經典範例

Example - T(n)=2T(n2)+nT(n)=O()

(Substitution method)猜:T(n)=O(nlgn)

已知 g(n)=2g(n2)+n=O(nlgn)

欲證 T(n)=O(nlgn),即證明 C,n0>0nn0,T(n)Cnlgn

假設子問題 T(n)Cn2lgn2 成立

考慮 T(n)=2T(n2)+n2Cn2lgn2+n

T(n)=2T(n2)+n2Cn2lgn2+n

T(n)=2T(n2)+nCn(lgnlg2)+n=Cnlgn+(1C)n

C2,T(n)=2T(n2)+nCnlgn

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(na)

經典範例

tree_1
  • 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++Cln+78n+4964n++(78)h (有限等比級數小於無限等比級數) n178=8nT(n)=O(n)

        求下邊界:T(n)=n+78n+4964n++ClnT(n)=Ω(n)

      • T(n)=Θ(n)

tree_1
  • 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)kn=1k=log32n=k+1 ,所以T(n)=n+n+n++Clnlog32n+1 T(n)=O(nlogn) br>求下邊界:T(n)=n+n+n++Clnlog3n+1 T(n)=Ω(nlogn)
      • T(n)=Θ(nlgn)
  • r>1
    • 無,因為子問題的數量比母問題大。

Master theorem

T(n)=aT(nb)+f(n),a1,b>1

  • ϵ>0f(n)=O(nlogbaϵ) ,則 T(n)=Θ(nlogba)
  • ϵ>0,0<c<1f(n)=O(nlogba+ϵ)andaf(nb)<cf(n),則 T(n)=Θ(f(n))
  • f(n)=Θ(nlogbalgkn),k0,則 T(n)=Θ(nlogbalgk+1n) (與 f(n) 相差 lg 的次方)。

經典例題

  • Ex ( 100 政大 )
    • T(n)=7T(n2)+n2
    • sol
      • By master theorem ϵ=lg72n2=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)
  • Ex ( 98 交大 )
    • T(n)=3T(n2)+nlgn
    • sol
      • By master theorem nlog23=n1+ϵ,where0<ϵ<1
        nlogn=o(n1+ϵ),所以T(n)=Θ(nlog23)
    • T(n)=4T(n2)+nlgn
    • sol
      • By master theorem nlog24=n2
        n2=ω(nlogn),所以T(n)=Θ(n2)
  • <Note> ☆ 與 f(n) 比較,f(n) 多了1lgn
    • T(n)=4T(n2)+
    • sol
      • 不可使用 Master Theorem。
      • nlogba=n2,f(n)=n2lgnT(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(m1,1)(2)A(m,n)=A(m1,A(m,n1))(3)

  • 求取 A(1,n) 的通解

an=A(1,n)=A(0,A(1,n1))By(3)=A(0,an1)Byan=an1+1By(1)

a0=A(1,0)=A(0,1)=2

所以

an=an1+1=(an2+1)+1=((an3+1)+1)+1=a0+n1i=1+1=2+nn0

  • 求取 A(2,n) 的通解

bn=A(2,n)=A(1,A(2,n1))By(3)=A(1,bn1)Byan=abn1By=bn1+2=(bn2+2)+2=((bn3+2)+)+2=b0+n1i=12+2=b0+2nb0=A(2,0)=A(1,1)=a1=3=2n+3n0

  • 求取 A(3,n) 的通解

cn=A(3,n)=A(2,A(3,n1))By(3)=A(2,cn1)Byan=bcn1By=2cn1+3

先求出 c0=A(3,0)=A(2,1)=b1=5 ,再來

cn 特徵多項式為 α2=0α=2,所以令齊次解為 c(h)n=C0×2n,接著 cn 的特解為 c(p)n=C1×(1) 代回求 C1

C1=2×C1+3C1=3cn=chn+c(p)n=C0×2n3c0=5=C03C0=8cn=2n+33,n0

Strassen 演算法(分治矩陣乘法)

長久以來人們普遍認為矩陣乘法定義本身即為最佳的算法,這個迷思直到1969年才被施特拉森打破──他提出了一個更快捷的分治(Divide-and-conquer)矩陣乘法,為 Strassen 演算法

  • 給定兩個方陣 A、B
    • 其大小均為 n×n
      • n = 2k
    • 若 n 非 2 的冪次方
      • 可將 A 和 B 擴充為 [A00I][B00I]

考慮 2×2 階分塊矩陣乘法

[C11C12C21C22]=[A11A12A21A22][B11B12B21B22]

  • 傳統矩陣乘法
    • Cij=Ai1B1j+Ai2B2j
1549349573405

C11=A11B11+A12B21C12=A11B12+A12B22C21=A21B11+A22B21C22=A21B12+A22B22

  • 遞迴式為:T(n)=8T(n2)+cn2
    • 8 個分塊矩陣乘法
    • 4 個分塊矩陣加法
    • cn23×22
  • 「Master theorem」
    • T(n)=Θ(n3)
  • Strassen 演算法

P1=(A11+A22)(B11+B22)P2=(A21+A22)B11P3=A11(B12B22)P4=A22(B21B11)P5=(A11+A12)B22P6=(A21A11)(B11+B12)P7=(A12A22)(B21+B22)C11=P1+P4P5+P7C12=P3+P5C21=P2+P4C22=P1+P3P2+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 階子陣
    • 如:[000000000000][000000000000][000000000000]

考慮三種分解型態

  • 型態 I
    • 子陣有相同的元
    • 需要一個乘法運算
    • [aaaa][uv]=[a(u+v)a(u+v)]
  • 型態 II
    • 子陣的元有相同的絕對值
    • 兩行或兩列不同號
    • 需要1個乘法運算
    • [aaaa][uv]=[a(uv)a(uv)]
  • 型態 III
    • 子陣為上或下三角矩陣
    • (非零)非主對角元等於兩主對角元之差
    • 需要2個乘法運算
    • [a0abb][uv]=[auau+b(vu)]
      • 可分解為兩個退化的型態 I型態 II(退化是指存在零行或零列)
      • [a0abb]=[a0a0]+[00bb]

分解矩陣製造型態 I型態 II

  1. [ab00cd0000ab00cd]=[dd00dd0000aa00aa]+[a+dbd00c+d000000a+b00caa+d]

    • 等號右邊的第一個矩陣
      • [dd00dd0000000000]+[0000000000aa00aa]
  2. M1 表示上式等號右邊的第二個矩陣

    • 觀察發現 $(M_1){11}=(M_1){44}=a+d $
    • M1=[a+d00a+d00000000a+d00a+d]+[0bd0(a+d)c+d000000a+b(a+d)0ca0]
  3. M2 表示上式等號右邊的第二個矩陣

    • 觀察發現 M2 可分解成兩個型態 III

    • M2=[0000c+d0000000(ca)(c+d)0ca0]+[0bd0(bd)(a+b)0000000a+b0000]

    • 等號右邊的第一個矩陣

      • [0000c+d0000000(c+d)000]+[000000000000ca0ca0]
    • 等號右邊的第二個矩陣

      • [0bd0bd000000000000]+[0000(a+b)0000000a+b0000]
  4. 整理所有的分解矩陣,按照「Strassen 演算法」給定的排序

    • [ab00cd0000ab00cd]=[a+d00a+d00000000a+d00a+d]+[0000c+d0000000(c+d)000]+[0000000000aa00aa]+[dd00dd0000000000]+[000(a+b)0000000a+b0000]+[000000000000ca0ca0]+[0bd0bd000000000000]
    • 可以表示為「行列展開」的矩陣乘法
    • [ab00cd0000ab00cd]=[1001](a+d)[1001]+[0101](c+d)[1000]+[0011](a)[0011]+[1100](d)[1100]+[1010](a+b)[0001]+[0001](ca)[1010]+[1000](bd)[0101]
  • [ab00cd0000ab00cd] 乘上[prqs]
    • [wyxz]=[1001](a+d)(p+s)+[0101](c+d)(p)+[0011](a)(qs)+[1100](d)(p+r)+[1010](a+b)(s)+[0001](ca)(p+q)+[1000](bd)(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:
      1. d constraint:two 1's are separated by a run of consecutive 0 of length at least d
      1. 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
  1. 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

  1. 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

(參考:Re: [理工] [DS&algo] 100交大

在序列中有 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
  • 有連續5個零的狀況
    • 8=5+3
      • 序列:0001000001
    • 8=5+2+1
      • 序列:0010000010
    • 8=5+1+2
      • 序列:0100000100
    • 8=3+5
      • 序列:1000001000
  1. 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=an1+an2
  • a1=2a2=3
  • a14=987