# [演算法] Ch2 ~ Ch3 本章主要介紹演算法設計與分析的過程,並介紹如 big-O, big-Omega 等表示 running time 的標記。 ## Intro :::warning 沒錯,Ch1 太廢了,懶得介紹 >_< ::: 一般來說,演算法設計與分析大致可以分以下步驟: 1. **Formulate Problem**: - 先定義好問題的 **Input**, **Output** 2. **Develop Algorithm**: - 設計演算法 3. **Prove Correctness**: - 證明演算法的正確性與穩定性 - **正確性**:可以找到正確的答案嗎? - **穩定性**:每個 input、每次執行都能找出正確的結果嗎? - 大多數的演算法證明都在這一步 4. **Analyze Complexity**: - 利用 **Asymptotic Notation** 去分析演算法的**時間複雜度** ![image](https://hackmd.io/_uploads/Hk6ofLFpJg.png) ## Asymptotic notations ### Intro **Asymptotic notations** 是一個可以簡化演算法 running time 表示的表示法,利用一些常用的函數,來描述 running time 函數的行為。常見的 asymptotic notations 有以下幾種: | 種類 | 意義 | | -------- | -------- | | $f = O(g)$ | $\exists \ c,n_0:f(n) \le cg(n),n \ge n_0$| | $f = o(g)$ | $\exists \ c,n_0:f(n) < cg(n),n \ge n_0$| | $f = \Omega(g)$ | $\exists \ c,n_0:f(n) \ge cg(n),n \ge n_0$| | $f = \omega(g)$ | $\exists \ c,n_0:f(n) > cg(n),n \ge n_0$| | $f = \Theta(g)$ | $\exists \ c_1,c_2,n_0: c_1g(n)\le f(n) \le c_2g(n),n \ge n_0$| **Asytotic notations** 的優點:把 low-order terms 和係數捨去,大幅簡化演算法複雜度分析 ![image](https://hackmd.io/_uploads/BkcwbDKa1x.png) ### Properties - **Transitivity**: - $f = O(g)$ and $g = O(h)$, then $f = O(h)$ - $f = \Omega(g)$ and $g = \Omega(h)$, then $f = \Omega(h)$ 依此類推 - **Reflexivity**: - $f = \Theta(f)$ - $f = O(f)$ - $f = \Omega(f)$ - **Symmetry**: - $f = \Theta(g) \Longleftrightarrow g = \Theta(f)$ - **Transpose symmetry**: - $f = O(g) \Longleftrightarrow g = \Omega(f)$ - $f = o(g) \Longleftrightarrow g = \omega(f)$ ## 證明方式 下方是常見的演算法證明方式,可以參考一下: ![image](https://hackmd.io/_uploads/r1WTWDY6kg.png) ## Stirling's approximation :::warning 這個必看,去年期中考有考過,**歐姆巴**說的 ::: - Stirling formula: $(\frac{n}{e})^n < n! < (\frac{n}{e})^n \sqrt{2\pi n}(1 + \frac{1}{11n})$ - **Stirling's approximation**: $n! = \sqrt{2 \pi n}(\frac{n}{e})^n(1 + \Theta(\frac{1}{n}))$ ## Fibonacci numbers ### 遞迴解 ![image](https://hackmd.io/_uploads/BkBu9vFaJe.png) ### 公式解 - 與**黃金比例**有關 - **黃金比例 $\phi$**: - $\phi = \frac{1 + \sqrt{5}}{2}$ - $\hat{\phi } = \frac{1 - \sqrt{5}}{2}$ ($\phi$ 的共軛根) - $x^2 = x + 1$ 的兩根為 $\phi$ 與 $\hat{\phi}$ - $F_i = \lfloor \frac{\phi ^i}{\sqrt{5}} + \frac{1}{2} \rfloor$ ## 常見級數 - $\sum _{i = 1}^n \frac{1}{i} \simeq \ln n + \gamma,\ \gamma \simeq 0.557$ - $\sum_{i = 1}^n i2^i = (n - 1)2^{n+1} + 2$ - $\sum_{i = 1}^n \log i = \Theta(n \log n)$ - $\sum_{i = 1}^n i^d \log i = \Theta(n^{d+1} \log n)$