我被課輔部拉來教資料結構了QQ,不過其實我最近也想複習資料結構啦!!
本文參考自浙江大學 劉越姥姥,線上課程連結詳見文末。
學資料結構幹嘛?
- JAVA2會用到,子賢會把你當掉
- 資料結構幾乎是研究所必考考科,現在好好學對未來沒壞處
- 資料結構也是各大公司招考時的考科
資料結構是什麼?
對我來說,資料結構是教你如何讓程式跑的更迅速、更省空間、更規範。 想一個問題你要建一個圖書館,請問書怎麼放?
問題牽涉兩個層面
- 我要如何插入書
- 我要如何找到書
- 書架要多大
資料結構離不開這三個問題: 插入、查找、空間
有三個方法
- 隨便放,有書就塞,管他是小紅帽還是電腦網路概論。
- 按ㄅㄆㄇ放。
- 先分類,小紅帽放童話、電網放計算機,再按ㄅㄆㄇ放。
考慮一下優劣,考慮一下插入時間、空間,查找時間、空間。
答案:
- 所需空間: 3>2>1
- 插入時間: 1>2>3
- 查找時間: 3>2>>>>>>1
問題是我們要如何具體衡量?
時間複雜度
時間複雜度是程序所需要的處理時間,記做O()表示,n為變數假設執行10次則n=10,10000000次則n=1000000。以下為O(1)程式執行一次。
function a(int n){
print("%d/n",n); //打印一次
}
以下O(N)
function a(int n){
for(int i=0;i<n;i++){
print("%d/n",i) //由於for執行了N次
}
}
猜猜以下執行幾次
double fun(int n,double a[],double x){
double p;
for(int i=0;i<n;i++)
p+=(a[i]*pow(x,i)); //pow為指數,代表x被成i次
return p;
}
解答: for的N * pow的 (N+N-1+N-2+…..1)=(N2+N),但一般來說當N資料量巨大時可以捨棄尾數,因此我們可以說這個函數時間複雜度為O(N2)。
空間複雜度
空間複雜度其實就是空間大小啦!!一般來說出現在考陣列與遞規函數出現時。
void PrintN(int N){
if(N>0){
PrintN(N-1);
}
print("%d",N);
}
當遞規函數N呼叫下一個遞規時N-1,他會先保存現在狀態N進記憶體。當N=10000時,記憶體需要空間10000單位,所以空間複雜度為 O(N)。
!! 當我們在講O(x)時我們都是在講最壞的情況
試試看:
下面代碼的時間複雜度
if(A>B){
for(i=0;i<N;i++){
for(j=N*N;j>i;j--){
A+=B;
}
}
}else{
for(i=0;i<N*2;i++){
for(j=N*2;j>i;j--){
A+=B;
}
}
}