數據結構及算法


基本概念和術語

1、數據(Data)

  數據是外部世界信息的載體,它能夠被計算機識別、存儲和加工處理,是計 算機程序加工的原料。計算機程序處理各種各樣的數據,可以是數值數據,如整 數、實數或復數;也可以是非數值數據,如字符、文字、圖形、圖像、聲音等。

2、數據元素(Data Element)和數據項(Data Item)

  數據元素是數據的基本單位,在計算機程序中通常被作為一個整體進行考慮 和處理。數據元素有時也被稱為元素、結點、頂點、記錄等。一個數據元素可由 若干個數據項(Data Item)組成。數據項是不可分割的、含有獨立意義的最小數據 單位,數據項有時也稱為字段(Field)或域(Domain)。

3、數據對象(Data Object)

  數據對象是性質相同的數據元素的集合,是數據的一個子集。

4、數據類型(Data Type)

  數據類型是高級程序設計語言中的概念,是數據的取值范圍和對數據進行操 作的總和。

5、數據結構(Data Structure)

  數據結構是相互之間存在一種或多種特定關系的數據元素的集合。在任何問 題中,數據元素之間都不是孤立的,而是存在着一定的關系,這種關系稱為結構 (Structure)。根據數據元素之間關系的不同特性,通常有 4 類基本數據結構:

(1) 集合(Set):如圖 1.1(a)所示,該結構中的數據元素除了存在“同屬於一個集 合”的關系外,不存在任何其它關系。

(2) 線性結構(Linear Structure):如圖 1.1(b)所示,該結構中的數據元素存在着一 對一的關系。

(3) 樹形結構(Tree Structure):如圖 1.1(c)所示,該結構中的數據元素存在着一對 多的關系。

(4) 圖狀結構(Graphic Structure):如圖 1.1(d)所示,該結構中的數據元素存在着 多對多的關系。

 

 

 

 

數據結構的形式化定義為:數據結構(Data Structure)簡記為 DS,是一個二元組,DS = (D,R)

其中:D 是數據元素的有限集合,R 是數據元素之間關系的有限集合。

 

算法

  算法與數據結構和程序的關系非常密切。進行程序設計時,先確定相應的數據結構,然后再根據數據結構和問題的需要設計相應的算法。由於篇幅所限,下面只從算法的特性、算法的評價標准和算法的時間復雜度等三個 方面進行介紹。

算法的特性

  算法(Algorithm)是對某一特定類型的問題的求解步驟的一種描述,是指令的有限序列。其中的每條指令表示一個或多個操作。一個算法應該具備以下 5 個特性:

1、有窮性(Finity):一個算法總是在執行有窮步之后結束,即算法的執行時間是 有限的。

2、確定性(Unambiguousness):算法的每一個步驟都必須有確切的含義,即無二 義,並且對於相同的輸入只能有相同的輸出。

3、輸入(Input):一個算法具有零個或多個輸入。它即是在算法開始之前給出的量。這些輸入是某數據結構中的數據對象。

4、 輸出(Output):一個算法具有一個或多個輸出,並且這些輸出與輸入之間存 在着某種特定的關系。

5、 能行性(realizability):算法中的每一步都可以通過已經實現的基本運算的有 限次運行來實現。

算法的評價標准

  對於解決同一問題的不 同算法,選擇哪一種算法比較合適,以及如何對現有的算法進行改進,從而設計出更適合於數據結構的算法,這就是算法評價的問題。評價一個算法優劣的主要標准如下:

1、正確性(Correctness)。

2、可讀性(Readability)。算法主要是為了人閱讀和交流,其次才是機器的執行。

3、健壯性(Robustness)。一個算法應該具有很強的容錯能力,當輸入不合法的數 據時,算法應當能做適當的處理,使得不至於引起嚴重的后果。

4、運行時間(Running Time)。運行時間是指算法在計算機上運行所花費的時間, 它等於算法中每條語句執行時間的總和。

5、占用空間(Storage Space)。占用空間是指算法在計算機上存儲所占用的存儲空 間,包括存儲算法本身所占用的存儲空間、算法的輸入及輸出數據所占用的存儲 空間和算法在運行過程中臨時占用的存儲空間。

算法的時間復雜度

  一個算法的時間復雜度(Time Complexity)是指該算法的運行時間與問題規模的對應關系。

  如果一個算法沒有循環語句,則算法中基本操作的執行頻度與問題規模n無 關,記作O(1),也稱為常數階。如果算法只有一個一重循環,則算法的基本操作 的執行頻度與問題規模n呈線性增大關系,記作O(n),也叫線性階。常用的還有 平方階O(n2 )、立方階O(n3 )、對數階O(log2n)等。

下面舉例來說明計算算法時間復雜度的方法。

 

【例1-4】 分析以下程序的時間復雜度。 
 x=n; /*n>1*/ 
 y=0; 
 while(y < x) 
 { 
      y=y+1; //
 } 
解:這是一重循環的程序,while 循環的循環次數為 n,所以,該程序段中
語句①的頻度是 n,則程序段的時間復雜度是 T(n)=O(n)。 

【例1-5】 分析以下程序的時間復雜度。 
 for(i=1;i<n;++i) { 
    for(j=0;j<n;++j) 
    { 
        A[i][j]=i*j; ① 
     } 
 }
解:這是二重循環的程序,外層for循環的循環次數是n,內層for循環的循
環次數為n,所以,該程序段中語句①的頻度為n*n,則程序段的時間復雜度
為T(n)=O(n2)。 

【例1-6】 分析以下程序的時間復雜度。 
 x=n; /*n>1*/ 
 y=0; 
 while(x >= (y+1)*(y+1)) 
 { 
     y=y+1; ① 
 } 
解:這是一重循環的程序,while 循環的循環次數為 n,所以,該程序段
中語句①的頻度是 n,則程序段的時間復雜度是 T(n)=O( n)。 

【例1-7】 分析以下程序的時間復雜度。 
 for(i=0;i<m;i++) { 

     for(j=0;j<t;j++) { 

         for(k=0;k<n;k++) { 
            c[i][j]=c[i][j]+a[i][k]*b[k][j]; //
         } 
     } 
 } 
解:這是三重循環的程序,最外層 for 循環的循環次數為 m,中間層 for 循
環的循環次數為 t,最里層 for 循環的循環次數為 t,所以,該程序段中語
句①的頻度是 m*n*t,則程序段的時間復雜度是 T(n)=O(m*n*t)。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM