###### tags: `ADA 1.2` `Asymptotic Analysis` # ADA 1.2 Asymptotic Analysis ## Motivation - 冠軍問題用比較次數當作難度比較的對象 - 但是每個問題都有不一樣的丈量單位,所以希望每個問題都有一個通用的評估單位 - 不考慮單位和係數,只專注在 function 成長的速率 --- ## Goal: Finding Hardness - 對於問題 P,我們希望弄清楚 - 問題 P 的難度(複雜度) = $\Theta(f(n))$ - n 代表問題 P 的實例的大小,例如剛剛的冠軍問題輸入 n 個數字找到冠軍 - n 就是藉由不同實例給予不同數值的,$f(n)$ 就是 n 的 function - $\Theta(f(n))$ 意思就是他剛剛好等於這個 function 的成長速率 - 所以如果我們要藉由比較的方式找出冠軍的話 - 冠軍問題的難度會是 $\Theta(n)$ - 為什麼是 n 不是 n - 1 呢? 因為兩個 function 的成長速度是一樣的,所以 -1 可以省略 - 而不管是 n 還是 2n 因為成長速率也是一樣的,所以前面的係數也可以省略 - 另一個 sorting 的問題的難度是 $\Theta(n\log n)$ 之後會講到 - 用 Upper bound 和 Lower bound 找出難度 - 當 Upper bound 和 Lower bound 一樣時就可以找出這個問題的難度 - Upper bound 通常會希望找到比較低的 - 用 $O(f(n))$ 和 $o(f(n))$ 表示 - Lower bound 通常會希望找到比較高的 - 用 $\Omega(g(n))$ 和 $\omega(g(n))$ 表示 如果一個問題的 Upper bound 是 $O(h(n))$ Lower bound 是 $\Omega(h(n))$\ 問題的複雜度就會是 $\Theta(h(n))$\ $\Theta$就是兩邊都成立的意思 - 找到問題的難度就需要先分析/評估演算法的 - 時間複雜度 - 空間複雜度 - 大部分我們都會專注在**最差情況下**的複雜度,因為我們的演算法需要解決這個問題的所有實例,連最難的都要解決 - 不過後面也會有需要用**平均情況下**來分析,例如:最差的情況在這個問題中,出現的情況非常非常低 |Types |Description | |----------------|-------------------------| |Worst Case |任何一個實例最多需要花多少時間| |Average Case |花的時間的**期望值** | 用 $O$ 表示演算法的 upper bounds 在最壞情況下的時間複雜度 用 $\Omega$ 表示演算法的 lower bounds 在最壞情況下的時間複雜度 --- ## 漸進分析符號 **Textbook ch. 3.1** - $f(n)$ = 輸入n大小的演算法的時間或空間 - 漸進分析: 當 $n \rightarrow \infty$ 時 $f(n)$ 的成長速率 - O or Big-Oh: **upper** bounding function - $\Omega(n)$ or Big-Omega: **lower** bounding function - $\Theta(n)$ or Big-Theta: **tightly** bounding function ## 正式定義 Big-Oh **Textbook ch. 3.1** - 給兩個 function $f(n)$ 和 $g(n)$ $$f(n) = O(g(n))$$ 如果成立的話,對於所有 $n\ge n_0$ 以下式子都要成立 $$0\le f(n) \le c\cdot g(n) $$ $n_0$ 和 c 是常數 :::info $g(n)$的某個常數倍$c\cdot g(n)$ 可以在 n 夠大時壓得住 $f(n)$ ::: - 直覺的想像是 $f(n)$ 的成長速率不會比 $g(n)$ 來得快 - 註釋 1. $f(n) = O(g(n))$ 的意思就是 $f(n)$ 的成長速率就某方面來說小於等於 $g(n)$ 2. 這裡的 "=" 不是 "等於" 的意思,比較像屬於 "$\in$"\ $\{f(n)\} \subseteq O\big(g(n)\big)$ 3. 寫的時候順序不能寫反了如:$O(g(n)) = f(n)$ - 注意 - $f(n)$ 和 $g(n)$ 的 n 可以是負數 - 因為不管是 $O, \Omega$ 我們都是考慮當 n 足夠大的時候,所以當 n 足夠大的時候我們大都是考慮非負的情況 ## 漸進分析符號 - 優點: - 可以省略 low-order terms: $n^2+n$ 後面的 n 就可以省略 - 可以省略單位 - 可以省略係數 - 可以簡化分析 - Example $f(n) = 5n^3+7n^2-8$ - Upper bound: $f(n) = O(n^3), f(n) = O(n^4), f(n) = O(n^3log_2 n)$ - Lower bound: $f(n)=\Omega(n^3), f(n)=\Omega(n^2), f(n)=\Omega(nlog_2 n)$ - Tight bound: $f(n)=\Theta(n^3)$ - Q: $f(n) = O(n^3)$ and $f(n) = O(n^4)$,可以說$O(n^3) = O(n^4)$嗎? A: 不行,因為這邊的等於不是等於的概念,是屬於 --- ## 練習 $100n^2=O(n^3-n^2)?$ - 草稿(這部分只要在腦子或計算紙上寫就好了) $$100n^2\le100(n^3-n^2)$$ $$\leftarrow 200n^2\le100n^3$$ $$\leftarrow 2\le n$$ - $n_0=2,c=100$ (證明這件事情只要寫這以下的就好了) $$100n^2\le100(n^3-n^2)$$ 當 $n \ge 2$, $100n^2=O(n^3-n^2)$ 成立 ## 練習 $n^2=O(n)$? - 反證法 - 假設一個矛盾的條件,存在一個正的常數 $c, n_0$ 讓 $$n^2 \le cn$$ 任何 n 符合 $n \ge n_0$ - 假設 $n=1+\lceil max(n_0,c)\rceil$ 所以 $n > n_0, n > c$,可以推導出 $n^2 > cn$ - 矛盾,所以我們知道 $n^2 \ne O(n)$ TODO: 遇到問題\ 雖然知道怎麼推導出來的,但是我還是不知道一開始的 $n=1+\lceil max(n_0,c)\rceil$ 這個式子是從哪裡來的? :::info $n_0 \in\mathbb N, \space n \ge n_0$ **Prove**: $let\space c \ge 0$ $\space \space \space \space \space n \ge n_0$ => $n \ge n_0 + c$ => $n \ge n_0 + c + 1$ => $f(c) \ge n_0 + c + 1$ => $n = 1 + max(n_0,\space c)$ ::: --- ## 規則 **Textbook ch. 3.1**\ 教授說不用背,因為非常的直覺,看過就好 - Rule1: $f(n) = O(f(n))$ - Rule2: 如果 c 是正的常數,$c \cdot O(f(n)) = O(f(n))$ - Rule3: 如果 $f(n) = O(g(n))$,然後 $O(f(n)) = O(g(n))$ - Rule4: $O(f(n)) \cdot O(g(n)) = O(f(n) \cdot g(n))$ - Rule5: $O(f(n) \cdot g(n)) = f(n) \cdot O(g(n))$ ## 其他的符號 - $f(n)=O(g(n))\rightarrow f(n) \le g(n)$ 的成長率 - $f(n)=\Omega(g(n))\rightarrow f(n) \ge g(n)$ 的成長率 - $f(n)=\Theta(g(n))\rightarrow f(n) = g(n)$ 的成長率 - $f(n)=o(g(n))\rightarrow f(n) < g(n)$ 的成長率 (沒有等於 比較少用到) - $f(n)=\omega(g(n))\rightarrow f(n) > g(n)$ 的成長率 (沒有等於 比較少用到) --- ## 演算法分析 - 擂台法 ``` 1. int i, j; O(1) time 2. j = 1; O(1) time 3. for(i = 2; i <= n; i++) O(n) iterations 4. if(A[i] > A[j]) O(1) time 5. j = i; O(1) time 6. return j; O(1) time ``` 全部加起來 -> upper bound 在最壞情況下的時間複雜度 $O(1)+O(1)+O(n)\cdot(O(1)+O(1))+O(1)$ $3\cdot O(1)+O(n)\cdot(2O(1))$ $=O(1)+O(n)\cdot O(1)$ (Rule 2) $=O(1)+O(n)$ (Rule 4) $=O(n)+O(n)$ (1 = O(n) & Rule 3) $=2\cdot O(n)$ (Rule 2) $=O(n)$ TODO: 遇到問題\ 1 = O(n) 我還沒想明白… :::info $\space \space \space \space \space O(1) + O(n)$ => $f(n) +O(g(n))$ -> (Rule3) => $O(f(n)) + O(g(n))$ => $O(g(n)) + O(g(n))$ => $O(n)$ :::warning 老實說我覺得這一步很多餘 by woody ::: --- ## 排序問題 練習另一題 - Input: An array A of n distinct integers. - Output: Reorder A such that A[1]<A[2]<…<A[n]. ## 演算法分析 - 泡沫排序法 ``` 1. int i, done; O(1) time 2. do { f(n) iterations 3. done = 1; O(1) time 4. for (i = 1; i < n; i++) { O(n) iterations 5. if (A[i] > A[i + 1]) { O(1) time 6. exchange A[i] and A[i + 1]; O(1) time 7. done = 0; O(1) time 8. } 9. } 10. } while (done == 0) ``` - Upper bound $O(1)+f(n)\cdot(O(1)+O(n)\cdot O(1))$ $=O(1)+f(n)\cdot O(n)$ $=f(n)\cdot O(n)$ $=O(n^2)$ 其中$f(n) = O(n)$要用歸納法證明 --- ## 演算法分析 - 擂台法 ``` 1. int i, j; Big-Omega(1) time 2. j = 1; Big-Omega(1) time 3. for(i = 2; i <= n; i++) Big-Omega(n) iterations 4. if(A[i] > A[j]) Big-Omega(1) time 5. j = i; Big-Omega(1) time 6. return j; Big-Omega(1) time ``` - lower bound $3\cdot\Omega(1)+\Omega(n)\cdot(2\cdot\Omega(1))$ $=\Omega(1)+\Omega(n)\cdot\Omega(1)$ $=\Omega(1)+\Omega(n)$ $=\Omega(n)$ Lower bound 可以直接這樣做嗎??? - 先來看看百般無聊擂台法 ``` 1. int i; Big-Omega(1) time 2. int m = A[1]; Big-Omega(1) time 3. for (i = 2; i <= n; i++) { Big-Omega(n) iterations 4. if (A[i] > m) Big-Omega(1) time 5. m = A[i]; Big-Omega(1) time 6. if (i == n) Big-Omega(1) time 7. do i++ n times Big-Omega(n) time 8. } 9. return m; Big-Omega(1) time ``` 如果 Lower bound 真的可直接這樣加起來的話 $3\cdot\Omega(1)+\Omega(n)\cdot(3\cdot\Omega(1)+\Omega(n))$ $=\Omega(1)+\Omega(n)\cdot\Omega(n)$ $=\Omega(1)+\Omega(n^2)$ $=\Omega(n^2)$ 就會變成這樣,但實際上不能這樣算,因為只有 i==n 的時候才會多做那n次無意義的事情,如果把它乘進去就會造成高估,但我們現在算的是 lower bound 不能隨便高估 所以比較保險的估算方式是從問題實例裡估算 --- ## 演算法分析 - 泡沫排序法 ``` 1. int i, done; Big-Omega(1) time 2. do { f(n) iterations 3. done = 1; Big-Omega(1) time 4. for (i = 1; i < n; i++) { Big-Omega(n) time 5. if (A[i] > A[i + 1]) { Big-Omega(1) time 6. exchange A[i] and A[i + 1]; Big-Omega(1) time 7. done = 0; Big-Omega(1) time 8. } 9. } 10. } while (done == 0) ``` 當 A 是從大排到小, $f(n)=\Omega(n)$ 最壞情況下泡沫排序法的時間複雜度是 $f(n)\cdot\Omega(n)=\Omega(n^2)$