1. 程式人生 > 其它 >資料結構與演算法-概論

資料結構與演算法-概論

技術標籤:學習分享資料結構演算法c語言

概論

一、資料結構的研究內容

用計算機解決實際問題時,大致需要以下幾個步驟:
(1)從具體問題抽象出一個適當的數學模型。
(2)設計求解數學模型的演算法
(3)程式設計、執行並除錯程式,直到解決實際問題。

二、資料的邏輯結構

1、有關概念與術語

(1)資料
資料是指所有能輸入到計算機中並被計算機程式處理的符號的表示。所謂資料就是計算機加工處理的物件,它可以是數值資料,也可以是非數值資料。

(2)資料元素
資料元素(即結點)是資料的基本單位,在計算機程式中通常作為一個整體進行考慮和處理,一個數據元素可以由若干個資料項組成。

  • 資料是由資料元素組成的資料元素是由資料項組成的,即資料>資料元素>資料項。
    (3)資料物件
    是性質相同的資料元素的集合。
  • 資料元素與資料的關係:是集合中的個體。
  • 資料物件與資料的關係:集合的子集。
    (4)資料結構
    按某種邏輯關係組織起來的一批資料,按一定的映像方式把它存放在計算機儲存器中,並在這些資料上定義一個運算的集合。
    資料結構包含以下3方面內容:
  • 資料元素之間的邏輯關係,即資料的邏輯結構。
  • 資料元素及其關係在計算機儲存器內的表示,即資料的儲存結構。
  • 資料的運算,即對資料施加的操作。

2、資料的邏輯結構

(1)定義
資料的邏輯結構是指資料元素之間邏輯關係描述。
(2)資料的邏輯結構的分類

  • 集合。結構中的資料元素之間除了“同屬於一個集合”的關係外,別無其他關係,這是一種最簡單的資料結構。
  • 線性結構。結構中的資料元素之間存在著“一對一”的關係。線性結構的特點:表中資料元素之間是一種先後關係,對於表中任一結點,與它相鄰且在它前面的結點(即直接前驅)最多隻有一個;與表中任一結點相鄰且在其後的結點(即直接後繼)也最多隻有一個。
  • 樹形結構。結構中的資料關係“一對多”的關係。樹形結構的特點:資料元素之間是一對多關係,即一個數據元素向上和一個數據元素相連(即雙親結點),向下和多個數據元素相連(即孩子結點)。
  • 圖形結構或網狀結構。結構中任意資料元素之間都可以有關係,元素之間存在著“多對多”的關係。圖形結構的特點:圖中資料元素在著多對多的任意關係。一個結點可能有多個直接前驅和直接後繼。

三、資料的儲存結構

資料在計算機中的儲存表示稱為資料的儲存結構。即物理結構。資料的儲存結構是邏輯結構在計算機儲存器中的實現。
資料的邏輯結構和儲存結構的關係是:儲存結構是邏輯關係的映像與元素本身映像,是資料結構的實現;邏輯結構是資料結構的抽象。
1、順序儲存結構
順序儲存結構:藉助元素在儲存器中的相對位置來表示資料元素間的邏輯關係。
(1)可實現對各資料元素的隨機訪問。
(2)不利於修改,在對資料元素進行插入、刪除運算時可能要移動一系列的資料元素。
·2、鏈式儲存結構
鏈式儲存結構特點是藉助指示元素儲存地址的指標表示資料元素的邏輯關係。
(1) 利於修改,在對資料元素進行插入、刪除運算時,僅需修改資料元素的指標欄位值,而不必移動資料元素。
(2)由於邏輯上相鄰的資料元素在儲存位置中不一定相鄰,因此,鏈式儲存結構不能對資料元素進行隨機訪問。
3、索引儲存結構
索引儲存是在原有的儲存結構的基礎上,附加建立一個索引表,索引表中的每一項都由關鍵字和地址組成。例如:通訊錄。
4、雜湊儲存結構
雜湊儲存是通過的構造雜湊函式來確定資料儲存地址或查詢地址。

四、演算法和演算法分析

1、演算法概念

(1) 演算法的定義
演算法是由若干條指令所組成的有窮序列,其中每條指令表示計算機的一個或多個操作。

2、演算法的特性

