數據結構
定義:數據結構是計算機存儲、組織數據的方式。是一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。
精心選擇的數據結構可以帶來高效運行和或者存儲效率。 與檢索算法,索引有關系。
簡單來說,數據結構是帶”結構”的數據元素集合。
結構:分為邏輯結構和存儲結構(物理結構)
意義:從具體(實際問題)到抽象(數據結構)的過程,核心是分解和抽象,
1)分解可以划分出數據的三個層次,通過抽象,舍棄數據元素的的具體內容,得到邏輯結構。
2)通過分解將處理要求划分成各種功能,在通過抽象舍棄現實細節,得到運算定義
將上述兩方面結合起來,將問題變成數據結構。通過增加對實現細節的考慮進一步得到存儲結構和實現運算,從而完成設計任務
邏輯結構
指的是反映數據元素之間的邏輯關系的數據結構,邏輯關系指的是數據元素之間的前后關系,而與其在計算機中的存儲位置沒有關系。
邏輯結構包括:
{
集合:數據結構中元素之間除了同屬一個集合之間的相互關系之外,無別的關系
線性結構: 數據結構中的元素存在一對一的相互關系
樹形結構: 數據結構中元素存在一對多的相互關系
圖形結構: 數據結構中的元素存在多對多的相互關系
}
物理結構
指的是數據的邏輯結構在計算機存儲空間的存放形式,包括①元素的計算機內表示以及 ②元素之間關系的計算機機內表示。
物理結構實現方法:順序,鏈式,索引,散列(hash) 所以一種數據結構可以表示成多種存儲結構
{
①元素機內表示:節點(節點是二進制的(bit)的位串 0101001這種,多片數據節點 在一起稱之為數據域)
②元素關系的表示:機內表示可分為順序映像和非順序映像,常用的兩種存儲結構: 順序存儲結構,鏈式存儲結構
}
分類:這是從邏輯上分為線性和非線性
1.線性結構:有線性關系的結構
特點:①非空集和 ②有且只有一個起點與一個終點 ③所有節點都最多只有一個前節點和后節點
典型: 線性表,棧,隊列和串(字符串)
2.非線性結構:各個節點之間是多個對應關系
特點:①非空集和 ②一個節點可能有多個前節點和后節點
典型:數組,廣義表,,樹結構, 圖結構等
常用數據結構
數組:非線性結構
邏輯上是非線性結構,相同類型的多個變量組合在一起的集合
邏輯結構 :集合
存儲結構:可以是多種,一般來說是順序存儲,JavaScript中是鏈式存儲
代碼實現:基礎數據結構數組
棧:線性結構
線性結構,邏輯上是一種特殊的線性表
特點:只能從一個表的一端插入和刪除數據,后進先出,先進后出
邏輯結構: 線性結構
物理結構:存儲方式可以使順序(數組)或者鏈式(鏈表)。棧更多用順序表實現。
實現方式可以是數組或者鏈表,前者容量有限且固定,后者不受限,但是操作不方便,並且每次入棧要申請內存,出棧要釋放內存,容易內存泄漏。
代碼實現:Go可以用數組 和切片實現
隊列:線性結構
特點:隊列允許從表的一端進行插入操作,在另一端進行刪除操作,進行插入的是隊尾,刪除的是隊頭,沒有元素為空隊列
邏輯結構:線性結構
物理結構:順序結構和鏈式結構都可以存儲,一般來說用鏈式結構存儲隊列更合適,頭指針指向頭結點,尾指針指向尾結點,空隊列,兩個都指向頭結點
代碼實現:
鏈表:非線性結構,二叉鏈表
特點:鏈式結構存儲數據的數據結構,每個數據節點包括數據域和指針域,指針域保存了數據結構中下一個元素存放的地址。鏈表結構中數據元素的邏輯順序是通過鏈表中的指針鏈接次序來實現的
邏輯結構:非線性
物理結構:鏈式存儲
代碼實現:
樹:非線性結構
特點:有且僅有一個頂點,頂點沒有前節點。且其他每個節點有且僅有一個前節點。但是子節點可以有多個
邏輯結構:非線性
物理結構:可以用順序存儲和鏈式存儲
代碼實現
堆:特殊的樹形結構。完全二叉樹,非線性結構
特點:堆的特點是根結點的值是所有結點中最小的或者最大的,並且根結點的兩個子樹也是一個堆結構,
邏輯結構:非線性
物理結構:
代碼實現:
圖:另一種非線性結構
特:數據結點一般稱為頂點,而邊是頂點的有序偶對。如果兩個頂點之間存在一條邊,那么就表示這兩個頂點具有相鄰關系
邏輯結構:非線性
物理結構:
代碼實現:
散列表:散裂函數
