# 複雜度分析
###### tags: `競程`、`簡報`
---
## 好的演算法?
- 跑的多快
- 佔用的記憶體
- 正確性
---
我們通常在乎“跑的多快”
---
那要怎麼知道速度呢?
直接寫出來測量!
---
但是直接測量有不少缺點:
- 如果要跑很久才能結束
- 必須先寫出來才
- 不同電腦的跑
- 不同的輸入
- 不同的數據大小
---
## 複雜度分析
以數學方法可以預估程式跑得多快
---
首先我們先來看些例子:
假設加法會花掉 $c_1$ 的時間,比較會花掉 $c_2$ 的時間
```cpp=
for (int i=0,res=1; i<n; i++)
{
res = max(res, a[i]);
}
```
for 迴圈用掉了 $n$ 次加法
迴圈內用了 $n$ 次比較
記 $f_1(n) = n(c_1+c_2)$
---
假設加法會花掉 $c_1$ 的時間,乘法會花掉 $c_3$ 的時間
```cpp=
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
res = res + i*j;
}
}
```
for 迴圈用了 $n^2$ 加法
迴圈內用了 $n^2$ 次加法和 $n^2$ 次乘法
記 $f_2(n) = n^2(2c_1+c_3)$
---
### 複雜度分析的概念
$f_1(n) = n(c_1+c_2)$
$f_2(n) = n^2(2c_1+c_3)$
哪個更快?
這取決於 $c_1, c_2, c_3$
---
### 複雜度分析的概念
如果,$n$ 超級超級超級大呢?
---
### 複雜度分析的概念
我們得到了一個結論:
我們只在乎成長速度
---
{"metaMigratedAt":"2023-06-16T18:50:32.623Z","metaMigratedFrom":"YAML","breaks":true,"contributors":"[{\"id\":\"aeea178b-8721-4c2d-ab07-8fc15a809855\",\"add\":993,\"del\":162}]","title":"【簡報】複雜度分析"}