基本概念和術語
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)。
