减少二项式堆中的键的“算法简介”一书提供的接口是: BINOMIAL-HEAP-DECREASE-KEY(H,x,k),其中H是指向树的第一个根的指针,x是节点的“索引”,其密钥将减少到k。时间复杂度为O(logn)
但是,我们通常使用链表来实现二项式堆,其中没有执行搜索就无法直接访问x,而搜索通常是O(n)。
解决此问题的一种方法是为二进制堆中的每个节点保留一个指针,然后直接访问O(1)中的每个节点,但空间复杂度为O(n)。
有人知道更好的解决方案吗?谢谢!
可以找到之前的讨论here。
答案 0 :(得分:-1)
如果我们将堆存储在数组中,我们可以很容易地做到这一点。
如果根元素位于索引i,则左子节点位于2i,右子节点位于2i + 1。
在数组中,我们存储索引1中的元素。
如果我们存储像这样的堆元素,我们可以直接递减索引x处的元素并从x堆积。
这种方式对于heapify我们需要o(logn)时间。对于递减,它是恒定的。