- 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
- 最短路徑:Dijkstra、Bellman-Ford
-
-
- 適用於
-
-
- 涉及大數據問題;社交網絡;地圖查找路徑,最短路徑
-
-
- 練習
-
-
- LC785:給定一個無向圖 graph,當這個圖爲二部圖時 返回 true
-
-
-
-
- 二部圖:如果能將一個圖的節點集合分割成兩個獨立的子集 A 和 B,並使圖中的每一條邊的兩個節點一個來自 A 集合,一個來自 B 集合,成爲二部圖
- 即:圖裏所有的邊,一頭連着 A 集合的頂點,一頭連着 B 集合的頂點
-
-
- 3. 前綴樹 Trie
-
- 適用於
-
-
- 字典查找,也被成爲 字典樹
- 網站上的搜索框,會羅列出以搜索文字作爲開頭的相關搜索信息
- 漢字拼音輸入法的聯想輸出功能
-
-
- 練習
-
-
- LC212:給定一個二維網格和一個字典中的單詞列表,找出所有同時在二維網格和字典中出現的單詞
-
- 4. 線段樹 Segment Tree【沒看懂】
-
- 定義
-
-
- 一種按照二叉樹的形式存儲數據的結構,每個節點保持的都是數組裏某一段的總和
- 例:數組是 [1,3,5,7,9,11],那麼它的線段樹如下
-
-
-
- 葉子節點爲每個元素的數值,根節點是兩個子節點的和
-
-
- 適用於
-
-
- 數據很多,且需要頻繁 更新 並 求和 的操作
- 假設有一個數組 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:求一個動態變化的二維矩陣裏,任意子矩陣裏的數的總和
-