【基礎】PriorityQueue

1. 初識PriorityQueue

PriorityQueue 是隊列,隊列就是先進先出, 但PriorityQueue 能做到按優先級出隊列。
PriorityQueue 實現Queue接口,但如何做到按優先級出隊列?
在數據結構上,採用堆,在數據存儲上採用的是數組;

通過在入隊時,就把數據排序好;排序就是用戶自定義優先級。
在出隊時,通過堆這種結構,出隊堆頂元素,並重新維護好堆的數據結構。

2. 應用場景:Top K 元素

  • 小頂堆:求k個最大數
    構建的是指定容量的小頂堆,因此每次queue.peek()返回的是最小的數字,在遍歷數組的過程中,如果遇到比該數字大的元素就將最小的數字poll(移除掉),然後將較大的元素添加到堆中,在添加進去堆中的時候,堆同時會按照優先級比較,將最小的元素再次放到堆頂,這樣的做法就是會一直保持堆中的元素是相對較大的,同時堆頂元素是堆中最小的。
  • 大頂堆:求k個最小數
    直接構建一個大頂堆,這樣元素最大的值在堆頂,每次去和數組的元素的值去做比較,只要堆頂元素比數組的值小,就將堆頂元素poll出來,然後將數組的值添加進去,這樣就可以一直保持集合數組中一直是最小的k個數字。

3. 應用場景:TopK 高頻元素

  • 先計算數組中數字出現的頻率,然後維護一個哈希表用來存儲元素的頻率;
  • 然後構建優先級隊列,這裏依舊是構建小頂堆,不過因爲該題是計算元素出現的頻率,因此我們需要將每個元素的頻率值做對比

參考

如何解決TOP-K問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章