01.數據結構概述
數據結構是計算機中對數據的一種存儲和組織方式,泛指相互之間存在一種或多種特定關係的數據集合。
合理的數據結構能夠提高算法的執行效率,還可以提高數據的存儲效率。
02.什麼是數據結構?
計算機技術領域還沒有統一的數據結構定義,不同的專家對數據結構有責不同的描述。
Startaj Sahni 在《數據結構算法與應用》中提出“數據結構是數據對象,存在㔿該對象的實例以及組成實例的數據元素之間的各種關係,並且這種關係可以通過定義相關的函數來給出”,他將數據結構定義爲一個實例或值得集合。
Clifford A.Shaffer 在《數據結構算法分析》中提出“”數據結構是抽象數據類型ADT(abstact data type)的物理實現”
Lobert L.Kruse 認爲數據結構的設計過程可以分爲抽象層,數據結構層和實現層。其中,抽象層是指抽象數據類型層,即ADT層,主要討論數據的邏輯結構及其運算。數據結構層討論一個數據結構的表示。實現層討論一個數據結構在計算機內的存儲細節及運算實現。
雖然數據結構沒有統一的定義,但這些定義有具有相似的含義,可以簡單的理解數據結構爲:一個數據結構是有數據元素依據某種邏輯聯繫組織起來的,可對數據元素間的邏輯關係的描述稱爲數據的邏輯結構。由於數據必須在計算機內存儲,數據的存儲結構是其在計算機的內在表示,也就是數據結構的實現形式,另外,討論一個數據結構,必須涉及在該類數據上執行的運算。
數據結構是一切算法的基礎,數據結構也是程序設計語言的基礎,正是由用於對數據結構的深入理解,才導致多種多樣的程序設計語言誕生,面向對象的程序設計語言就是完善處理對象數據類型數據結結構的範例。
03.數據結構的基本概念
數據結構基本概念主要包含以下內容:
a.數據(Data)
數據是信息的載體,其能夠被計算機識別、存儲和加工處理,是計算機程序加工的原材料,數據包括的類型非常廣,如基本的整數、字符、字符串、實數等。
b.數據元素(Data Element)
數據元素是數據的基本單位,也稱爲元素,節點,頂點,記錄等。一個數據元素可以由若干數據項組成,數據項是具有獨立含義的最小標識單位,數據項也可稱爲字段,域,屬性等。
c.數據結構(Data Structure)
數據結構指的是數據之間的相互關係,即數據的組織形式。
04.數據結構的內容
數據結構的內容主要包括以下內容
a.數據的邏輯結構(Logical Structure)
數據的邏輯結構即數據元素之間的邏輯關係。數據的邏輯結構是從邏輯關係上描述數據的,與數據在計算機中如何存儲無關,也就是獨立於計算機的抽象概念,從數學分析的角度來看,數據的邏輯結構可以看做從具體的問題抽象出來的數據模型。
b.數據的存儲結構(Storage Structure)
數據的存儲結構即數據元素及其邏輯關係在計算存儲器中表示形式。數據存儲結構依賴於計算機語言,是邏輯結構用計算機語言實現。一般來說,只有在高級語言的層次上纔會討論存儲結構,在第幾的機器語言中存儲結構是具體的。
c.數據的運算
數據的運算即能夠對數據施加的操作。數據的運算的基礎爲數據的邏輯結構,每種邏輯結構都可以歸納爲一個運算的集合。在數據結構的範疇內,最常用的運算包括檢索,插入,刪除,更新,排序等。
數據結構是一個有機的整體
數據的邏輯結構數據的存儲結構和數據的運算是一個整體,孤立的去理解這三者中的任何一個都是不全面的。
同一個邏輯結構可以由不同的存儲結構。邏輯結構和存儲結構是兩個概念,同一個邏輯踩踏順序方式存儲,這種結構就是順序表。如何線性表採用鏈式的方式存儲,這種數據結構就是鏈表。如果線性表採用散列方式存儲嗎,這種數據結構就是散列表。
同一種邏輯結構可以由不同的數據運算集合。數據的運算時數據結構中十分重要的內容,一個像他的數據邏輯結構和存儲結構採用不同的運算集合及運算性質。將導致全新的數據結構。如將線性表的插入運算限制在表的一段,而刪除操作限制在表的另一端,那麼這種數據結構就是隊列,如將線性表的插入和刪除操作都限制在表的同一端,那麼這種數據結構就是棧。
數據結構的這三方面是一個有機的整體,缺一不可,數據的邏輯結構,數據存儲結構和數據的運算任何一個發生變化都將導致一個全新的數據結構出現。
05.數據結構的分類
按照數據的邏輯結構來堆其進行分類可以分爲線性結構和非線性結構
1.線性結構
線性結構就是表中各個節點之間具有線性關係,如果從數據結構的語言鍾來描述,其包括如下內容
a.線性結構是非空集
b.線性結構有且僅有一個開始結點和終端結點
c.線性結構所有結點最多隻有一個直接前趨結點,還有一個後繼結點。
線性表就是典型的線性結構,還有棧、隊列、和串都是線性結構。
2.非線性結構
非線性結構就是表中的各個結點之間具有多個對應關係。如果從數據結構的語言來描述,非線性結構應該包括如下內容
a.非線性結構是非空集
b.非線性結構的一個結點可能有多個直接前趨結點和直接後繼結點。
在實際應用中,數組、廣義表、樹結構和圖結構等數據結構都是非線性結構。
06.數據結構的幾種存儲方式
數據的存儲結構可以採用如下幾種方法來實現
a.順序存儲方式
順序存儲方式就是在一塊連續的存儲區域一個接着一個地存放數據。順序存儲方式把邏輯上相鄰的結點存儲在物理位置上相鄰的存儲單元裏,結點間的邏輯關係由存儲單元的鄰接關係來體現。順序存儲方式也稱爲順序存儲結構(Sequential Storage Structure)一般採用數組或者結構數組來描述。
線性存儲方式主要用於線性邏輯結構的數據存放,而對於圖和數等非線性邏輯結構則不適用。
b.鏈接存儲方式
鏈接存儲方式不要求邏輯上相鄰的結點在物理位置上相鄰,結點間的關係由附加的引用字段表示,一個結點的引用字段往往指向下一個結點的存放位置。
c.索引存儲方式
索引存儲方式是採用附加的索引表的方式來存儲結點信息的一種存儲方式,索引表由若干索引項組成,索引存儲方式中索引項一般形式爲(關鍵字,地址)其中關鍵字是能夠唯一標識一個結點的數據項。
d.散列存儲方式
散列存儲方式是根據結點的關鍵字直接計算出該結點的存儲地址的一種存儲方式。
06.數據類型
數據類型是一個值的集合,以及在這些值上定義的一系列操作總稱。
基本數據類型:值不能進一步分解。如整型 字符型 浮點型
聚合數據類型:值可以分解爲若干分量 如數組
抽象數據類型:數據的組織及其相關的操作,可以看做數據的邏輯結構及其在邏輯結構上定義的操作
07.常用的數據結構
1.數組(Array)
數組是一種聚合的數據類型,是將具有相同類型的若干變量有序地組織在一起的集合。
2.棧(Stack)
棧是一種特殊的線性表,其只能在一個表的一個固定端進行數據結點的插入和刪除操作。先進後出。先插入的數據被壓入棧底,最後插入的數據在棧頂,讀數據時,從棧頂開始逐個讀出。棧中沒有元素稱爲空棧。
3.隊列(Queue)
隊列是一種特殊的線性表。隊列值允許在表的一端進行插入操作,另一段進行刪除操作,插入一端叫做稱爲隊尾,刪除一端叫做隊頭,隊列中沒有元素時稱爲空隊列。
4.鏈表(Linked List)
鏈表是一種數據元素按照鏈式存儲結構進行存儲數據結構,這種存儲結構在物理上具有非連續的特點,鏈表由一系列的數據結點構成,每個數據結點包括數據域和引用域兩部分,其中,引用域保存了數據結構中下一個元素存放的地址,鏈表結構中數據元素的邏輯順序是鏈表中引用鏈接次序來實現的。
5.數(Tree)
數是一種典型的非線性結構,其是包括n個結點的有窮集合L。在樹結構中,有且僅有一個根結點,且該結點沒有前驅結點,在樹結構中的其他結點都有且僅有一個前驅結點,而且有m個後繼結點,m>=0.
6.圖(Graph)
圖是一種非線性數據結構,在圖結構中,數據結點一般稱爲頂點,而邊是頂點的有序偶對。如果兩個頂點之間存在一條邊,那麼就表示這兩個頂點具有相鄰關係。
7.堆(Heap)
堆是一種特殊的樹形數據結構,一般討論的堆都是二叉堆。堆的特點是其根結點的值是所有結點中最小的或者最大的,並且根結點的兩個子樹也是堆結構。
8.散列表(Hash)
散列表源自散列函數(Hash function),其思想是如果在結構中存在關鍵字和T相等的記錄,那麼必定在F(T)的存儲位置可以找到該記錄,這樣就可以不用比較直接取得所查找的記錄。