###### tags: `實習`
# 資料結構
https://ocw.nctu.edu.tw/course_detail.php?bgid=9&gid=0&nid=412
## Life Cycle
1. Analysis
2. Design (base your requirements)
3. Refinement (optimization code)
4. verification (Test Case)
## Abstract Data Type(ADT) (抽象資料型別)
1. 資料的一般特性(general characteristics)與操作方式(operations)** 進行討論,而這種資料的抽象化就是**抽象資料型別(Abstract Data Type)
## Algorithm
1. input
2. output
3. definiteness(清楚定義)
4. finiteness(有限性)
5. effectivenss(有效率的)
## Selection Sort
find smallest number in unsort array
put to sort array next place
O(n^2)
```cpp=
int * Selection_Sort(int * data){
for(int i=0;i<sizeof(data)/sizeof(int);i++){
int min = i;
for(int k=i;k<sizeof(data)/sizeof(int);k++)
min = (data[i]<data[min])?i:min;
swap(data[i],data[min]);
}
return data
}
```
## Binary Search
再已排序陣列(單調性),可利用中間分隔去快速尋找目標
O(Log2(n))
```cpp=
int binary_serarch(int first,int end,int find){
while(data[mid]!=find&&first!=end){
int mid = (first+end);
if(data[mid]>find)
end = mid-1;
else
first= mid+1;
}
if(first!=end)
return mid;
else
return -1;
}
```
## Selection Problem
find kth data in array
暴力方法: 排序->data[k]
優化1: 拉K個元素先排序->若比K大丟掉,比K小加入
優化2: PQ
```cpp=
int Selection_K(int * data,int k){
priority_queue<int,vector<int>,less<int> > less;
priority_queue<int,vector<int>,greater<int> > greater;
for(int i=0;i<sizeof(data)/sizeof(int);i++){
if(less.size()<k)
less.push(data[i]);
else if(data[i]>less.top()){
greater.push(data[i]);
}else{
greater.push(less.top());
less.pop();
}
}
return less.top();
}
```
## Recursive Algorithms
### 遞迴C計算
C(m,n) = m!(c!(m-n)!)
ex: c(m,n) = c(m-1,n)+c(m-1,n-1)
```cpp=
int c(int m,int n){
if(n==1)
return m;
return c(m-1,n)+c(m-1,n-1)
}
```
### 遞迴乘法
a*b = a * (b-1) + a
a*1 = a
```cpp=
int mul(int a,int b){
if(b==1)
return a;
return mult(a,b-1)+a;
}
```
### 遞迴加法
1+2+3+4......n
```cpp=
int sum(n){
if(n==1)
return 1;
return n+sum(n-1);
}
```
### Recursive Binary Serarch
```cpp=
int binary_serarch(int first,int end,int find){
int mid = (first+end);
if(data[mid]==find)
return mid;
if(first==end)
return -1;
if(data[mid]>find)
return binary_serarch(first,mid-1);
else
return binary_serarch(mid+1,end);
}
```
### Recursive Permutaions
生成所有可能性
#### 暴力生成
```cpp=
char * Permutaions(char * ans,char * data,char * temp,int position,bool * check,int * index){
if (position==sizeof(data)/sizeof(char)){
char * copy = (char *)malloc(sizeof(data)/sizeof(char));
strcpy(copy,temp);
ans[index++]=copy;
}
for(int i=0;i<sizeof(data)/sizeof(char);i++){
if(check[i]==0){
temp[position]=data[i];
check[i]=true;
Permutaions(ans,data,temp,position+1,check,index);
check[i]=false;
}
}
}
```
#### 交換生成
```cpp=
void Permutaions(char * data,int i,int n){
if (i==n)
printf("%s\n",ans);
for(k=i;k<sizeof(data)/sizeof(char);k++){
swap(data[i],data[k]);
Permutaions(data,i+1, n);
swap(data[i],data[k]);
}
}
```
## Space Complexity
S(P) = c + Sp(n)
## Time Complexity
O(P) = c + T(n)
### Tabular Method
ex:
```cpp=
float sum(float list[],int n){
float tempsum = 0;# O(1)
int i;
for (int i=0;i<n;++)# O(N+1)
rempsum+=list[i];# O(N)
retrun tempsum;# O(1)
}
```
O(2*n+3) => O(n)
## Complexity
### Big-Theta