1. 程式人生 > >1. 數據結構及算法簡介

1. 數據結構及算法簡介

解決 處理 常常 方法 衡量 符號表 元素 基礎知識 代碼

內容: 主要介紹數據結構及算法的基礎知識,一些基本的概念和術語,以及算法的定義、算法的特性、算法的時間復雜度和空間復雜度

註: 該系列下的數據結構及算法的代碼主要采用C語言的語法,但是因為要使用到C++的一些特性(引用類型和bool類型),代碼均將存為cpp源文件!

1. 數據結構: 數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。 ----來自百度百科

2.基本概念和術語:

數據: 是對客觀事物的符號表示,在計算機科學中是指所有能輸入到計算機中並被計算機程序處理的符號的總稱 比如: 整數和實數,字符串, 圖形, 圖像, 動畫

數據元素: 是數據的基本單位,在計算機程序中作為一個整體進行考慮和處理。比如說鏈表中的一個節點可以稱為一個數據元素。 一個數據元素可以由若幹個數據項組成,比如一本書的書名信息作為一個數據元素,而書目信息中的每一項(書名,作者,出版社)為一個數據項。數據項是數據的不可分割的最小單位

數據對象: 是性質相同的數據元素的集合,是數據的一個子集 eg: 整數數據對象,字母字符數據對象

數據結構: 相互之間存在一種或多種特定關系的數據元素的集合,數據元素之間的相互關系稱為結構

3.數據結構中的邏輯結構和存儲結構:

邏輯結構: 數據的邏輯結構是從邏輯上描述數據結構,與數據的存儲無關,是獨立於計算機的,數據的邏輯結構可以看作是從具體問題抽象出來的數學模型

邏輯結構的分類

(1)集合結構:數據元素之間除了屬於同一集合的關系外無其他關系

(2)線性結構:數據元素之間存在一對一的關系,eg:單鏈表結構中第一個節點中有一個指針指向下一個節點,第一個節點和下一個節點之間是一對一的關系

(3)樹結構: 數據元素之間存在一對多的關系, eg:在公司的管理體系中,總經理管理多名經理,而一名經理管理多名員工

(4)圖結構或網結構:數據元素之間存在多對多的關系, eg:多位同學之間的朋友關系,任何兩位同學都可以是朋友,從而構成圖結構或網結構

註:集合結構、樹結構、圖結構和網結構都屬於非線性結構

線性結構的具體數據結構:線性表(順序表、單鏈表),棧和隊列,字符串;非線性結構

的具體數據結構:樹、二叉樹、有向圖、無向圖。我將在這個專題的後面繼續詳細介紹這些結構的定義和實現。

存儲結構:數據對象在計算機中的存儲表示稱為數據的存儲結構,數據元素在計算機中有兩種基本的存儲結構,分別是順序存儲結構和鏈式存儲結構。

順序存儲結構:把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元裏,結點間的邏輯關系由存儲單元的鄰接關系來體現,由此得到的存儲表示稱為順序存儲結構 ----來自百度百科,也就是說順序存儲結構存儲的數據元素在計算機中的存儲位置是相鄰的,順序存儲結構經常借用數組來實現。比如說線性表中的順序表就是順序存儲結構。

鏈式存儲結構:不要求邏輯上相鄰的結點在物理位置上也相鄰,結點間的邏輯關系是由附加的指針字段表示的。由此得到的存儲表示稱為鏈式存儲結構----來自百度百科, 也就是說鏈式存儲結構在計算機中的存儲位置不一定相鄰,他們只是在邏輯關系上相鄰,鏈式存儲結構常常使用指針來實現。比如說線性表中的單鏈表就是鏈式存儲結構。

4.算法: 算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略機制。----來自百度百科

5. 算法的特性:算法有五大特性,分別是有窮性、確定性、可行性、輸入、輸出,任何一個算法都要具有這五個特性。

有窮性: 算法總在執行一定的步數後結束,且每一步都必須在一定的時間以內完成。也就是說算法不能永遠執行,永不結束。

確定性: 算法的每一步的含義必須明確,不能有二義性

可行性: 算法的所有操作都可以通過已經實現的基本操作運算執行有限次數實現。

輸入: 一個算法應該有0個或多個輸入。0個輸入時,算法的輸入在算法中已明確存在,不需要外界的參與,比如一個a+b的算法,在算法裏就固定a的值為1,b的值為2;多個輸入時,當用函數描述算法時,算法的輸入為函數的參數 。

輸出: 一個算法應該有一個或多個輸出,輸出是算法加工的結果。當用函數描述算法時,輸出一般用返回值或引用類型的形參表示。

6.算法的評價: 算法的評價從以下4方面評價: 正確性, 可讀性, 健壯性, 高效性

正確性: 在合理的數據輸入下能在有效的時間內得到正確的結果。

可讀性: 算法的思想易於他人理解和掌握。

健壯性: 對非法的數據有較好的處理和反應。

高效性: 高效性主要體現在時間和空間上,時間高效是指算法設計合理,執行效率高,可用時間復雜度來衡量;空間高效是指算法占用的存儲空間合理,可以用空間復雜度來衡量。

7.算法的時間復雜度和空間復雜度

時間復雜度:算法的時間復雜度是指執行算法所需要的計算工作量。一般來說,計算機算法是問題規模n 的函數f(n),算法的時間復雜度也因此記做T(n)=Ο(f(n))。----來自百度百科

常見的復雜度(復雜度由低到高):

(1)常量階:O(1) (2)對數階:O(logn) (3)線性階:O(n) (4)線性對數階:O(nlogn) (5)平方階:O(n^2) (6)立方階:O(n^3)

一個算法是由多條以上的語句構成的,算法的最終時間復雜度一般是指這些語句中的最壞復雜度(也就是復雜度最高的)。

空間復雜度:算法的空間復雜度是指算法需要消耗的內存空間。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示,空間復雜度記為S(n)=O(f(n))。同時間復雜度相比,空間復雜度的分析要簡單得多。----來自百度百科

常見算法的空間復雜度

for(int i=0;i<n/2;i++)

{

  temp = a[i];

  a[i] = a[n-i-1];

  a[n-i-1] = t;

}

上述算法是將一個一維數組a中的n個數逆序存放到原數組中,明顯該算法只用到了一個額外的變量temp,與問題規模大小n無關,其空間復雜度為O(1)

for(i=0;i<n;i++)

  b[i] = a[n-i-1];

for(i=0;i<n;i++)

  a[i] = b[i];

上述算法借用了另一個大小為n的數組b,其時間復雜度為O(n)

1. 數據結構及算法簡介