带有减少键和增加键操作的优先级队列


11

一个Fibonnaci堆支持以下操作:

  • insert(key, data) :向数据结构添加一个新元素
  • find-min() :使用最小键返回指向元素的指针
  • delete-min() :用最小键删除元素
  • delete(node) :删除由指向的元素 node
  • decrease-key(node) :减少由指向的元素的键 node

所有非删除操作均为(摊销)时间,删除操作为O log n 摊销时间。O(1)O(logn)

是否有increase-key(node)(摊销)时间内也支持的优先级队列的任何实现?O(1)


@Raphael如果您增加最小元素的键,使其现在成为最大键,那么(至少对我而言)并不是必须立即进行超恒定量的重新平衡。
2012年

Answers:


10

O(1) find-minincrease-keyinsertO(n)

vector<T>
fast_sort(const vector<T> & in) {
  vector<T> ans;
  pq<T> out;
  for (auto x : in) {
    out.insert(x);
  }
  for(auto x : in) {
    ans.push_back(*out.find_min());
    out.increase_key(out.find_min(), infinity);
  }
  return ans;
}

1
我以为(de|in)crease-key只做正负号。
拉斐尔

是否有DS允许在恒定时间内进行增键操作但对数减少(或更多)的DS?(对于最小堆)
Gonzalo Solera,

2
@GonzaloSolera:这个答案中的不可能证明并不关心减号;O(1)find-min,increment-key和insert在一起已经是一个问题(证明对插入的依赖并不是真正必要; O(n)heapify足够了,或者我们可以在多个对象上重用同一个堆)排序,以证明它违反了比较排序范围,无论使用heapify或insert的代价如何。
user2357112支持Monica

好的,对不起,我错过了阅读。谢谢你的评论!
贡萨洛·索莱拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.