【演算法學習】STL庫 大小根堆的用法
1.知識點:
①https://www.cnblogs.com/WindSun/p/11444446.html
②https://blog.csdn.net/fnzsjt/article/details/40118365
2.運用:
①https://blog.csdn.net/u013317445/article/details/89680330?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control
②https://xiaoneng.blog.csdn.net/article/details/103206628?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
3.例子:
①思路:
先用一個最小堆存message的優先順序,再定義一個map容器存message和優先順序。當讀取到GET時,取出最小堆頂,然後在map中輸出這個堆頂為關鍵字的value即message
②程式碼:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
map<int,string> Messages;//用來儲存message和優先順序
int main()
{
vector<int> min;//最小堆底層容器
int t;
string flag;
cin>>t;
while(t--){
cin>>flag;
if(flag=="PUT"){
string message;
int rank;
cin>>message>>rank;
min.push_back(rank);//在vector的末尾插入元素rank
Messages[rank]=message;
push_heap(min.begin(),min.end(), greater<int>());//push_head函式先是讓end迭代器+1(因為vector多了一個元素),然後執行sifedown通過下溯維護最小堆
}
if(flag=="GET"){
if(min.size()==0)
{
cout<<"EMPTY QUEUE!"<<endl;
}
else{
int number=min[0];
pop_heap(min.begin(),min.end(), greater<int>());//pop_heap把堆頂元素取出來,放到了ector容器的末尾,用原來的末尾元素去替代,然後end迭代器減1,執行siftdown()下溯函式來重新調整堆,此時不會算上末尾的那個元素,因為end減一了
min.pop_back();//這在底層vector資料容器中刪除最後一個元素,即上一步提出來的首元素
cout<<Messages[number]<<endl;
}
}
}
return 0;
}
相關文章
- 大根堆和小根堆的介紹
- STL學習
- C++ 學習筆記之——STL 庫 queueC++筆記
- C++STL學習第一篇(什麼是STL以及string的各種功能用法)C++
- 堆的學習
- stl中map的基本用法
- C++學習筆記 — STL標準模板庫C++筆記
- 大根堆
- STL:vector用法總結
- STL:list用法總結
- STL:set用法總結
- STL:map用法總結
- STL map 詳細用法
- STL 優先佇列 用法佇列
- 跟我學C++中級篇——STL的學習C++
- java使用PriorityQueue即優先佇列實現大根堆和小根堆Java佇列
- C++STL之Vector向量詳解,用法和例子 一起學習 一起加油C++
- C++STL第二篇(vector的原理用法)C++
- PHP 程式設計師的堆學習PHP程式設計師
- 堆溢位學習筆記筆記
- 機器學習沒有捷徑,根據機器學習演算法地圖學習是最有效的一種方式!機器學習演算法地圖
- 原根學習筆記筆記
- std::function用法學習Function
- 大根堆和堆排序的原理與實現排序
- 如何獲取 PostgreSQL 資料庫中的表大小、資料庫大小、索引大小、模式大小、表空間大小、列大小SQL資料庫索引模式
- STL 容器用法簡要整理(未完成)
- C++ 學習筆記(1):STL、Vector 與 SetC++筆記
- 智慧指標用法學習指標
- 監聽視窗大小改變,同時根據視窗大小修改某個元素的大小
- *衡樹 Treap(樹堆) 學習筆記筆記
- ACM學習筆記:二叉堆ACM筆記
- 機器學習中的世代、迭代和批大小機器學習
- 清華開源遷移學習演算法庫遷移學習演算法
- 學習 python logging(1): 基本用法Python
- C++ any_of用法學習C++
- 根據openGauss/MogDB的lwtid檢視執行緒堆疊執行緒
- JS學習筆記之call、apply的用法JS筆記APP
- 演算法系列--堆演算法