JavaScript算法與數據結構
陸陸續續會完善裏面的知識點的細節,讓通篇更完整,死磕自己,我們共勉~
目的
- 系統、全面的提高自己的對數據結構的理解,打磨自己的內功
- 在開發正更好的理解他人定義的數據含義
- 更好的抽象合適的數據結構用於實際需求
數據結構
數據結構是在計算機中組織和存儲數據的一種特殊方式,使得數據可以高效地被訪問和修改。更確切地說,數據結構是數據值的集合,表示數據之間的關係,也包括了作用在數據上的函數或操作。
B
- 初學者, A
- 進階
帶有鏈接的則代表已經進行了總結稍安勿躁
B
數組B
鏈表B
雙向鏈表B
隊列B
棧B
哈希表B
堆 - 最大堆 & 最小堆B
優先隊列A
字典樹A
樹A
二叉查找樹A
AVL 樹A
紅黑樹A
線段樹 - 使用 最小/最大/總和 範圍查詢示例A
樹狀數組 (二叉索引樹)
A
圖 (有向圖與無向圖)A
並查集A
布隆過濾器
算法
算法是如何解決一類問題的明確規範。算法是一組精確定義操作序列的規則。
B
- 初學者, A
- 進階
算法主題
- 數學
B
Bit 操控 - set/get/update/clear 位、乘以/除以二進制位 、變負等B
階乘B
斐波那契數 - 經典 和 閉式 版本B
素數檢測 (排除法)B
歐幾里得算法 - 計算最大公約數 (GCD)B
最小公倍數 (LCM)B
素數篩 - 查找任意給定範圍內的所有素數B
判斷 2 次方數 - 檢查數字是否爲 2 的冪 (原生和按位算法)B
楊輝三角形B
複數 - 複數及其基本運算B
弧度和角 - 弧度與角的相互轉換B
快速算次方A
整數拆分A
割圓術 - 基於 N-gons 的近似 π 計算A
離散傅里葉變換 - 把時間信號解析成構成它的頻率
- 集合
B
笛卡爾積 - 多集合結果A
洗牌算法 - 隨機置換有限序列A
冪集 - 該集合的所有子集A
排列 (有/無重複)A
組合 (有/無重複)A
最長公共子序列 (LCS)A
最長遞增子序列A
最短公共父序列 (SCS)A
揹包問題 - 0/1 和 無邊界 問題A
最大子數列問題 - BF 算法 和 動態規劃A
組合求和 - 查找形成特定總和的所有組合
- 字符串
B
漢明距離 - 符號不同的位置數A
萊溫斯坦距離 - 兩個序列之間的最小編輯距離A
Knuth–Morris–Pratt 算法 KMP 算法 - 子串搜索 (模式匹配)A
字符串快速查找 - 子串搜索 (模式匹配)A
Rabin Karp 算法 - 子串搜索A
最長公共子串A
正則表達式匹配
- 搜索
B
線性搜索B
跳轉搜索/塊搜索 - 搜索有序數組B
二分查找 - 搜索有序數組B
插值搜索 - 搜索均勻分佈的有序數組
- 排序
B
冒泡排序B
選擇排序B
插入排序B
堆排序B
歸併排序B
快速排序 - in-place (原地) 和 non-in-place 版本B
希爾排序B
計數排序B
基數排序
- 鏈表
B
正向遍歷B
反向遍歷
- 樹
B
深度優先搜索 (DFS)B
廣度優先搜索 (BFS)
- 圖
B
深度優先搜索 (DFS)B
廣度優先搜索 (BFS)B
克魯斯克爾演算法 - 尋找加權無向圖的最小生成樹 (MST)A
戴克斯特拉算法 - 找到圖中所有頂點的最短路徑A
貝爾曼-福特算法 - 找到圖中所有頂點的最短路徑A
弗洛伊德算法 - 找到所有頂點對 之間的最短路徑A
判圈算法 - 對於有向圖和無向圖 (基於 DFS 和不相交集的版本)A
普林演算法 - 尋找加權無向圖的最小生成樹 (MST)A
拓撲排序 - DFS 方法A
關節點 - Tarjan 算法 (基於 DFS)A
橋 - 基於 DFS 的算法A
歐拉回徑與一筆畫問題 - Fleury 的算法 - 一次訪問每個邊A
哈密頓圖 - 恰好訪問每個頂點一次A
強連通分量 - Kosaraju 算法A
旅行推銷員問題 - 儘可能以最短的路線訪問每個城市並返回原始城市
算法範式
算法範式是一種通用方法,基於一類算法的設計。這是比算法更高的抽象,就像算法是比計算機程序更高的抽象。
- BF 算法 - 查找/搜索 所有可能性並選擇最佳解決方案
B
線性搜索B
雨水收集 - 誘導雨水問題B
遞歸樓梯 - 計算有共有多少種方法可以到達頂層 (4 種解題方案)A
最大子數列A
旅行推銷員問題 - 儘可能以最短的路線訪問每個城市並返回原始城市A
離散傅里葉變換 - 把時間信號解析成構成它的頻率
- 貪心法 - 在當前選擇最佳選項,不考慮以後情況
B
跳躍遊戲A
揹包問題A
戴克斯特拉算法 - 找到所有圖頂點的最短路徑A
普里姆算法 - 尋找加權無向圖的最小生成樹 (MST)A
克魯斯卡爾算法 - 尋找加權無向圖的最小生成樹 (MST)
- 分治法 - 將問題分成較小的部分,然後解決這些部分
B
二分查找B
漢諾塔B
楊輝三角形B
歐幾里得算法 - 計算最大公約數 (GCD)B
歸併排序B
快速排序B
樹深度優先搜索 (DFS)B
圖深度優先搜索 (DFS)B
跳躍遊戲B
快速算次方A
排列 (有/無重複)A
組合 (有/無重複)
- 動態編程 - 使用以前找到的子解決方案構建解決方案
B
斐波那契數B
跳躍遊戲B
獨特路徑B
雨水收集 - 疏導雨水問題B
遞歸樓梯 - 計算有共有多少種方法可以到達頂層 (4 種解題方案)A
萊溫斯坦距離 - 兩個序列之間的最小編輯距離A
最長公共子序列 (LCS)A
最長公共子串A
最長遞增子序列A
最短公共子序列A
0-1 揹包問題A
整數拆分A
最大子數列A
貝爾曼-福特算法 - 找到所有圖頂點的最短路徑A
弗洛伊德算法 - 找到所有頂點對之間的最短路徑A
正則表達式匹配
- 回溯法 - 類似於 BF 算法 試圖產生所有可能的解決方案,但每次生成解決方案測試如果它滿足所有條件,那麼只有繼續生成後續解決方案。否則回溯並繼續尋找不同路徑的解決方案。
B
跳躍遊戲B
獨特路徑A
冪集 - 該集合的所有子集A
哈密頓圖 - 恰好訪問每個頂點一次A
八皇后問題A
騎士巡邏A
組合求和 - 從規定的總和中找出所有的組合
- Branch & Bound - 記住在回溯搜索的每個階段找到的成本最低的解決方案,並使用到目前爲止找到的成本最小值作爲下限。以便丟棄成本大於最小值的解決方案。通常,使用 BFS 遍歷以及狀態空間樹的 DFS 遍歷。
有用的信息
大 O 符號
大 O 符號中指定的算法的增長順序。
以下是一些最常用的 大 O 標記法 列表以及它們與不同大小輸入數據的性能比較。
大 O 標記法 | 計算 10 個元素 | 計算 100 個元素 | 計算 1000 個元素 |
---|---|---|---|
O(1) | 1 | 1 | 1 |
O(log N) | 3 | 6 | 9 |
O(N) | 10 | 100 | 1000 |
O(N log N) | 30 | 600 | 9000 |
O(N^2) | 100 | 10000 | 1000000 |
O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
數據結構操作的複雜性
數據結構 | 連接 | 查找 | 插入 | 刪除 | 備註 |
---|---|---|---|---|---|
數組 | 1 | n | n | n | |
棧 | n | n | 1 | 1 | |
隊列 | n | n | 1 | 1 | |
鏈表 | n | n | 1 | 1 | |
哈希表 | - | n | n | n | 在完全哈希函數情況下,複雜度是 O(1) |
二分查找樹 | n | n | n | n | 在平衡樹情況下,複雜度是 O(log(n)) |
B 樹 | log(n) | log(n) | log(n) | log(n) | |
紅黑樹 | log(n) | log(n) | log(n) | log(n) | |
AVL 樹 | log(n) | log(n) | log(n) | log(n) | |
布隆過濾器 | - | 1 | 1 | - | 存在一定概率的判斷錯誤(誤判成存在) |