可并堆-STL-pbds详解

本文介绍了可并堆这一高效数据结构,用于在保持堆顶极值的同时,能在logn时间内合并两个堆。相比于传统的nlogn出堆和入堆方法,可并堆通过左偏树和NPL(Null Path Length)优化了交换效率。C++的STL库提供了对可并堆的封装,简化了实现过程。
摘要由CSDN通过智能技术生成

对于堆的合并,我们首先想到的是朴素的nlogn出堆之后nlogn入堆。实质上,有一种更为高效的数据结构——可并堆。即为在保证堆顶极值的前提下实现logn的时间合并两个堆。


与普通堆相比,左偏树的每个结点多了一个距离值NPL(Null Path Length)即该结点一直向右儿子走,到达空结点的距离。基于NPL,我们便可以发现,交换变得有序了:在保证了左儿子NPL大于右儿子NPL的时候,效率有所提升。
首先,如果左子树为空,那么把左右交换必然不会使右子树变高,所以效率提高。
第二,如果左子树的NPL比较小,那么交换后必然使右子树的高度变小,所以效率提高。
其他方面大体和堆相同。
然而这并不是我要说的主题,万能的C++给了我们神奇的STL,什么可并堆统统都给你封装好了吗~
实现代码如下

#include<cstdio> 
#include<algorithm> 
#include<ext/pb_ds/assoc_container.hpp> 
#include<ext/pb_ds/priority_queue.hpp> 
//pb_ds库中的优先队列,支持合并
#define LOL int, less<int>,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值