算法與數據結構學習彙總

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 符號中指定的算法的增長順序。

來源Big O Cheat Sheet

以下是一些最常用的 大 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 - 存在一定概率的判斷錯誤(誤判成存在)
發佈了251 篇原創文章 · 獲贊 31 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章