如何在Fibonacci堆上的reduce-key操作中获得O(1)摊销的复杂性?只需在Fibonacci堆中找到包含该元素的节点,就需要使用BFS花费O(n)时间,这样就无法获得O(1)摊销时间。
作为参考,这是我用BFS搜索相关节点的实现:
public fHeapNode search(int x){
Stack<fHeapNode> stack = new Stack<fHeapNode>();
stack.push(minNode);
//Breath first searching
while (!stack.empty()) {
fHeapNode curr = stack.pop();
if(curr.data==x) {return curr;}
else{
if (curr.child != null) {
stack.push(curr.child);
}
fHeapNode start = curr;
curr = curr.right;
while (curr != start) {
if (curr.child != null) {
stack.push(curr.child);
}
if(curr.data==x) {return curr;}
curr = curr.right;
}
}
}
return null;
}
这是我的减少密钥的代码:
public void decreaseKey(fHeapNode x, double k)
{
if (k > x.key) {
//throw new IllegalArgumentException("entered value is wrong");
}
x.key = k;
fHeapNode tempParent = x.parent;
if ((tempParent != null) && (x.key < tempParent.key)) {
cut(x,tempParent);
cascadingCut(tempParent);
}
if (x.key < minNode.key) {
minNode = x;
}
}
答案 0 :(得分:0)
通常,在实现Fibonacci堆时,enqueue的实现将返回指向新插入节点的指针。这样,您可以存储指针供以后使用。如果你没有指针,你必须花费O(n)时间搜索节点,这是完全正确的。
例如,这里是my own personal implementation of a Fibonacci heap。这里给出enqueue
方法:
public Entry<T> enqueue(T value, double priority) {
// ...
}
注意它如何返回表示该节点的Entry<T>
。 decreaseKey
的相应实现具有以下接口:
public void decreaseKey(Entry<T> entry, double newPriority) {
// ...
}
这里,参数是Entry<T>
对应于保存其键应该减少的元素的节点。如果没有Entry<T>
返回的enqueue
,则无法调用此方法,否则将无法有效实施。
希望这有帮助!