# [資料結構] CH2. Performance Analysis
## 時間複雜度與空間複雜度
* 一個程式/演算法的好壞,我們可以從時間與空間兩個面相去分析。
* 至於到底是時間還是空間重要,我們要由我們程式的目的去看。即時性、可讀性......等,不同的需求會讓我們對程式有不同的寫法。
## 空間複雜度
* 一般我們會將空間複雜度分為兩個部份來分析:
- Fixed part:
- 對於一些程式常數、基本變數所需要的儲存空間。
- Variable part:
- 運算所需的參考變數,或是遞迴的堆疊指標所需要的儲存空間。
* 我們有時候會將空間複雜度這樣表示:$S(P)= c + S_p$。其中c指的就是Fixed part;$S_p$指的是Variable part。
* 在討論空間複雜度時,我們只注重**Variable part**。
## 時間複雜度
* 時間複雜度一樣也可以分成兩個部分:
- Compile time:
- 編譯code所需的時間。
- Run (execution) time
- 實際執行時所需的時間。
* 也一樣可以這樣表示:$T(P)= c + T_p$,c為Compile time;$T_p$為Run time。
* 聰明如你,我們只注重**Run time**。
* 在這裡我們Run time又有兩種方式可以分析:
1. 根據這個程式從執行到結束花了多久的時間。
2. 根據我們執行了幾個步驟才完成目的。
* 由於前者會受到CPU強度而受到影響,通常我們又使用後者分析。
### Asymptotic Notations ㄅ歉我不知道中文是啥
* 雖然剛剛說了,我們會以步驟來分析一段演算法/程式的好壞,但實際上是怎麼做的?這裡有三種分析標準:
1. Big-Oh: $f(n)=O(g(n))$
* Iff exist positive constants **c** and $n_0$ that $f(n)\leq cg(n)$ for all n when $n>n_0$.
* 簡單來說就是取上界。有種取極限以忽略常數和非最大冪次項的感覺。
2. Omega: $f(n)=\Omega(g(n))$
* Iff exist positive constants **c** and $n_0$ that $f(n)\geq cg(n)$ for all n when $n>n_0$.
* 對啦就是取下界
3. Theta: $f(n)=\Theta(g(n))$
* Iff exist positive constants $c_1$, $c_2$ and $n_0$ that $c_1g(n)\geq f(n)\geq c_2g(n)$ for all n when $n>n_0$.
* 上下界一起取。
* 這些符號可以稱做漸進符號,用於觀察一個function複雜度的成長率。
> 因為不想打一堆LaTeX語法,很麻煩,所以這邊就不附上題目了,請自行練習。
## 資料型態(Data Type)
* 一個資料型態應該要考慮到它的**Objects**和**Operations**。
* 像是int這個資料型態,Objects是1.2.3.4...等等的數字,而Operations是`+` `-` `*` `/` 等等的運算行動。
### 抽象資料型態(Abstract Data Type)
* 抽象資料型態ADT,會根據你後來才提供的資料型態,提供更多的Operations。
* 講起來有點...抽象,因為它是"抽象"資料型態。
* 好,當我沒說。
* 經典的例子就是stack、queue等等的資料型態。
* C++中提供的STL中,就有大量的ADT,像是`map` `vector` `list` 之類的,如果你有用過就懂了。
###### tags: `DS` `note`