算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)
堆基礎(chǔ)
堆(Heap)是具有這樣性質(zhì)的數(shù)據(jù)結(jié)構(gòu):1/完全二叉樹(shù) 2/所有節(jié)點(diǎn)的值大于等于(或小于等于)子節(jié)點(diǎn)的值:
圖片來(lái)源:這里
堆可以用數(shù)組存儲(chǔ),插入、刪除會(huì)觸發(fā)節(jié)點(diǎn)shift_down、shift_up操作,時(shí)間復(fù)雜度O(logn),可視化構(gòu)建堆
堆是優(yōu)先級(jí)隊(duì)列(Priority queue)的底層數(shù)據(jù)結(jié)構(gòu),較常使用優(yōu)先級(jí)隊(duì)列而非直接使用堆處理問(wèn)題。利用堆的性質(zhì)可以方便地獲取極值,例如 LeetCode 題目?215.?Kth Largest Element in an Array,時(shí)間復(fù)雜度O(nlogn):
//215. Kth Largest Element in an Arrayint findKthLargest(vector<int>& nums, int k) {//默認(rèn)為大頂堆,等同于 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();}
?
相關(guān)LeetCode題:
215.?Kth Largest Element in an Array? 題解703.?Kth Largest Element in a Stream? 題解
295.?Find Median from Data Stream? 題解
?
將頂部節(jié)點(diǎn)一一取出,即可實(shí)現(xiàn)堆排序,例如經(jīng)典的題目?23.?Merge k Sorted Lists,用優(yōu)先級(jí)隊(duì)列求解時(shí)間復(fù)雜度為O(nlogk),n為總元素?cái)?shù)、k為list數(shù),可視化堆排序
?
相關(guān)LeetCode題:
23.?Merge k Sorted Lists??題解
自定義優(yōu)先級(jí)
對(duì)于優(yōu)先級(jí)隊(duì)列,我們可以自定義優(yōu)先級(jí)判斷標(biāo)準(zhǔn),比如按元素頻次、距離、成本等。這時(shí)我們需要自定義優(yōu)先級(jí)隊(duì)列的比較方式:
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;?
相關(guān)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??題解?
?
優(yōu)先級(jí)隊(duì)列與貪心
由優(yōu)先級(jí)隊(duì)列可方便地取得極值,而極值本身體現(xiàn)了貪心(Greedy)的思想;在用到貪心思路解題時(shí),可以考慮借助優(yōu)先級(jí)隊(duì)列獲取極值。
?
相關(guān)LeetCode題:
1046.?Last Stone Weight??題解
253.?Meeting Rooms II? 題解
871.?Minimum Number of Refueling Stops? 題解
502.?IPO? 題解
358.?Rearrange String k Distance Apart? 題解?
優(yōu)先級(jí)隊(duì)列與BFS
在 算法與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ) - 隊(duì)列(Queue) 介紹了常用隊(duì)列模擬廣度優(yōu)先搜索(BFS)過(guò)程,優(yōu)先級(jí)隊(duì)列作為特殊的隊(duì)列,同樣可以用于BFS、以實(shí)現(xiàn)對(duì)臨近節(jié)點(diǎn)按優(yōu)先級(jí)搜索。
?
相關(guān)LeetCode題:
778.?Swim in Rising Water? 題解
407.?Trapping Rain Water II? 題解?
轉(zhuǎn)載于:https://www.cnblogs.com/bangerlee/p/11205539.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python之pyqt5-第一个pyqt
- 下一篇: sed命令学习