資料結構,資料結構與演算法
程式=演算法+資料結構
N.沃思(Niklaus Wirth)教授提出:
程式=演算法+資料結構
以上公式說明了如下兩個問題:
(1)演算法決定如何構造和組織資料(演算法→資料結構)。
(2)演算法的選擇依賴於作為基礎的資料結構(資料結構→演算法)。
軟體=程式+文檔(軟體工程的觀點)
求解非數值計算的問題
主要考慮的是設計出合適的資料結構及相應的演算法。
即:首先要考慮對相關的各種資訊如何表示、組織和儲存?
因此,可以認為:資料結構是一門研究非數值計算的程式設計問題中電腦的操作對象以及它們之間的關係和操作的學科。
資料結構基本概念
幾個概念:
資料(Data):是客觀事物的符號表示。在電腦科學中指的是所有能輸入到電腦中並被電腦程式處理的符號的總稱。
資料元素(Data Element):是資料的基本單位,在電腦程式中通常作為一個整體進行考慮和處理。
資料項目是資料的不可分割的最小單位。一個資料元素可由若干個資料項目組成。
資料對象(Data Object):是性質相同的資料元素的集合。是資料的一個子集。
什麼是資料結構?
定義1—-
是相互之間存在一種或多種特定關係的資料元素的集合。
定義2—-
按某種邏輯關係組織起來的一批資料(或稱帶結構的資料元素的集合)應用電腦語言並按一定的儲存表示 方式把它們儲存在電腦的儲存空間中,並在其上定義了一個運算的集合。
邏輯結構
資料元素間抽象化的相互關係(簡稱為邏輯結構)。
與資料的儲存無關,獨立於電腦,它是從具體問題抽象出來的數學模型。
儲存結構(物理結構)—-
資料元素及其關係(資料的邏輯結構)在電腦儲存空間中的儲存形式。
是邏輯結構用電腦語言的實現,它依賴於電腦語言。
運算(演算法)
邏輯結構—劃分方法一
(1)線性結構—-
有且僅有一個開始和一個終端結點,並且所有結點都最多隻有一個直接前趨和一個後繼。
例如:線性表、棧、隊列、串
(2)非線性結構—-
一個結點可能有多個直接前趨和直接後繼。
例如:樹、圖等。
邏輯結構—劃分方法二
一、集合 結構中的資料元素除了同屬於一種類型外,別無其它關係。
二、線性結構 結構中的資料元素之間存在一對一的關係。
三、樹型結構 結構中的資料元素之間存在一對多的關係。
四、圖狀結構或網狀結構 結構中的資料元素之間存在多對多的關係。
儲存結構
儲存結構兩方面的內容:
(1)資料元素自身值的表示(資料域)
(2)該結點與其它結點關係的表示(鏈域)
兩種基本的儲存方法:
(1)順序儲存方法(順序儲存結構)
(2)連結儲存方法(鏈式儲存結構)
同一種邏輯結構可採用不同的儲存方法(以上兩種之一或組合),這主要考慮的是運算方便及演算法的時空要求。
資料結構的運算(對資料的操作)
⑴ 建立(Create)一個資料結構;
⑵ 消除(Destroy)一個資料結構;
⑶ 從一個資料結構中刪除(Delete)一個資料元素;
⑷ 把一個資料元素插入(Insert)到一個資料結構中;
⑸ 對一個資料結構進行訪問(Access);
⑹ 對一個資料結構(中的資料元素)進行修改(Modify)
⑺ 對一個資料結構進行排序(Sort);
⑻ 對一個資料結構進行尋找(Search)。
資料類型及抽象資料類型
資料類型:在一種程式設計語言中,變數所具有的資料種類。
例1、 在FORTRAN語言中,變數的資料類型有整型、實型、和複數型
例2、在C語言中
資料類型:基本類型和構造類型
基本類型:整型、浮點型、字元型
構造類型:數組、結構、聯合、指標、枚舉型、自訂
注意:資料結構不同於資料類型,也不同於資料對象,它不僅要描述資料對象的資料類型,而且要描述資料對象各元素之間的相互關係。
抽象資料類型(Abstract Data Type ,簡稱ADT):是指一個數學模型以及定義在該模型上的一組操作。
ADT的定義僅是一組邏輯特性描述, 與其在電腦內的表示和實現無關。因此,不論ADT的內部結構如何變化,只要其數學特性不變,都不影響其外部使用。
ADT的形式化定義是三元組:ADT=(D,S,P)
其中:D是資料對象,S是D上的關係集,P是對D的基本操作集。
ADT的一般定義形式是:
ADT <抽象資料類型名>{
資料對象: <資料對象的定義>
資料關係: <資料關係的定義>
基本操作: <基本操作的定義>
} ADT <抽象資料類型名>
其中資料對象和資料關係的定義用偽碼描述。
基本操作的定義是:
<基本操作名>(<參數表>)
初始條件: <初始條件描述>
操作結果: <操作結果描述>
初始條件:描述操作執行之前資料結構和參數應滿足的條件;若不滿足,則操作失敗,返回相應的出錯資訊。
操作結果:描述操作正常完成之後,資料結構的變化狀況和 應返回的結果。
演算法
演算法的概念和描述:
什麼是演算法?
所謂演算法(Algorithm)是對特定問題求解方法(步驟)的一種描述。
為解決某一特定問題而由若干條指令組成的有窮序列。
適合於電腦程式實現的求解問題的方法
演算法的概念和描述:
一個演算法必須滿足以下五個準則:
(1)有窮性—執行了有限條指令後一定要終止。
(2)確定性(無二義)—
演算法的每一步操作都必須有確切定義,不得有任何歧義性。
(3)可(能)行性—
演算法的每一步操作都必須是可行的,即每步操作均能在有限時間內完成。
(4)輸入資料—
一個演算法有n(n>=0)個初始資料的輸入。
(5)輸出資料—
一個演算法有一個或多個與輸入有某種關係的有效資訊的輸出。
常見函數的時間複雜度按數量遞增排列及增長率。
常數階O(1)
對數階O(log2n)
線性階O(n)
線性對數階O(nlog2n)
平方階O(n2)
立方階O(n3)
……
k次方階O(nk)
指數階O(2n)
空間複雜度(Space complexity)
:是指演算法編寫成程式後,在電腦中運行時所需儲存空間大小的度量。記作: S(n)=O(f(n))
其中: n為問題的規模(或大小)
該儲存空間一般包括三個方面:
指令常數變數所佔用的儲存空間;
輸入資料所佔用的儲存空間;
輔助(儲存)空間。
一般地,演算法的空間複雜度指的是輔助空間。
一維數組a[n]: 空間複雜度 O(n)
二維數組a[n][m]: 空間複雜度 O(n*m)