演算法分析筆記

數學相關

級數推導

級數和

時間複雜度

適用於for迴圈的策略:

  1. 自外而內: 透過\(\sum\)表達每個迴圈內的計算次數
  2. 如果是巢狀迴圈,自外而內求解理論上應該由多個\(\sum\)組成求解的運算式
  3. 求解複雜度的運算式,可以由\(\sum 1\)表達,視情況調整範圍

數學歸納法

  1. 基底(初始值): 證明n = k, k = 0 or 1時成立
  2. 歸納用假說: 假設n成立
  3. 步階: 證明n+1時成立,n+1代入會等於n代入遞迴關係求n+1時成立

Catalan Number

$$b_n = \frac{1}{n + 1} \binom{2n}{n}$$

適用於

二項係數分解

綜合以上兩點可得 $$ \binom{n}{k} = \binom{n-1}{k-1} + \binom{n-1}{k} $$

演算法

演算法的條件(特性)

  1. 輸入: k個輸入, k >= 0
  2. 輸出: k個, k > 0
  3. 明確性: 每個步驟必須清楚定義
  4. 有限性: 必須在有限的步驟內終結
  5. 有效性: 每個步驟必須可實現

演算法的正確性檢驗 Correctness of Algorithms

其他

時間複雜度比較

先備知識

分類

常見概念

Asymptotic 表示法

比較大小,注意其等號代表屬於(∈)何種集合, 大小希臘字母比較的時大寫可以相等,小寫則不包含相等的情況。

Asymptotic 表示法會取\(n_0\)與正常數\(c\),在這個值之後所有的\(n\)代入 \(c \, g(n)\)後,函數\(f(n)\)為正常數並且滿足特定的條件(看取\(O,o, \omega, \Omega \)等等)。

相加

兩個 Asymptotic 表示法相加時,如 $$ \Omega (n) + O(n)$$ 這代表\(f1(n) \in \Omega (n), f2(n) \in O(n) \),並且\(f1(n) + f2(n)\) 總是大於或相同屬於\(\Omega (n)\)的函數,因此可視為\(\Omega (n)\)。2

概念釐清

演算法設計

遞迴式的解決方法

動態規劃

  1. 分解大問題成子問題
  2. 列表法

可以保證最佳解

複雜度

皆為 Theta

Assembly Line

切鋼條

從最少開始,並且考慮不同位置切割

輸出

  1. 給予長度
  2. 找出該長度的最大利潤切割大小
  3. 扣除大小後,重複執行直到相等

Matrix-Chain Multiplication

複雜度: Theta(n^3)

  1. 宣告矩陣 m (最小值) 與 s (最佳解)
  2. m 對角全填 0
  3. 由對角線往角做計算,往上時分割一次在不同位置取最小得出解
  4. 將分割位置存到 s (最佳解) 中

輸出

S 矩陣的 i, j 項代表分割位置, 並且透過該分割位置繼續往下分割到相同為止。

LCS

與 Edit Distance 類似,時間複雜度也類似

填寫矩陣的 Case

LCS的解可以理解在兩個維度走訪,對角代表Match,非斜線代表略過。

複雜度: Theta(m*n),兩個字串的長度 m, n

習題: leetcode longest common subsequence solve

LIS

最長遞增子序列

待補

Knapsack

貪婪法

可貪婪的

Making Change

貪婪法不見得可以獲得最佳解

Huffman Codes

最佳解

  1. 求出機率
  2. 透過最小優先佇列建樹
  3. 將建立好的節點放入佇列繼續建樹

Theta(n lg n)

Activity Selection

嘗試找出最大相容子級,意指時間不交疊

Knapsack

每次嘗試取高 V/W

償還分析

計算平均的 worst case

Potential

Accounting

Aggregate

Fibonacci Heap

透過 Doubly Linked List 串接 roots

時間複雜度

Struct

Union

  1. 將兩個 Heap 相串
  2. 由於兩個 Heap 都有 Min 值,更新 Min 值

Extract-Min

Solid Fibonacci Heap 當中的 Tree 分支度(Degree)都不同

  1. 將最小樹根移除後,把子節點串在原位置上
  2. Consolidate() 操作用來將 Heap 轉成 Solid Heap

Decreasing-Key

第二次切的非根節點移動到連結串列


Algorithm Analysis Algorithm