--- tags: 資料結構, --- # 資料結構 第一章 基本概念 ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_06f99200d12675581dc1722006aad121.png) ## 一、系統生命週期(System Life Cycle) ### (一)要求(Requirements) 制定所有情況下的輸入和輸出的描述 ### (二)分析(Analysis) #### 大致上分為兩種方式 (1) bottom-up:【由下至上EX:合併排序(Merge Sort)】 (2) top-down:【由下至上EX:快速排序(Quicksort Sort)】 ### (三)設計(Design) 利用ADT來表示資料型態(EX:Array、List...etc),與資料的操作(EX:插入、刪除...etc) ### (四)精細編碼(Refinement and coding) 在此階段實現ADT的操作。 ### (五)驗證(Verification) 在此階段驗證程序(程式)的的正確性。 ## 二、演算法(algorithm) ### (一)Definition 必須滿足下面五點 1.輸入(Input):必須提供大於等於零的輸入 2.輸出(Output):至少要產生一個輸出(不能沒有輸出) 3.確定性(Definiteness):指令必須明確,不能模凌兩可。 4.有限性(Finiteness):演算法必須在有限的步驟下結束。 5.有效性(Effectiveness):原則上必須可以讓人使用鉛筆或紙追蹤此演算法。 ### (二)遞迴演算法(Recursive Algorithms) 1.Define :函數可以呼叫自己(self-calling) 2.遞迴類型 (1)直接遞迴(direct recursion) ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_a5900ae1a31c9394c664fdd56a5bf8aa.png) (2)間接遞迴(indirect recursion) ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_a1078dc1317da31d2dfadc7e85685dcf.png) ### (三)課本範例 1.【Binary search】: int binsearch(int list[], int searchnum,int left, int right) { int middle; if (left <= right) { middle =(left+right)/2; switch(COMPARE(left[middle],searchnum)) { case -1: return binsearch(list,searchnum,middle+1,right); case 0: return middle; case 1: return binsearch(list,searchum,left,middle -1); } } return -1; } --- 想法概念操作如下: Step1:計算出middle值 Step2:將middle值當作索引取出Array中的值 Step3:比較取出的值是否為搜尋的值 實際操作如下: ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_bb64ed7bd3dfcad1c80e3ddb802f61b3.png) ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_01d11b35d4bcddfa05ae61899cb9c35f.png) --- 使用If else 【自己修改如有錯誤請賜教^^"】 int binsearch(int list[], int searchnum,int left, int right) { int middle; if (left <= right) { middle =(left+right)/2; if(left[middle]<searchnum) return binsearch(list,searchnum,middle+1,right); else if (left[middle]=searchnum) return middle; else // left[middle]>searchnum return binsearch(list,searchum,left,middle -1); } return -1; } --- 2.【Permutations】 void perm(char *list, int i ,int n) { int j, temp; if(i==n) { for(j=0; j<=n ;j++) print("%c",list[j]); } else { for(j=i; j <= n; j++) { swap(list[i],list[j],temp); perm(list,i+1,n); Swap(list[i],list[j],temp); } } } 想法概念操作如下: Step1:讓每個data輪流當排頭 Step2:進行排列組合 ## 三、資料抽象化(Data Abstraction) ### (一)資料型態 (data type) 資料型態為物件的集合並包含對這些物件的操作及運算 ### (二)抽象資料型態 (Abstract Data Type, ADT) 抽像數據型態(ADT)是這樣一種數據類型,其提供物件的操作等規範,其表示方法並非具體實現。 ## 四、性能分析(Performance Analysis) ### (一)空間複雜度(Space Complexity) #### 1.Definition: 隨著資料量的增加程序完成運行所需記憶體空間的成長 #### 2.空間類型區分兩種 1.固定空間(Fixed space) 2.變動空間(Variable space) ### (二)時間複雜度(Time Complexity) #### Definition: 程序完成執行所需的計算機時間 ### (三)漸進符號(Asymptotic Notation) #### 1.Definition O[Big “oh”] f(n)= O(g(n)) iff there exist positive constants c and n~0~ such that f(n) < cg(n) for all n, n > n~0~ #### Definition: Ω[Omega] f(n)= Ω(g(n)) iff there exist positive constants c and n~0~ such that f(n) > cg(n) for all n, n > n~0~ #### Definition: Θ[Theta] f(n)= Θ(g(n)) iff there exist positive constants c~1~, c~2~, and n0 such that c~1~g(n) < f(n) < c~2~g(n) for all n, n > n~0~ ### (四)實踐複雜性(Practical Complexities) ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_a89427296a19f4245d8f7db92fbf3d24.jpg) ## 五、效能評估(Performance Measurement) ![](https://s3-ap-northeast-1.amazonaws.com/g0v-hackmd-images/uploads/upload_d76b758b659991ea3f3a3ea0ea3c7164.jpg) > 參考資料:Fundamentals of Data Structures in C by Ellis Horowitz, Sartaj Sahni, Susan Anderson-Freed