資料結構- 基本概念[Chapter1 ]

來源:互聯網
上載者:User

標籤:

資料結構

  • 並無明確定義 - 不過有一個我很喜歡的 

資料結構是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 ]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.