1. 程式人生 > >MIT演算法導論公開課之第3課 分治法

MIT演算法導論公開課之第3課 分治法

分治法

1.  將一個問題劃分為若干個子問題。
2.  遞迴的解決每一個子問題。
3.  將子問題的解合併成為整個大問題的解。

歸併排序

1.  將一個數組分為兩個子陣列。
2.  遞迴的對每一個子陣列進行排序。
3.  合併兩個有序子陣列。
  • 執行時間
    遞迴函式為T(n)=2T(n/2)+Θ(n)。
    使用主方法,為case2 ,所以T(n)= Θ(nlgn)。

二分查詢

在有序陣列中查詢數X。
1.  把數X與陣列中間元素比較,得到X所在的子陣列。
2.  遞迴的在這個子陣列查詢X。
3.  無。
  • 執行時間:
    遞迴函式為T(n)=T(n/2)+Θ(1)。
    使用遞迴樹法T(n)= Θ(lgn)。

乘方問題:

有實數X和正整數n計算X^n。
當n為偶數時,X^n=X^(n/2)·X^(n/2),當n為奇數時,X^n=X^((n-1)/2)·X^((n-1)/2)·X。
  • 執行時間:
    遞迴函式為T(n)=T(n/2)+Θ(1)。
    使用遞迴樹法T(n)= Θ(lgn)。

斐波那契數列

基本公式法:
    Fn=0           (n=0)
    Fn=1           (n=1)
    Fn=F(n-1)+F(n-2)(n>=2)
    執行時間:
        Ω(φ^n)  φ=(1+5^(1/2))/2。
自下而上遞迴法:
    依次計算F0,F1,F2 …… Fn。
    執行時間:Θ(n)。
樸素平方遞迴式:
    Fn=φ^n/5^(1/2)結果取最接近的整數。
    執行時間:Θ(lgn)。
    此演算法中的值需用浮點數表示受計算機位數限制。
無法用計算機編碼實現。
平方遞迴式:
    (F(n+1)  Fn)  = (1 1)n
    (Fn  F(n-1))    (1 0)
    執行時間:Θ(lgn)
證明方法可採用歸納法:
1. (F2  F1)  = (1 1)1
   (F1  F0)    (1 0)
2. (F(n+1)  Fn)  = (Fn      F(n-1)) (1 1)
   (Fn  F(n-1))    (F(n-1)  F(n-2)) (1 0)
由定義可知上式成立。

矩陣乘法

  • 輸入:兩個矩陣A[aij]和B[bij] 1<=i<=n 1<=j<=n
  • 輸出:矩陣C[cij]=A[aij]·B[bij]
  • 基本演算法:
    • 偽碼
    for i ← 1 to n
    do for j ← 1 to n
        cij=0
        do for k ← 1 to n
            do cij ← cij+aik·bkj

    執行時間為Θ(n^3)
  • 矩陣分塊法:
    矩陣分塊法
  • 斯特拉森(Strassen)演算法:
    Strassen演算法
    目前最快的理論演算法執行時間大約在O(n^2.376)(這個目前指的是網課授課的日期)。

超大規模積體電路(VLSI)佈局

假設有一個完全二叉樹,在網格上將其放到晶片佈局上,有n個葉節點,要在網格上佔據最小空間。
  • 樸素演算法:
    樸素演算法
  • 改進演算法:
    改進演算法
    Area為Θ(n)。