当前位置:网站首页>Implementation of priority queue simulation in C + +
Implementation of priority queue simulation in C + +
2021-02-23 18:06:26 【Oh_】
Realize the idea :
(1) The bottom layer of priority queue uses... By default vector Simulation heap implementation , So be right vector Modify the elements in , Make it heap like .
(2) Building the heap —— The requirement of heap is that any node is smaller or larger than its child node . If a node is only smaller or larger than its child node , And its child node does not satisfy the nature of heap , Then the structure has no heap property , So we can start from the bottom and go up , So let the bottom layer have the nature of heap first , Then when we realize the properties of the upper heap, we don't have to consider the properties of the lower heap . Because the leaf node itself has the nature of heap , So start with the last non leaf node to implement the heap structure , If it's implementation , Compare the father node with the child node , If it is less than , The exchange , After a node is adjusted downward , Adjust the next non leaf node , Until the end of the adjustment to the root node .
(3) Pile insertion —— After inserting new elements , Because the original heap has the nature of heap , So adjust the newly inserted element up , If it's a big pile , If it is larger than its parent node , The exchange , Until it reaches the root node , Or smaller than its parent node .
(4) Heap delete —— Heap can only delete the root node , It's mainly to make sense like stacks and queues , The deletion of the heap produces the largest or smallest element . You can exchange the top elements with the bottom elements , Then reduce the size of the heap by one element , And then adjust the top elements down .
(5) Pass in the template type to indicate whether you want to create a heap or a small heap , And what is the underlying structure for . Because the template parameter is a type , So you can use a functor or a function pointer .
template<class T>
class my_less
{
public:
bool operator()(const T& left,const T& right)
{
return left < right;
}
};
template<class T>
class my_greater
{
public:
bool operator()(const T& left, const T& right)
{
return left > right;
}
};
template<class T,class Container=vector<T>,class Com=my_less<T>>
class my_priority_queue
{
private:
Container heap_;
Com com;
void ad_down(size_t pos)
{
size_t parent_pos = pos;
size_t child_pos = parent_pos * 2 + 1;
while (child_pos < heap_.size())
{
if (child_pos+1<heap_.size() && com(heap_[child_pos],heap_[child_pos+1]))
child_pos++;
if (com(heap_[parent_pos], heap_[child_pos]))
{
swap(heap_[parent_pos], heap_[child_pos]);
parent_pos = child_pos;
child_pos = parent_pos * 2 + 1;
}
else
{
return;
}
}
}
public:
my_priority_queue()
{}
template<class Iterator>
my_priority_queue(Iterator begin, Iterator end)
:heap_(begin, end)
{
int pos = (heap_.size() - 2) >> 1;
for (; pos >=0; --pos)
ad_down(pos);
}
void push(const T& data)
{
heap_.push_back(data);
size_t child_pos = heap_.size() - 1;
size_t parent_pos = (child_pos - 1) / 2;
while (child_pos)
{
if (com(heap_[parent_pos], heap_[child_pos]))
{
swap(heap_[parent_pos], heap_[child_pos]);
child_pos = parent_pos;
parent_pos = (child_pos - 1) / 2;
}
else
{
return;
}
}
}
void pop()
{
heap_[0] = heap_.back();
heap_.pop_back();
ad_down(0);
}
const T& top()const
{
return heap_.front();
}
size_t size()
{
return heap_.size();
}
};
版权声明
本文为[Oh_]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/02/20210223180524773Q.html
边栏推荐
- Two solutions and solutions of garbled code on Microsoft edge page of win10 Home Edition gpedit.msc Solutions to the problem that commands cannot be used
- PAT_甲级_1110 Complete Binary Tree
- PAT_ Grade A_ 1110 Complete Binary Tree
- 实际工作中到底如何开展性能测试????
- How to carry out performance test in actual work????
- UNI-APP 记录
- Uni-app record
- PostgreSQL
- PostgreSQL
- 【STM32F407】第5章 RL-USB移植(MDK AC6)
猜你喜欢
-
单机最快MQ—Disruptor
-
PAT_甲级_1111 Online Map
-
[stm32f407] Chapter 5 rl-usb porting (MDK AC6)
-
Single fastest MQ - disruptor
-
PAT_ Grade A_ 1111 Online Map
-
如何避免微服务设计中的耦合问题
-
How to avoid coupling problem in microservice design
-
51信用卡股价年初至今上浮5倍,引入银行背景高管担任行政总裁
-
51 the share price of credit card has risen five times since the beginning of the year, and senior executives with bank background have been introduced as the chief executive
-
prometheus监控之进程监控(process-exporter)
随机推荐
- 华为轮值董事长胡厚崑:技术创新的同时要避免社会发展的分化
- 疫情推动“宅经济”,企业防御DDoS更加不能松懈
- 二分图最小点覆盖构造方案+König定理证明
- Anno&Viper -分布式锁服务端怎么实现
- 解决Win7 X64由于百联控件造成的蓝屏问题 (PassGuard_X64.sys)
- Process exporter of Prometheus monitoring
- 浅谈 Vite 2.0 原理,依赖预编译,插件机制是如何兼容 Rollup 的?
- Hu houkun, Huawei's rotating Chairman: avoid the differentiation of social development while making technological innovation
- The epidemic situation promotes "residential economy", and enterprises' defense against DDoS cannot be relaxed
- Construction scheme of minimum point cover of bipartite graph + proof of K ü nig theorem
- npm install 版本号^的坑
- Activity显示界面背后的故事:一文让你理清View的那些复杂关系
- Android面试官:Window连环十二问你顶得住吗?(快扶我起来,我还能问)
- 开发一个小程序,最好先做好课前工作
- SQL Server中DELETE和TRUNCATE的区别
- Simar 的 参考书
- 【招聘】分布式存储架构师 40K-80K*14薪
- How to implement anno & Viper - distributed lock server
- Solve the blue screen problem of win7 x64 caused by Bailian control (PassGuard)_ X64.sys)
- Talk about the vite 2.0 principle, dependence precompile, how is plug-in mechanism compatible with rollup?
- 哔哩哔哩视频爬取源码分享
- NPM install version number ^
- The story behind the activity display interface: let you clarify the complex relationships of view
- Android Interviewer: can you stand up to the 12 questions of windows? (help me up, I can still ask)
- Develop a small program, it is best to do a good job before class
- The difference between delete and truncate in SQL Server
- SIMAR's reference book
- [recruitment] 40k-80k * 14 salary for distributed storage architect
- Bili Bili video crawling source code sharing
- 面试这么久,第一次投诉,就这样没了……
- 二分图最小点覆盖构造方案+König定理证明
- Anno&Viper -分布式锁服务端怎么实现
- Interview so long, the first complaint, so gone
- Construction scheme of minimum point cover of bipartite graph + proof of K ü nig theorem
- How to implement anno & Viper - distributed lock server
- 混合云组网与管理(Wireguard+OpenVPN+LDAP)
- 如何将福禄克DSX2-5000、8000 CH恢复出厂设置
- Hybrid cloud networking and management (wireguard + OpenVPN + LDAP)
- How to restore the factory settings of fluke dsx2-5000 and 8000 Ch
- 线段树&数链剖分