二项式堆递减键“算法介绍”一书提供的界面是:
双线性HeAP-E-KEY KEY(H,X,K),其中H是指向树的第一根的指针,X是节点的“索引”,其密钥将被减少到k,时间复杂度为O(Logn)。
然而,我们通常使用链表来实现二项式堆,在这里不执行搜索就不能直接访问x,通常是o(n)。
解决这一问题的一种方法是在二项式堆中保持每个节点的指针,然后对O(1)中的每个节点进行直接访问,但是空间复杂度为O(n)。
有谁知道更好的解决办法吗谢谢!
前面的讨论可以找到here。
最佳答案
如果我们将堆存储在一个数组中,我们可以很容易地做到这一点。
如果根元素在索引i处,则左子元素在2i处,右子元素在2i+1处。
在数组中,我们存储索引1中的元素。
如果我们像这样存储堆元素,我们可以直接在索引x处减少元素并从x处heapify。
为了健康,我们用O(对数)时间。因为递减是恒定的。
关于algorithm - 如何使二项式堆中的减少键以对数时间运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19946857/