1. 程式人生 > >算法筆記(二)數據結構

算法筆記(二)數據結構

ctu 封裝 刪除 合數 use 二叉堆 是否 允許 後繼

1.1數據結構:

數據結構實計算機中對數據的一種存儲和組織的方式,同時也泛指相互之間存在一種或多種特定關系的數據的集合。

1.1.1什麽是數據結構

到現在為止,計算機技術領域中還沒有一個統一的數據結構的定義。以下是引用的部分解釋:

名詞定義

  • 數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。記為:
Data_Structure=(D,R) 其中D是數據元素的集合,R是該集合中所有元素之間的關系的有限集合。[2]

其它定義

Sartaj Sahni在他的《數據結構、算法與應用》一書中稱:“數據結構是數據對象,以及存在於該對象的實例和組成實 例的數據元素之間的各種聯系。這些聯系可以通過定義相關的函數來給出。”他將數據對象(data object)定義為“一個數據對象是實例或值的集合”。 Clifford A.Shaffer在《數據結構與算法分析》一書中的定義是:“數據結構是ADT(抽象數據類型Abstract Data Type) 的物理實現。” Robert L.Kruse在《數據結構與程序設計》一書中,將一個數據結構的設計過程分成抽象層、數據結構層和實現層。其中,抽象層是指抽象數據類型層,它討論數據的邏輯結構及其運算,數據結構層和實現層討論一個數據結構的表示和在計算機內的存儲細節以及運算的實現。 數據結構具體指同一類數據元素中,各元素之間的相互關系,包括三個組成成分,數據的邏輯結構,數據的存儲結構和數據運算結構。

雖然並沒有一個統一的定義,但是這些定義都具有相似的含義。

數據結構實一切算法的基礎。

數據結構實程序設計語言的基礎。

2.1.1數據結構的基本概念

  數據:數據是信息的載體,是計算機程序加工的原材料。整數,字符,字符串,實體類,圖像,聲音等都可以認為是數據結構。

  數據元素:數據元素是數據的基本單位,也稱為元素,結點,頂點,記錄等。

  數據結構:數據結構指的是數據之間的相互關系,也就是數據的組織形式。

2.1.2數據結構的內容

一般來說數據結構包括數據的邏輯結構,數據的存儲結構和數據的運算。

數據的邏輯結構:

數據元素之間的邏輯關系。數據的邏輯結構是從邏輯關系上描述數據,跟數據在計算機中如何存儲無關,是獨立於計算機的抽象概念。從數學分析的角度來看,數據的邏輯結構可以看做從具體問題抽象出來的數學模型。

數據的存儲結構:

數據元素及其邏輯關系在計算機存儲器的表現形式。數據的存儲結構依賴於計算機語言,是邏輯機構用計算機語言的實現。一般只有高級語言的層次上才會討論存儲結構,低級的機器語言存儲結構是具體的。

數據的運算:

能夠對數據是假的操作。數據的運算的基礎為數據的邏輯結構,每種邏輯結構都可以歸納為一個運算的集合,常用的與運算有檢索,插入,刪除,更新和排序等。

數據結構是一個有機的整體,同一個邏輯結構可以有不同的存儲結構,同一種邏輯結構也可以有不同的數據運算集合。

數據的邏輯結構,數據的存儲結構和數據的運算任何一個發生改變都將導致一個全新的數據結構出現。

2.1.3數據結構分類

按照數據的邏輯結構可以簡單的分為線性結構和非線性結構。

線性結構:

線性結構就是表中各個節點具有線性的關系。如線性表,棧,隊列和串等。從數據結構的語言來描述,線性結構應包括:

線性結構是非空集;

線性結構有且僅有一個開始節點和一個終端節點;

線性結構所有節點左右只有一個直接前趨節點和一個直接後繼節點。

非線性結構:

表中各個節點具有多個對應關系,如數組,廣義表,樹結構和圖結構等。非線性結構應包括:

非線性結構是非空集;

非線性結構的一個節點可能有多個直接前趨節點和直接後繼節點。

數據結構的存儲方式:

順序存儲方式:

