繁体   English   中英

将minheap.top移动到maxheap.top,其中maxheap.top <= minheap.top

[英]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的功能非常全面,以至于它们也可能很好用-特别是如果您需要的不仅仅是查找最小值和最大值并增加价值。

http://en.wikipedia.org/wiki/Min-max_heap

http://en.wikipedia.org/wiki/Treap

使用min-max堆,它是一个双优先级队列,您可以在o(lgn)中执行此操作,不能在小于O(lgn)中执行此操作

但是您可以使用摊销算法(例如斐波那契堆)插入o(1)中,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM