定義:數據存儲和組織的方式.
常規操做:檢索/插入/刪除/排序/更新
分類:線性、非線性html
- 線性:數組、棧、隊列、鏈表
- 非線性:樹(二叉樹、b樹、平衡樹、字典樹、紅黑樹)、散列表、堆、圖
定義:解決一系列問題的清晰指令。(解決方案)
優劣判斷:時間複雜度、空間複雜度
常見的有:排序(冒泡、快速)
動態規劃(一套解決問題的方法論),核心概念以下:git
- 狀態
- 狀態轉移方程
- 邊界條件
https://github.com/hustcc/JS-...
https://www.cs.usfca.edu/~gal...
https://visualgo.net/zh/bst
https://www.cxyxiaowu.com/
https://item.jd.com/139919397...
https://leetcode.com
- 數據結構是計算機存儲、組織數據的方式。
- 相互之間存在一種或多種特定關係的數據元素的集合。
- 合適的數據結構能夠在特定的環境下帶來更高的運行或存儲效率。
- 分類:線性、非線性
- 基本操做:檢索、更新、插入、刪除、排序。
數組、棧、隊列、鏈表
在內存中連續存儲多個元素的結構,在內存中的分配也是連續的
數組中的元素經過數組下標進行訪問,數組下標從0開始
優勢github
缺點算法
不少語言裏的「數組」實際上不是真正的數組
隊列是一種限制性線性結構
僅能在線性表的一端操做,先進棧的元素要後取出
從棧頂放入元素的操做叫入棧,取出元素叫出棧(IFLO)
場景有:路由棧、調用棧數組
隊列也是一種限制性線性結構
只能在一端添加元素,在另外一端取出元素,也就是先進先出
從一端放入元素的操做稱爲入隊,取出元素爲出隊(IFFO)
適用在多線程阻塞隊列管理
如:瀏覽器事件循環系統中的消息隊列,以及宏任務中的微任務隊列等瀏覽器
鏈表是物理存儲單元上非連續的、非順序的存儲結構
數據元素的邏輯順序是經過鏈表的指針地址實現
每一個結點包含兩個元素:存儲元素的數據域、指向下一個結點地址的指針域
根據指針的指向,鏈表能造成不一樣的結構,例如單鏈表,雙向鏈表,循環鏈表
優勢緩存
缺點數據結構
適應場景多線程
樹、散列表、堆、圖
樹是一種數據結構,它是由n個有限節點組成一個具備層次關係的集合
樹的特色:dom
二叉樹是樹的特殊一種,具備以下特色:
平衡的多叉樹
根節點至少有兩個子節點
每一個節點有M-1個key,而且以升序排列
位於M-1和M key的子節點的值位於M-1 和M key對應的Value之間
其它節點至少有M/2個子節點
全部的葉子結點都位於同一層
![]()
一種自平衡二叉查找樹
節點是紅色或黑色
根節點是黑色
每一個紅色節點的兩個子節點都是黑色
從任一節點到其每一個葉子的全部路徑都包含相同數目的黑色節點
三種操做:左旋、右旋和變色
![]()
用於統計,排序和保存大量的字符串,常常被搜索引擎系統用於文本詞頻統計
利用字符串的公共前綴來減小查詢時間,最大限度地減小無謂的字符串比較,查詢效率比哈希樹高
![]()
根據關鍵碼和值 (key和value) 直接進行訪問的數據結構
若數據的關鍵字爲k,則其值存放在f(k)的存儲位置上
f(k)稱爲散列函數,按這個思想創建的表爲散列表
哈希函數的構造方法
哈希衝突的解決方案
![]()
用散列表保存100萬個電話號碼
利用徹底二叉樹的結構來維護一組數據
堆雖然是一顆樹,可是一般存放在一個數組中
堆中某個節點的值老是不大於或不小於其父節點的值
大根堆、小根堆、堆排序
![]()
頂點、邊、權重
有向圖,無向圖
鄰接矩陣、鄰接表、十字鏈表
深度優先遍歷、廣度優先遍歷
![]()
算法是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法表明着用系統的方法描述解決問題的策略機制。
可以對必定規範的輸入,在有限時間內得到所要求的輸出。
常數階 O(1)
對數階 O(log2n)
線性階 O(n)
線性對數階 O(nlog2n)
平方階 O(n2)
立方階 O(n3)
次方階 O(nk)
指數階 O(2n)
階乘O(n!)
如圖1+2+3+4=10能夠做爲已知條件用在解決下面相似的問題上.
對稱加密
非對稱加密
First in first out (FIFO)
Last in first out (LIFO)
Least recently used (LRU)
Least Recently Used(LRU)
Random replacement (RR)
窮舉法
遺傳算法
登山算法
模擬退火
貪心算法
分類算法
調度算法
全排列算法
壓縮算法
程序 = 算法 + 數據結構