標籤:
資料結構
資料結構是ADT(抽象資料類型Abstract Data Type)的物理實現。
解決問題方法的效率與:
迴圈解決PrintN
void PrintN(int N){ int i; for (i = 1 ;i<N ;i++) printf("%d\n", i); return ;}
遞迴解決
void PrintN(int N){ if(N){ printN(N-1); printf("%d\n",N); } return ;}
這裡遞迴的原理是當 N >=1 時候會不斷的調用PrintN(N-1),比如在一個stack上一直堆積...
直到調用到PrintN(1),此時會執行最PrintN(0)PrintN(0)不滿足if(N)的條件,會直接return,然後每一個調用的stack上的逐個return回來,形成從1列印到N....
過程應該
PrintN(N) print N
|
PrintN(N-1) print N -1
|
.......
|
PrintN(0) return
而如果N太大就會把stack記憶體用完,遞迴演算法就無法執行
注意因為Stack是一層傳遞到上一層到上一層,所以列印順序就是1,2,....N
算多項式的值
定義式演算法
f(x) = a0 + a1x +...+an-1xn-1 + anxn
double f(int n, double a[], double x){int i;double p[0] = a[0];for (int i = 1; i <= n; i++)p += ( a[i] * pow(x,i))return p;}
巧妙一點的演算法
f(x) = a0 + x(a1 +x(...+(an-1 + x(an))...))
double f(int n, double a[], double x){int i;double p = a[n];for (int i = n; i > 0; i--)p = a[i-1] + x*p;return p;}
抽象資料類型
關心資料對象集和相關操作“是什麼”,不那麼關心如何?
例子
類型名稱: 矩陣(Matrix)
對象集:AM,N = (aij)(i = 1,....M;j=1,....N)
操作集:
Matrix Create(int M, int N)
int GetMaxRow(Matrix A)
int GetMaxCol(Matrix B)
ElementType GetEntry(Matrix, int i, int j)
Matrix Add(Matrix A, Matrix B)
Matrix Multiply(Matrix A, Matrix B)
....
實際上我覺得如果有學過一門物件導向的語言會更容易理解,類也是抽象出來的,是被我們封裝好了,然後留有介面給外部用
抽象資料類型的抽象就有一點物件導向的感覺,同一種資料類型,比如Stack,我們可以在python中寫,也可以在C中寫(C的對象性沒有那麼強),但我們調用pop函數,返回的都是stack頂上的那個element,而Elementtype正是告訴了我們這個Stack中可以裝int,float,甚至struct,搞懂了一種資料類型,之後此種的implement,使用就會呈現一勞永逸的狀態
在學的過程中,我覺得首先要抽象化,比如queue,比如stack,比如linked list先明白針對這種資料類型一些特有的操作和帶來的結果
抽象化之後再來代碼化,美化,最佳化,同時把這種資料類型的代碼好好自己留下來,因為自己寫的總順手嘛,而且以後用的機會可多了.....
演算法
演算法顧名思義:計算方法
void SelectionSort( int List[], int N ){
/*將N個整數List[0]...List[N-1]進行非遞減排序 */for (i = 0 ; i < N; i++){MinPosition = ScanForMin(List, i, N-1);
/*從List[i]到List[N–1]中找最小元,並將其位置賦給MinPosition */Swap(List[i], List[MinPosition]);
/*將未排序部分的最小元換到有序部分的最後位置 */}}
演算法複雜度
空間複雜度 S(n)
時間複雜度 T(n)
最大子列和問題
給定N個整數的序列{A1,A2,...AN} , 求函數 f(i,j) = max(0,∑jk = i的最大值Ak)的最大值
演算法一:
int MaxSubseqSum1( int A[], int N){int ThisSum, MaxSum = 0;int i, j, k;for( i = 0; i < N; i++){for( j = i; j < N; j++){ThisSum = 0;for( k = i ; k<= j ; k++)ThisSum += A[k];if(ThisSum > MaxSum)MaxSum = ThisSum;}}return MaxSum;}
容易理解
但是 T(N) = O(N3)
演算法二:
int MaxSubseqSum2( int A[], int N){int ThisSum, MaxSum = 0;int i, j;for( i = 0; i < N; i++){ThisSum = 0;for(j = i; j < N; j++){ThisSum += A[j];if (ThisSum > MaxSum)MaxSum = ThisSum;}}return MaxSum;}
T(N) = O(N2)
演算法三
分而治之
....
演算法四
int MaxSubseqSum4( int A[], int N){int ThisSum, MaxSum = 0;int i;ThisSum = MaxSum = 0;for(i = 0 ; i < N; i++){ThisSum += A[i];if (ThisSum > MaxSum)MaxSum = ThisSum;else if(ThisSum < 0)ThisSum = 0;}}return MaxSum;}
T( N ) = O( N )
資料結構- 基本概念[Chapter1 ]