# 數據結構與算法
---
## 第壹章 概論:
**一,算法內涵**
(1)數據的邏輯結構(線性,非線性:樹、圖等)
(2)數據的儲存結構(順勢、鏈勢、索引、散勢)
(3)數據的運算結構
(4)概述:一組算法的概稱、目的為能提高算法效率
**二,抽象數據類型:**
用抽象的語言描述數據與操縱數據方法,忽略執行層面
## 第貳章 算法分析:
**一,定義:**
有效,有窮,確定(不等於程序,程序可以無窮,如等待)
**二,空間複雜度**
(1)固定空間:其他`(c)`
(2)可變空間:動態規劃,棧 `(Sp(I)) `->主要考慮對象
**三,時間複雜度**
(1) 編譯時間(與編譯器效能有關)->省略
(2) 程序步:一個命令語句算一步,函數頭、變量宣告不算,return&if&i++(for算n+1步,i=0算一步,i++算n步注意是i=0開始)&a=1等算一步
`!!冒泡法`:第一次for迴圈=n次,第二個for迴圈[n+n*(n+1)/2]次(第一個n是i=0後面是1+...+n步)
(3) 最好&最差&平均性能(TSp):平均性能並非(最好+最差)/2,而是sigma/n,ex:順序搜索
(4) 大O符號(上界符號):
定義:T(n)=O(f(n))<->exist n0 s.t. for all n>n0 exist c s.t. c*f(n)>T(n)
例子:T(n)=3n+2,n0=2 -> c=4時4*n>T(n) -> 3n+2=O(n)
`Note!` 1. f(n)應取最小值(如n^ 4與n^ 2應取前者)
2. 若f(n)為多項式,直接保留最高項即可
(5) 下界符號:同上界,但T(n)>c*f(n)
大sita符號:同上界,但c1*f(n)<T(n)<c2*f(n) `!!對k階多項式sita(n)=n^k`
小o符號:T(n)<O(f(n))且T(n)!=sita(f(n)) -> T(n)=o(f(n))
(6)性質:
1.T1(n)=O(f1(n)),T2(n)=O(f2(n)) -> T1+T2=max(O(f1),O(f2))
2.T1(n)=O(f1(n)),T2(n)=O(f2(n)) -> T1*T2=(O(f1)*O(f2))
3.循環嵌套:循環次數相乘*內層語句數;if-else:判斷句+執行句較大者
**四,時間複雜度測試:**
```cpp=
include "time.h" ;
clock_t start=clock();
print( double(end-start) );
```
## 第參章 線性表,堆,棧,隊列
**一,線性表**
* 定義: 有窮數據組成的有序(有明確位置)數組
* 稀疏矩陣sparse matrix
* 三元組: 行,列,值
```cpp=
struct{
int row;
int column;
int data;
}sparseMatrix;
```
* 轉置法一 ( O = col*n)
``` cpp=
for i in range col //找第i列
for j in range n //n,遍歷搜尋
if(a.col[j]==i) 賦值;
```
* 轉置法二 ( O =
---
###### tags: `CS`