• 常数较二叉堆小。
  • 采用 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)相关推荐

  1. python实现栈,实现push(),pop(),top(),getMin()方法

    设计一个栈,该栈可以进行push.pop.top和在常数时间内检索最小值的操作 push(x) – 压一个数到栈顶 pop() – 移除栈顶的元素,不返回任何对象 top() – 返回栈顶端的元素 g ...

  2. 【最小栈c++】设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...

  3. [WPS笔试题]实现栈的push,pop,max且时间复杂度为O(1)

    今天做了一下WPS的笔试题,遇到了一道关于栈的题,觉得挺有意思的,就写篇博客分享一下吧~~ 题目要求:要求实现栈的数据结构,在该类型中实现一个能够得到栈的最大元素的max函数,在该栈中,调用max,p ...

  4. js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip

    js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会 ...

  5. 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值

    实现栈的push pop 操作,并可以输出栈的最小值 // SatckMin.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include ...

  6. arm push/pop/b/bl汇编指令

    目录 1. push指令 2. pop指令 3. b指令 4. bl指令 5. bx指令 1. push指令 功能描述:入栈 armv7 芯片手册: Push Multiple Registers s ...

  7. js中对数组的增删方法:push(),pop(),unshift(),shift(),splice()的用法小结

    1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及内容. 不同的是 push().pop() 是从数组的尾部进行增减,unshift ...

  8. 配对堆Pairing Heap

    前言 最近做一道Dijkstra的题目,因为边数实在太大了(10910910^9),用STL的priority_queue直接超时(事实上还会MLE).有同学写配对堆的.刚好很久没学习新的数据结构了, ...

  9. c语言isempty函数代码,使用C语言实现链栈以及initialize,push,pop,isEmpty,getlength,destory等操作...

    本文使用了链栈,相对于顺序栈,链栈具有通常情况下不会出现栈满的情况 链栈和链表很相似. 由于栈的先进后出特性,栈在很多地方都很适用,比如 括号匹配,算术表达式求职,路径判断(走迷宫游戏)高级点的有函数 ...

最新文章

  1. 排序算法四:归并排序
  2. php获取excel时间,详细介绍PHPExcel读取Excel时间的示例代码
  3. 简单的写一个发布订阅器
  4. Imation亏损额急剧增长 CEO仍表示“成功”
  5. Python pip使用国内镜像
  6. 南方h5手簿求转换参数_工程之星、 gps操作、RTK求转换参数操作步骤
  7. iOS-最全的App上架教程
  8. 华三刀片服务器如何安装系统,刀片服务器及其操作系统的安装方法及系统专利_专利查询 - 天眼查...
  9. 1 MySQL 主从同步
  10. 世界国家中英文名称以及地区区号json格式
  11. Python 数学建模算法与应用(持续更新)
  12. 在线自习室——新型的学习利器
  13. Matlab代码区出现中文乱码的情况
  14. 常见元素 – img元素
  15. android系统时间获取方式
  16. NBMA(mgre)实验HCIP
  17. Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk
  18. 取消endnotes参考文献格式域的步骤_EndNote参考文献格式的更改(转载)
  19. SQL中的连接(左、右、内连接)
  20. java获取文件夹下所有的文件

热门文章

  1. 【转】解决wine中文乱码的问题
  2. 使用Firebug或chrome-devToolBar深入学习javascript语言核心
  3. Shell与ShellScript
  4. mysql根据时间戳查询指定日期内数据
  5. ActiveX 控件导入程序
  6. Linux下mysqldump的使用
  7. 解决packet tracer不能复制CLI内容的问题
  8. zentao这php,ZenTaoPHP后面计划
  9. 【Python-ML】神经网络激励函数-Softmax
  10. Hadoop文件压缩格式分析和比较