# 時間複雜度 (Time Complexity)
### Big-O
#### 定義:某演算法時間函數的上限,最糟也不會超過的意思!
#### $f(n)=O(g(n))$ iff存在兩正數$C, n_0$使得$f(n)\le C \times g(n)$, for all $n>=n_0$
只要n大到某個程度(no),就保證時間函數f(n)最多就長到g(n)
(n是執行次數)

#### 例題1: $f(n)=3n+2$, 證明$f(n)=O(n)$
1. 先把$f(n)$最高次項的係數值+1設為C
--> C=3+1=4
2. $3n+2\le 4n$
--> $n\ge2$
$n_0=2$
3. 結論: $f(n)=O(n)$ iff $C=4, n_0=2$, 使得$f(n)\le 4\times g(n)$, for all $n>=2$
#### 例題2: $f(n)=5n^2+3n+2$, 證明$f(n)=O(n^2)$
1. 先把$f(n)$最高次項的係數值+1設為C
--> C=5+1=6
2. $5n^2+3n+2\le 6n^2$
--> $n^2\ge3n+2$
$n_0=4$ (代數字試)
3. 結論: $f(n)=O(n^2)$ iff $C=6, n_0=4$, 使得$f(n)\le 6\times g(n)$, for all $n>=4$
以例題1的$f(n)=3n+2$來說,它的Big-O是$O(n)$,但這只是一個最爛值,所以$O(n^2), O(n^3)$..etc都可以是它的Big-O。
因此為了使Big-O有意義,$f(n)=O(g(n))$的$g(n)$要越小越好。
### Omega
#### 定義:某演算法時間函數的下限,最好也不會低於此下限!
#### $f(n)=\Omega(g(n))$ iff存在兩正數$C, n_0$使得$f(n)\ge C \times g(n)$, for all $n>=n_0$
只要n大到某個程度(no),就保證時間函數f(n)最好就長到g(n),不會再低於g(n)
(n是執行次數)

#### 例題1: $f(n)=3n+2$, 證明$f(n)=\Omega(n)$
1. 先把$f(n)$最高次項的係數值設為C
--> C=3
2. $3n+2\ge 3n$
--> $2\ge0$, 恆真所以$n_0$可以任選
$n_0=1$
3. 結論: $f(n)=\Omega(n)$ iff $C=3, n_0=1$, 使得$f(n)\ge 3\times g(n)$, for all $n>=1$
#### 例題2: $f(n)=5n^2+3n-6$, 證明$f(n)=\Omega(n^2)$
1. 先把$f(n)$最高次項的係數值設為C
--> C=5
2. $5n^2+3n-6\ge 5n^2$
--> $3n-6\ge0$
$n_0=2$
3. 結論: $f(n)=\Omega(n^2)$ iff $C=5, n_0=2$, 使得$f(n)\ge 5\times g(n)$, for all $n>=2$
再次以$f(n)=3n+2$來說,它的Omega是$\Omega(n)$,但$\Omega (1)$也可以是它的Omega。
因此為了使Omega有意義,$f(n)=\Omega(g(n))$的$g(n)$要越大越好。
## Theta
#### 定義:就是Big-O跟Omega的夾擊~
#### $f(n)=\theta(g(n))$ iff存在三正數$C_1, C_2$和$n_0$,
#### 使得$C_1\times g(n) \le f(n)\le C_2 \times g(n)$, for all $n>=n_0$

#### 例題1: $f(n)=3n+2$, 證明$f(n)=\theta(n)$
$C_1\times g(n) \le \underline{f(n)\le C_2 \times g(n)}$
1. 先處理右半邊,把$f(n)$最高次項的係數值+1設為C2
--> C=3+1=4
2. $3n+2\le 4n$
--> $n\ge2$, $n_0$=2
$\underline{C_1\times g(n) \le f(n)}\le C_2 \times g(n)$
3. 再處理左半邊,把$f(n)$最高次項的係數值設為C1
--> C=3
4. $3n+2\ge 3n$,
--> $2\ge0$恆真, 所以$n_0任取$
5. 結論: $f(n)=\theta(n)$ iff $C_1=3, C_2=4, n_0=2$, 使得$3\times g(n) \le f(n)\le 4\times g(n)$, for all $n>=2$
