數據結構與算法 - 02高級數據結構

  • 1. 優先隊列 Priority Queue
    • 特點
      • 保證每次取出的元素都是隊列中優先級別最高的
      • 優先級別可以自定義。如:數值越大/小,優先級越高
    • 適用於
      • 從一堆雜亂無章的數據當中按照一定的順序,逐步篩選出部分乃至全部數據
      • K 問題
    • 練習
      • 任意一個數組,找出前 K 大的數
    • 實現
      • 本質:是一個二叉堆結構(數組)
      • 二叉堆:利用一個數組結構來實現完全二叉樹
      • 性質
        • 1. 數組裏的第一個元素 array[0] 擁有最高的優先級別
        • 2. 給定一個下標 i,那麼對於元素 array[i] 而言
          • 它的父節點對應的元素下標是 (i-1)/2
          • 它的左孩子對應的元素下標是 2xi + 1
          • 它的右孩子對應的元素下標是 2xi + 2
        • 3. 數組裏每個元素的優先級別都要高於它兩個孩子的優先級別
    • 基本操作
      • 1. 向上篩選 (sift up / bubble up) - 加入 O(logk)
        • 當有新的數據加入到優先隊列中,新的數據首先被放置在二叉樹的底部
        • 不斷進行向上篩選的操作,即如何發現該數據的優先級別比父節點高,那就和父節點交換,再接着往上進行比較,直到無法 再繼續交換爲止
      • 2. 向下篩選 (sift down / bubble down) - 取出 O(logk)
        • 當堆頂元素被取出時,要更新堆頂的元素作爲下一次按照優先級順序被取出的對象,需要將堆底部的元素放置到堆頂,然後不斷地對它執行向下篩選
        • 將該元素和它的兩個孩子節點對比優先級,如果優先級最高的是其中一個孩子,就將該元素和那個孩子進行交換,然後反覆,直到無法繼續交換爲止
    • 練習
      • LC347:給定一個非空的整數數組,返回其中出現頻率前 k 高的元素
  • 2. Graph
    • 必會知識點
      • 圖的存儲和表達方式:鄰接矩陣 Adjacency Matrix、鄰接鏈表 Adjacency List
      • 圖的遍歷:深度優先、廣度優先
      • 二部圖的檢測 Bipartite、樹的檢測、環的檢測:有向/無向圖
      • 拓撲排序
      • 聯合 - 查找算法 Union-Find
      • 最短路徑:DijkstraBellman-Ford
    • 適用於
      • 涉及大數據問題;社交網絡;地圖查找路徑,最短路徑
    • 練習
      • LC785:給定一個無向圖 graph,當這個圖爲二部圖時 返回 true
        • 二部圖:如果能將一個圖的節點集合分割成兩個獨立的子集 A B,並使圖中的每一條邊的兩個節點一個來自 A 集合,一個來自 B 集合,成爲二部圖
        • 即:圖裏所有的邊,一頭連着 A 集合的頂點,一頭連着 B 集合的頂點
  • 3. 前綴樹 Trie
    • 適用於
      • 字典查找,也被成爲 字典樹
      • 網站上的搜索框,會羅列出以搜索文字作爲開頭的相關搜索信息
      • 漢字拼音輸入法的聯想輸出功能
    • 練習
      • LC212:給定一個二維網格和一個字典中的單詞列表,找出所有同時在二維網格和字典中出現的單詞
  • 4. 線段樹 Segment Tree【沒看懂】
    • 定義
      • 一種按照二叉樹的形式存儲數據的結構,每個節點保持的都是數組裏某一段的總和
      • 例:數組是 [1357911],那麼它的線段樹如下

      • 葉子節點爲每個元素的數值,根節點是兩個子節點的和
    • 適用於
      • 數據很多,且需要頻繁 更新 求和 的操作
      • 假設有一個數組 array[0 ... n-1],裏面有 n 個元素,現在要經常對這個數組做兩件事
        • 1. 更新數組元素的數值
        • 2. 求數組任意一段區間裏元素的總和(或平均值)
    • 練習
      • LC315:給定一個整數數組,按要求返回一個新數組 counts,使得數組 counts 有該性質——counts[i] 的值是 nums[i] 右側小於 nums[i] 的元素的數量
        • 示例
          • 輸入 [5, 2, 6, 1]
          • 輸出 [2, 1, 1, 0]
        • 解釋
          • 5 的右側有 2 個更小的元素(2 1
          • 2 的右側僅有 1 個更小的元素(1
          • 6 的右側有 1 個更小的元素(1
          • 1 的右側有 0 個更小的元素
  • 5. 樹狀數組 Fenwick Tree/Binary Indexed Tree
    • 特點-基本特徵
      • 1. 它是利用數組來表示多叉樹的結構,在這一點上和優先隊列有些類似,只不過,優先隊列是用數組來表示完全二叉樹,而樹狀數組是多叉樹
      • 2. 樹狀數組的第一個元素是空節點
      • 3. 如果節點 tree[y] tree[x] 的父節點,那麼滿足條件 y=x-(x & (-x) )
    • 適用於
      • 數據很多,且需要頻繁 更新 求前 k 總和 的操作
      • 假設有一個數組 array[0 ... n-1],裏面有 n 個元素,現在要經常對這個數組做兩件事
        • 1. 更新數組元素的數值
        • 2. 求數組前 k 個元素的總和(或平均值)
    • 練習
      • LC308:求一個動態變化的二維矩陣裏,任意子矩陣裏的數的總和
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章