什么是數據結構
數據結構就是關系,沒錯,就是數據元素相互之間存在的一種或多種特定關系的集合。
- 傳統上,我們把數據結構分為邏輯結構和物理結構。
- 邏輯結構:是指數據對象中數據元素之間的相互關系,也是我們今后最需要關注和討論的問題。
- 物理結構:是指數據的邏輯結構在計算機中的存儲形式。
數據元素相互之間存在的一種和多種特定的關系集合 包括二個部分組成邏輯結構,存儲結構。
邏輯結構
簡單的來說 邏輯結構就是數據之間的關系,邏輯結構大概統一的可以分成兩種 一種是線性結構,非線性結構 。
線性結構
是一個有序數據元素的集合。 其中數據元素之間的關系是一對一的關系,即除了第一個和最后一個數據元素之外,其它數據元素都是首尾相接的。
常用的線性結構有: 棧,隊列,鏈表,線性表。
非線性結構
各個數據元素不再保持在一個線性序列中,每個數據元素可能與零個或者多個其他數據元素發生聯系。
常見的線性結構有 二維數組,樹(二叉樹等)等。
存儲結構
邏輯結構指的是數據間的關系,而存儲結構是邏輯結構用計算機語言的實現。 常見的存儲結構有順序存儲、鏈式存儲、索引存儲以及散列存儲(哈希表)。
時間復雜度
一個算法的時間復雜度反映了程序運行從開始到結束所需要的時間。
把算法中基本操作重復執行的次數(頻度)作為算法的時間復雜度。
沒有循環語句,記作O(1),也稱為常數階。
只有一重循環,則算法的基本操作的執行頻度與問題規模n呈線性增大關系,記作O(n),也叫線性階。
常用的還有平方階O(n2)、立方階O(n3)、對數階O(log2n)等。 常見的時間復雜度有:
O(1)< O(log2n)< O(n)< O(n2)< O( n3 )< O( 2n )
1.數組(Array)
數組是最簡單、也是使用最廣泛的數據結構。數組是可以在內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素通過數組下標進行訪問,數組下標從0開始。
- 數組:查詢快,增刪慢
- 查詢快:數組的地址是連續的,我們通過數組的首地址可以找到數組,通過數組的索引可以快速查找某一個元素
- 增刪慢:數組的長度是固定的,我們想要增加/刪除一個元素,必須創建一個新的數組,把原數組的數據復制過來
2.棧(Stack)
棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點是:先進后出,或者說是后進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。
- 棧: 先進后出(入口出口在同一側)
3.隊列(Queue)
隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端取出元素,也就是:先進先出。從一端放入元素的操作稱為入隊,取出元素為出隊。
- 隊列:先進先出(入口出口在兩側,分開的)
4.鏈表(Linked List)
鏈表是物理存儲單元上非連續的、非順序的存儲結構,數據元素的邏輯順序是通過鏈表的指針地址實現,每個元素包含兩個結點,一個是存儲元素的數據域 (內存空間),另一個是指向下一個結點地址的指針域。根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等。
- 鏈表:查詢慢,增刪快
- 查詢慢:鏈表地址不是連續的,每次查詢都要從頭開始
- 增刪快:增加/刪除一個元素,對鏈表的整體結構沒有影響,所以增刪快
5.散列表(Hash)
散列表,也叫哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。
Hash表是一種特殊的數據結構,它同數組、棧、鏈表等相比較有很明顯的區別,它能夠快速定位到想要查找的記錄,而不是與表中存在的記錄的關鍵字進行比較來進行查找。
哈希表是基於鍵值對的一種數據存儲結構,key值不可以重復,value可以重復,后面添加的重復的key值的時候,會把之前key值對應的value給覆蓋掉,JavaScript中的對象具有天然的哈希特性。
6.樹(Tree)
樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合。把它叫做 “樹” 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。在日常的應用中,我們討論和用的更多的是樹的其中一種結構,就是二叉樹。
7.堆(Heap)
堆是一種比較特殊的數據結構,可以被看做一棵樹的數組對象,具有以下的性質: 堆中某個節點的值總是不大於或不小於其父節點的值; 堆總是一棵完全二叉樹。
8.圖(Graph)
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
https://segmentfault.com/a/1190000020011987
常見數據結構的 JavaScript 實現系列
- Stack
- Queue
- List
- Set
- Dictionary
- Hash Table
- Binary Tree
- Graph### 前端與數據結構
數據結構在開發中是一種編程思想的提煉,無關於用何種語言開發或者是哪種端開發。下列將筆者涉獵到的與前端相關的數據結構案例作如下總結:
數據結構 | 案例 |
---|---|
棧 | FILO: 其它數據結構的基礎,redux/koa2 中間件機制 |
隊列 | FIFO:其它數據結構的基礎 |
鏈表 | React 16 中的 Fiber 的優化 |
集合 | 對應 JavaScript 中的 Set |
字典 | 對應 JavaScript 中的 Map |
哈希表 | 一種特殊的字典,可以用來存儲加密數據 |
樹 | DOM TREE / HTML TREE / CSS TREE |
圖 | 暫時沒遇到,不過里面的 BFS/DFS 蠻常見 |