一個好的演算法應該具有以下5種特性。
(1)有窮性。一個演算法必須(對任何合法的輸入值)在執行有限時間內完成,不能形成無窮迴圈。
(2)確定性。演算法中每一條指令必須有確切的含有,不能有二義性。
(3)可行性。 演算法中描述的操作都可以通過已經實現的基本運算執行有限次來實現。
(4)輸入。 一個演算法有零個或者多個輸入,這些輸入取自於某個特定物件的集合。
(5)輸出。 一個演算法必有一個或多個輸出,這些輸出是與輸入有著一定關係的量。
3、好演算法應達到的目標
(1)正確性。 要求演算法能夠正確地執行預先規定的功能,並達到所期望的效能要求。
(2)可讀性。為了便於理解、測試和修改演算法,演算法應該具有良好的可讀性。
(3)健壯性。 當輸入非法的資料時,演算法應能恰當地做出反應或進行相應處理,而不是產生莫名其妙的輸出結果。並且處理錯誤的方法不應是中斷程式的執行,而是返回一個表示錯誤的錯誤性質的值,以便更高的抽象層次上進行處理。
(4)高效性。 要求演算法的執行時間要儘可能地短,演算法的效率就越高。
(5)低儲存量。完成相同的功能,執行演算法時所佔用的附加儲存空間要儘可能地少。

3、演算法的效率評價

(1)時間複雜度
一個演算法所需的運算時間通常與所解決的問題的規模大小有關。表示為T(n),當n逐漸增大時T(n)的極限情況,一般稱為時間複雜度。即T(n)=O(n)。
演算法時間複雜度數量級越大,表示該演算法的效率越低,反之越高。例如,O(1)為常數數量級,即演算法的時間複雜度與輸入規模n無關。
對於複雜度的演算法,可以將它分成幾個容易估算的部分,然後利用大O加法法則和乘法法則,即:

  • 加法法則
    T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
  • 乘法法則
    T(n)=T1(n)*T2(n)=O(f(n))+O(g(n))=O(f(n)*g(n))
    例1、分析以下演算法的時間複雜度。
x=0;y=0;
for(k=1;k<=n;k++)
  x++;
for(i=1;i<=n;i++)
 for(j=1;i<=n;j++)
    y++;

本題,第一個迴圈執行n次,第二個迴圈它嵌套了一個迴圈,即外層迴圈執行n+1次,內層迴圈執行n*(n+1)=n^2+n則第一加第二得 T(n)=n+n^2+n+n根據定理 n趨近於無窮大即T(n)=O(n^2)。
例2、分析以下演算法的時間複雜度。

i=1;
while(i<=n)
   i=2*i;

本題,是一個while迴圈 當迴圈一次時i=2^1,…………第x次即i等於2的x次方。
即2^x<=n,所以T(n)=O(log2n)。
例3、求兩個矩陣相乘的函式的時間複雜度。

for(i=0;i<n;i++){
    for(j=0;j<n;j++){
         c[i][j]=0;
       for(k=0;k<n;k++){
         c[i][j]+=a[i][k]*b[k][j];
       }
    }
}

本題,有三層迴圈第一層n+1次,第二層n*(n+1),第三次nn(n+1),即T(n)=O(n^3)。

  • 時間複雜度是巢狀最深的語句頻度決定的。
    -基本方法:找出語句頻度最大的那條語句作為基本語句;計算基本語句的頻度得到問題規模n的某個函式f(n);取其數量級用符號“O”。
  • 最壞時間複雜度:指在最壞情況下,演算法的時間複雜度。
  • 平均時間複雜度:指在所有可能輸入例項在等概率出現的情況下,演算法的期望執行時間。
  • 最好時間複雜度:指在最好情況下,演算法的時間複雜度。
    (2)演算法的時間效率的比較
  • 當n取得很大時,指數時間演算法和多項式時間演算法在所需時間上非常懸賞。
    在這裡插入圖片描述
    時間複雜度T(n)按數量級遞增即:

在這裡插入圖片描述
(3)空間複雜度
一個演算法的空間複雜度是指程式執行開始到結束所需要的儲存空間。包括演算法本身所佔有的儲存空間、輸入\輸出資料佔有的空間以及演算法執行過程中的工作單元和實現演算法所需要輔助空間。即S(n)=O(f(n))