順序存儲方式就是在一塊連續的存儲區域一個接一個的存放數據。順序存儲方式把邏輯上相鄰的的節點存儲在物理位置上相鄰的存儲單元裏,節點見得邏輯關系由存儲單元的鄰接關系來體現。順序存儲方式也稱為順序存儲結構,一般用數組或結構數組來描述。

現行存儲方式主要用於現行邏輯結構的數據存放,對於圖合數等非線性結構並不適用。

鏈接存儲方式:

鏈接存儲方式不要求邏輯上相鄰的節點在物理位置上相鄰,節點間的邏輯關系由附加的引用字段標識,一個節點的引用字段往往指向下一個節點的存放位置。

鏈接存儲方式也成為鏈式存儲結構。一般在原數據項中增加引用類型表示節點之間的位置關系。

索引存儲方式:

是采用附加索引表的的方式來存節點信息的一種存儲方式。索引表由若幹索引項組成。

索引存儲方式還可以分為稠密索引和稀疏索引。

散列存儲方式:

散列存儲方式是根據節點的關鍵字直接計算出該結點的存儲地址的一種存儲方式。往往根據具體的數據結構來決定采用哪種存儲方式。

2.1.4數據類型

按照數據類型的值是否可以分解,數據類型可以分為基本數據類型和聚合數據類型。

基本數據類型:一般是程序語言自身定義的的一些數據類型。

聚合數據類型:其值可以進一步分解為若幹分量,一般是用戶自定義的數據類型。

抽象數據類型(ADT):

是指數據的組織及其相關操作。ADT可以看做數據的邏輯結構及其在邏輯結構上定義的操作。

抽象數據類型一般具有兩個重要特征:

數據抽象:使用抽象數據類型時,強調的是實體的本質特,所能夠完成的功能,以及與外部用戶的接口。

數據封裝:用於將屍體的外部特性和其內部實現細節進行分離,並且對外部用戶隱藏其內部實現細節。

2.1.4常用的數據結構

數組:

數組是一種聚合數據類型,是將具有相同類型的若幹變量有序的組織在一起的集合。

棧:

棧是一種特殊的線性表,其只能在一個表的一個固定的端進行數據節點的插入和刪除操作。棧按照後進先出的原則存儲數據。棧中沒有數據稱為空棧。

隊列:

隊列和棧類似,也是一種特殊的線性表。但隊列只允許在表的一端進行插入操作,而另一端進行刪除操作。進行插入操作的一端稱為隊尾,進行刪除操作的一端稱為隊頭。

鏈表:

鏈表是一種數據元素按照鏈式存儲結構進行存儲的樹結構,這種數據結構在物理上具有非連續的特點。鏈表由一系列數據節點構成,每個數據節點包括數據域和引用域兩部分。

樹:

樹是典型的非線性結構,是包括n個結點的有窮集合K。在樹中有且僅有一個根節點,該結點沒有前驅結點,其他結點都有且僅有一個前驅結點,而且可以有m個後繼結點。

圖:

圖是一種非線性結構。數據結點一般稱為頂點,而邊是結點的序偶對。

堆:

堆是一種特殊的樹形數據結構,一般討論的對都是二叉堆。堆得特點是根節點的值是所有節點中最小或最大的,並且根節點的兩個子樹也是一個堆結構。

散列表:

散列表源自於散列函數,其思想是如果在結構中存在關鍵字和T相等的記錄,那麽必定在F(T)的存儲位置可以找到該記錄,這樣就可以不用進行比較比較而直接取得所查記錄。

2.2線性表

線性表是由n個元素組成的有限序列。

數據元素的個數為n,數據長度為n,n=0時稱為空表。

對於一個非空線性表,其邏輯結構特征如下,

有且僅有一個開始結點a1,沒有直接前趨結點,有且僅有一個直接後繼結點a2;

有且僅有一個終結結點an,沒有直接後繼結點,有且僅有一個直接前趨結點a(n-1);

其余內部結點都有且僅有一個直接前趨結點和一個直接後繼結點。

對於同一線性表,各數據元素ai必須具有相同的數據類型,即統一==同一線性表中各項數據元素具有相同的類型,每個數據元素的長度相同。

算法筆記(二)數據結構