算法與數據結構基礎 - 堆(Heap)和優先級隊列(Priority Queue)

堆基礎css

堆(Heap)是具備這樣性質的數據結構:1/徹底二叉樹 2/全部節點的值大於等於(或小於等於)子節點的值:html

圖片來源:這裏git

堆能夠用數組存儲,插入、刪除會觸發節點shift_down、shift_up操做,時間複雜度O(logn),可視化構建堆github

堆是優先級隊列(Priority queue)的底層數據結構,較常使用優先級隊列而非直接使用堆處理問題。利用堆的性質能夠方便地獲取極值,例如 LeetCode 題目 215. Kth Largest Element in an Array,時間複雜度O(nlogn):算法

    //215. Kth Largest Element in an Array
    int findKthLargest(vector<int>& nums, int k) {
//默認爲大頂堆,等同於 priority_queue<int,vector<int>,less<int>> q; priority_queue
<int> q(nums.begin(),nums.end()); for(int i=0;i<k-1;i++) q.pop(); return q.top(); }

 

相關LeetCode題:數組

703. Kth Largest Element in a Stream  題解數據結構

295. Find Median from Data Stream  題解app

 

將頂部節點一一取出,便可實現堆排序,例如經典的題目 23. Merge k Sorted Lists,用優先級隊列求解時間複雜度爲O(nlogk),n爲總元素數、k爲list數,可視化堆排序
less

 

相關LeetCode題:spa

23. Merge k Sorted Lists  題解

 

自定義優先級

對於優先級隊列,咱們能夠自定義優先級判斷標準,好比按元素頻次、距離、成本等。這時咱們須要自定義優先級隊列的比較方式:

    struct compare{
        bool operator()(const pair<char,int> a,const pair<char,int> b){
            return b.second > a.second;
        }  
    };
    //priority_queue<Type, Container, Functional>
    priority_queue<pair<char,int>,vector<pair<char,int>>,compare> pq;

 

相關LeetCode題:

451. Sort Characters By Frequency  題解

347. Top K Frequent Elements  題解

692. Top K Frequent Words  題解

973. K Closest Points to Origin  題解

767. Reorganize String  題解 

 

優先級隊列與貪心

由優先級隊列可方便地取得極值,而極值自己體現了貪心(Greedy)的思想;在用到貪心思路解題時,能夠考慮藉助優先級隊列獲取極值。

 

相關LeetCode題:

1046. Last Stone Weight  題解

253. Meeting Rooms II  題解

871. Minimum Number of Refueling Stops  題解

502. IPO  題解

 

優先級隊列與BFS

算法與數據結構基礎 - 隊列(Queue) 介紹了經常使用隊列模擬廣度優先搜索(BFS)過程,優先級隊列做爲特殊的隊列,一樣能夠用於BFS、以實現對臨近節點按優先級搜索。

 

相關LeetCode題:

778. Swim in Rising Water  題解

相關文章
相關標籤/搜索