前端常見數據結構和特點


什么是數據結構

數據結構就是關系,沒錯,就是數據元素相互之間存在的一種或多種特定關系的集合。

  • 傳統上,我們把數據結構分為邏輯結構和物理結構。
  • 邏輯結構:是指數據對象中數據元素之間的相互關系,也是我們今后最需要關注和討論的問題。
  • 物理結構:是指數據的邏輯結構在計算機中的存儲形式。

數據元素相互之間存在的一種和多種特定的關系集合 包括二個部分組成邏輯結構,存儲結構。

邏輯結構

簡單的來說 邏輯結構就是數據之間的關系,邏輯結構大概統一的可以分成兩種 一種是線性結構,非線性結構 。

線性結構

是一個有序數據元素的集合。 其中數據元素之間的關系是一對一的關系,即除了第一個和最后一個數據元素之外,其它數據元素都是首尾相接的。

常用的線性結構有: 棧,隊列,鏈表,線性表。

非線性結構

各個數據元素不再保持在一個線性序列中,每個數據元素可能與零個或者多個其他數據元素發生聯系。

常見的線性結構有 二維數組,樹(二叉樹等)等。

存儲結構

邏輯結構指的是數據間的關系,而存儲結構是邏輯結構用計算機語言的實現。 常見的存儲結構有順序存儲、鏈式存儲、索引存儲以及散列存儲(哈希表)。

時間復雜度

一個算法的時間復雜度反映了程序運行從開始到結束所需要的時間。

把算法中基本操作重復執行的次數(頻度)作為算法的時間復雜度。

沒有循環語句,記作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 實現系列

數據結構在開發中是一種編程思想的提煉,無關於用何種語言開發或者是哪種端開發。下列將筆者涉獵到的與前端相關的數據結構案例作如下總結:

數據結構 案例
FILO: 其它數據結構的基礎,redux/koa2 中間件機制
隊列 FIFO:其它數據結構的基礎
鏈表 React 16 中的 Fiber 的優化
集合 對應 JavaScript 中的 Set
字典 對應 JavaScript 中的 Map
哈希表 一種特殊的字典,可以用來存儲加密數據
DOM TREE / HTML TREE / CSS TREE
暫時沒遇到,不過里面的 BFS/DFS 蠻常見


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM