主要的資料結構及其時間、空間複雜度
基本資料結構:
1. 連結串列
連結串列通常由一組代表一個序列的節點組成。每個節點包含儲存的任意型別實際資料以及指向序列中下一個節點的指標。特殊的,還有雙向連結串列,其中每個節點都有兩個指標,分別起到承前啟後的作用。
連結串列中最基本的操作是插入連結串列、刪除連結串列以及查詢連結串列。
連結串列時間複雜度:
Linked list time complexity
Algorithm |
Average |
Worst Case |
Space Search Insert Delete |
O(n) O(n) O(1) O(1) |
O(n) O(n) O(1) O(1) |
2. 堆疊
堆疊屬於一種基本的資料結構,你只能在堆疊的頂部插入或刪除專案。這有點像一堆書,如果你想看堆疊中間的一本書,你必須先將它上面上面的所有書移走。
堆疊遵循後進先出,也就是說你最後放入堆疊的專案是第一個出棧的專案。
對堆疊主要有三種操作:push,即插入新內容到堆疊;pop,從堆疊中刪除一項內容;pip,顯示堆疊的內容。
堆疊時間複雜度:
Stack time complexity
|
Average |
Worst Case |
Space Search Insert Delete |
O(n) O(n) O(1) O(1) |
O(n) O(n) O(1) O(1) |
3. 佇列
你可以把佇列想象成一家雜貨店裡排隊買單的人,隊伍中第一個人先被服務。
佇列遵循先進先出,也就是說一旦你想添加了新元素,你要想刪除它,必須先刪除它前面的的所有元素。佇列只有兩個主要操作:入隊和出隊。 入隊,就是將新的內容插入佇列後面,而出隊就是前面所有的內容。
佇列時間複雜度:
Queue time complexity
Algorithm |
Average |
Worst Case |
Space Search Insert Delete |
O(n) O(n) O(1) O(1) |
O(n) O(n) O(1) O(1) |
4. 集合
以集合形式儲存的資料結構中不存在任何特定的順序,也不存在重複的值。除了向集合中新增新元素或者刪除元素之外,還有一些重要的集合函式可以進行兩組集合的處理。
並集、交集、差集(給定兩個集合,此函式返回另一個集合,其中各個元素屬於一個集合,但不屬於另一個集合)、子集(返回一個布林值,顯示一個集合中的所有元素是否包含在不同的集合中)。
5. MAP
Map是容器的一種,也屬於一種資料結構,它將資料儲存在鍵/值對中,且每個鍵是唯一的。map有時也稱為關聯陣列或字典,通常被用於快速查詢資料。Map可以進行以下操作:
- 在集合中增加一對
- 從集合中刪除一對
- 修改現有的一對
- 查詢與特定鍵相關聯的值
6. 雜湊表
雜湊表是包含鍵/值對的地圖資料結構,使用雜湊函式來把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。雜湊函式通常將一個字串作為輸入,並輸出一個數值。雜湊函式對相同的輸入提供相同的輸出編號。 當兩個輸入雜湊得到相同的數字輸出時,稱為碰撞。
我們的目標是沒有碰撞。所以當你將一個鍵/值對輸入到一個散列表中時,這個鍵將通過雜湊函式對映到一個數字,用作值儲存的實際鍵。 當你嘗試再次訪問相同的金鑰時,雜湊函式將處理該金鑰並返回相同的數字結果,用於查詢關聯的值。 演算法速度非常快,查詢的時間複雜度僅為O(1)。
Hash table 時間複雜度:
Hash table time complexity
Algorithm |
Average |
Worst Case |
Space Search Insert Delete |
O(n) O(1) O(1) O(1) |
O(n) O(n) O(n) O(n) |
7. 二叉搜尋樹
樹是由節點組成的資料結構,它具有以下特徵:
每棵樹都有一個根節點(位於頂部)。根節點具有零個或多個子節點。每個子節點都有零個或多個子節點。
二叉搜尋樹還具有額外的兩個特徵:
每個節點最多有兩個子節點。對於每個節點,它左邊的子節點小於當前節點,而右邊的子節點則大於當前節點。每個節點最多有兩個子節點。
二叉搜尋樹允許快速查詢、新增和刪除內容。 從它的設計結構來看,每次比較後都會跳過樹的大約一半內容,因此每次查詢、插入或刪除需要的操作時間與儲存在樹中的內容數量的對數成比例。
二叉樹時間複雜度:
Algorithm |
Average |
Worst Case |
Space Search Insert Delete |
O(n) O(log n) O(log n) O(log n) |
O(n) O(n) O(n) O(n) |
8. 字首樹或字典樹
9. 二叉堆
二叉堆是特殊的樹資料結構。形式上看它從頂點開始,每個節點有兩個子節點,每個子節點又各自有自己的兩個子節點;數值上看,每個節點的兩個子節點都比它大或小。
二叉堆有兩種:最大堆和最小堆。最大堆:父結點的鍵值總是大於或等於任何一個子節點的鍵值;最小堆:父結點的鍵值總是小於或等於任何一個子節點的鍵值。
在二叉堆上可以進行插入節點、刪除節點、取出值最小的節點、減小節點的值等基本操作。不同層之間的順序很重要,但同一層上節點的順序無關緊要。 如圖所示,你可以看到最小堆的第三層的值是10,6和12,這些數字並不是按照順序排列的。
二叉堆時間複雜度:
Binary search time complexity
Algorithm |
Average |
Worst Case |
Space Search Insert Delete Peek |
O(n) O(n) O(1) O(log n) O(1) |
O(n) O(n) O(log n) O(log n) O(1) |
10. 圖
圖是由節點(也稱為頂點)與它們之間的連線(稱為邊)構成的集合。圖也被稱為網路。社交網路是典型的圖的例子,節點是人,邊代表他們互相認識的關係。
主要有兩種型別的圖:有向和無向。無向圖是指在節點之間的邊上沒有任何方向的圖。相反,有向圖表示每條邊上都有方向的圖。
表示圖的兩種常用方式是鄰接表和鄰接矩陣:
鄰接列表,表示一個列表的左側是節點,右側列出了它所連線的所有其他節點。
鄰接矩陣,則是一個數字網格。其中每個行或列表示圖中的不同節點。每一行和一列的交點是一個表示關係的數字。0表示沒有邊或沒有關係,1表示有一種關係,而大於1的數字則可表示不同的權重。
通過遍歷演算法可以遍歷或訪問圖中的節點。遍歷演算法的主要型別有廣度優先搜尋和深度優先搜尋,可以被用於確定節點與根節點的接近程度。
鄰接列表的時間複雜度:
Adjacency list(graph) time complexity
Algorithm |
Time |
Storage Add Vertex Add Edge Remove Vertex Remove Edge Query |
O(︱V︱+︱E︱) O(1) O(1) O(︱V︱+︱E︱) O(︱E︱) O(︱V︱) |
#高階資料結構和演算法: