首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将minheap.top移动到maxheap.top,其中maxheap.top <= minheap.top

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

Stack Overflow用户
提问于 2012-07-06 19:20:26
回答 3查看 196关注 0票数 0

我有一个max堆和min堆,其中max堆的最大元素小于或等于min堆的最小元素。

现在,我希望将min堆的最小元素移动为max堆的最大元素。

要做到这一点,一种方法是弹出min堆的顶部元素并将其推到max堆上。

有没有更有效的方法来做到这一点?

,这是我最后做的

实际上,我必须在min堆中插入一个元素,然后执行上面描述的操作,我执行了以下操作:

代码语言:javascript
复制
// 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];

由于父母被降职为孩子,这是对已经付费的比较的浪费,但我认为这是不可避免的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-07 22:09:13

当您知道要插入的元素比min/max更小/更大时,您真正需要的是一种插入优先级队列的有效方法,这取决于这个元素是最小堆还是最大堆。对于传统的“堆”数据结构,这需要O(log )时间。

但是,如果您愿意对优先级队列使用与传统的“堆”数据结构不同的表示形式,那么这样的插入就可以在O(1)时间内运行。许多不同类型的优先级队列都可以做到这一点,例如左堆、倾斜堆或配对堆。

编辑:当然,您仍然需要支付从原始优先级队列中移除的成本,这很可能是O(log ),尽管有一些方法也可能对此有所帮助,例如“延迟删除”。

票数 2
EN

Stack Overflow用户

发布于 2012-07-06 23:05:48

你最好用一个最小的堆或者踏板来服务。minimums堆看起来是为你正在做的事情量身定做的,但是踏步是如此的全面,以至于它们也可能运行得很好--尤其是当你需要的不仅仅是查找最小值、最大值和附加值的时候。

heap

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

票数 0
EN

Stack Overflow用户

发布于 2012-07-06 19:25:24

使用max堆,它是一个双端优先级队列,您可以在o(lgn)中完成这个任务,不能在小于O(lgn)的情况下执行。

但是您可以使用它们在o(1)中插入的摊销算法,比如fibonacci堆,

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11368437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档