如何在对数时间内使二项式堆中的reduce-key运行

时间:2013-11-13 06:25:47

标签: algorithm priority-queue binomial-heap decrease-key

减少二项式堆中的键的“算法简介”一书提供的接口是: BINOMIAL-HEAP-DECREASE-KEY(H,x,k),其中H是指向树的第一个根的指针,x是节点的“索引”,其密钥将减少到k。时间复杂度为O(logn)

但是,我们通常使用链表来实现二项式堆,其中没有执行搜索就无法直接访问x,而搜索通常是O(n)。

解决此问题的一种方法是为二进制堆中的每个节点保留一个指针,然后直接访问O(1)中的每个节点,但空间复杂度为O(n)。

有人知道更好的解决方案吗?谢谢!

可以找到之前的讨论here

1 个答案:

答案 0 :(得分:-1)

如果我们将堆存储在数组中,我们可以很容易地做到这一点。

如果根元素位于索引i,则左子节点位于2i,右子节点位于2i + 1。

在数组中,我们存储索引1中的元素。

如果我们存储像这样的堆元素,我们可以直接递减索引x处的元素并从x堆积。

这种方式对于heapify我们需要o(logn)时间。对于递减,它是恒定的。