手打配对堆模板(支持push, pop, top, join)
- 常数较二叉堆小。
- 采用 new、delete 分配内存,不喜勿喷。
- 支持任意类型(需定义 operator< 或传入比较器)(需要默认构造函数)
如有错请指正!谢谢!
template<typename T, typename Comp = less<T>>
class pairing_heap
{public:typedef Comp comparer;pairing_heap() : _r(nullptr) { }~pairing_heap() { while(!empty()) pop(); }void push(T o){_Node *n = new _Node;n->v = o, n->son = n->sib = nullptr;_r = _merge(_r, n);}T top(){return _r ? _r->v : T();}void pop(){_Node *nr = _multi_merge(_r->son);if(_r) delete _r;_r = nr;}bool empty(){return !_r;}void join(pairing_heap<T, Comp> &p){_r = _merge(_r, p._r);p._r = nullptr;}private:struct _Node{T v;_Node *son, *sib;} *_r;comparer _C;_Node *_merge(_Node *a1, _Node *a2){if(!a1 || !a2) return a1 ? a1 : a2;if(_C(a1->v, a2->v)) swap(a1, a2);_Node *s = a1->son;if(!s) a1->son = a2;else{a2->sib = s->sib;s->sib = a2;}return a1;}_Node *_multi_merge(_Node *a){_Node *b, *c;if(!a) return nullptr;if(!a->sib) return a;b = a->sib, a->sib = nullptr;if(!b->sib) return _merge(a, b);c = b->sib, b->sib = nullptr;return _merge(_merge(a, b), _multi_merge(c));}
};
转载于:https://www.cnblogs.com/js2xxx/p/9437465.html
手打配对堆模板(支持push, pop, top, join)相关推荐
- python实现栈,实现push(),pop(),top(),getMin()方法
设计一个栈,该栈可以进行push.pop.top和在常数时间内检索最小值的操作 push(x) – 压一个数到栈顶 pop() – 移除栈顶的元素,不返回任何对象 top() – 返回栈顶端的元素 g ...
- 【最小栈c++】设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- [WPS笔试题]实现栈的push,pop,max且时间复杂度为O(1)
今天做了一下WPS的笔试题,遇到了一道关于栈的题,觉得挺有意思的,就写篇博客分享一下吧~~ 题目要求:要求实现栈的数据结构,在该类型中实现一个能够得到栈的最大元素的max函数,在该栈中,调用max,p ...
- js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip
js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会 ...
- 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值
实现栈的push pop 操作,并可以输出栈的最小值 // SatckMin.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include ...
- arm push/pop/b/bl汇编指令
目录 1. push指令 2. pop指令 3. b指令 4. bl指令 5. bx指令 1. push指令 功能描述:入栈 armv7 芯片手册: Push Multiple Registers s ...
- js中对数组的增删方法:push(),pop(),unshift(),shift(),splice()的用法小结
1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及内容. 不同的是 push().pop() 是从数组的尾部进行增减,unshift ...
- 配对堆Pairing Heap
前言 最近做一道Dijkstra的题目,因为边数实在太大了(10910910^9),用STL的priority_queue直接超时(事实上还会MLE).有同学写配对堆的.刚好很久没学习新的数据结构了, ...
- c语言isempty函数代码,使用C语言实现链栈以及initialize,push,pop,isEmpty,getlength,destory等操作...
本文使用了链栈,相对于顺序栈,链栈具有通常情况下不会出现栈满的情况 链栈和链表很相似. 由于栈的先进后出特性,栈在很多地方都很适用,比如 括号匹配,算术表达式求职,路径判断(走迷宫游戏)高级点的有函数 ...
最新文章
- 排序算法四:归并排序
- php获取excel时间,详细介绍PHPExcel读取Excel时间的示例代码
- 简单的写一个发布订阅器
- Imation亏损额急剧增长 CEO仍表示“成功”
- Python pip使用国内镜像
- 南方h5手簿求转换参数_工程之星、 gps操作、RTK求转换参数操作步骤
- iOS-最全的App上架教程
- 华三刀片服务器如何安装系统,刀片服务器及其操作系统的安装方法及系统专利_专利查询 - 天眼查...
- 1 MySQL 主从同步
- 世界国家中英文名称以及地区区号json格式
- Python 数学建模算法与应用(持续更新)
- 在线自习室——新型的学习利器
- Matlab代码区出现中文乱码的情况
- 常见元素 – img元素
- android系统时间获取方式
- NBMA(mgre)实验HCIP
- Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk
- 取消endnotes参考文献格式域的步骤_EndNote参考文献格式的更改(转载)
- SQL中的连接(左、右、内连接)
- java获取文件夹下所有的文件