[英]Moving minheap.top to maxheap.top where maxheap.top <= minheap.top
我有一个maxheap和一个minheap,其中maxheap的最大元素小于或等于minheap的最小元素。
现在,我想将minheap的最小元素移动为maxheap的最大元素。
一种方法是弹出minheap的顶部元素,然后将其推到maxheap上。
有没有更有效的方法可以做到这一点?
这就是我最终要做的事情 :
实际上,我必须将元素插入minheap,然后执行上述操作,我做了以下工作:
// place value to insert at end of minheap
mintoph[mintoph_size] = R;
// use std::pop_heap, minimum element now at end
pop_heap(mintoph.begin(), mintoph.begin() + mintoph_size + 1, greater<int>());
// (*) make room in maxheap at top
for (int pos = maxboth_size++; pos > 0;)
{
int parent = (pos - 1) / 2;
maxboth[pos] = maxboth[parent];
pos = parent;
}
// move element from back of minheap to maxheap head
maxboth[0] = mintoph[mintoph_size];
上面的步骤(*)
浪费了已经付费的比较,因为父母被降级为孩子,但是我认为这是不可避免的。
当您知道要插入的元素小于/大于最小/最大(取决于这是最小堆还是最大堆)时,真正需要的是一种插入优先级队列的有效方法。 对于传统的“堆”数据结构,这需要O(log n)时间。
但是,如果您愿意为优先级队列使用与传统的“堆”数据结构不同的表示形式,那么可以轻松地使这种插入在O(1)时间中运行。 许多不同种类的优先级队列都可以执行此操作,例如左派堆,倾斜堆或配对堆。
编辑:当然,您仍然需要支付从原始优先级队列中删除的费用,尽管有一些方法也可以帮您解决,例如“惰性删除”,但从原始优先级队列中删除的费用仍然是O(log n)。 。
最好使用min-max-heap或treap来最好地为您服务。 min-max-heap似乎是针对您的工作量身定制的,但是treap的功能非常全面,以至于它们也可能很好用-特别是如果您需要的不仅仅是查找最小值和最大值并增加价值。
使用min-max堆,它是一个双优先级队列,您可以在o(lgn)中执行此操作,不能在小于O(lgn)中执行此操作
但是您可以使用摊销算法(例如斐波那契堆)插入o(1)中,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.