1
如何在Fibonacci堆的減鍵操作中獲得O(1)攤銷複雜性?只需在包含該元素的斐波那契堆中找到節點,就可以使用BFS執行O(n)個時間,這將導致無法獲得O(1)攤銷時間。如何實現斐波那契堆中的減鍵在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;
}
}
我可以通過製作一個headnodes的arraylist?所以你更新發生它會自動反映在arraylist以及因爲他們只是參考?我對麼 ?? –
正因爲你提到的原因,在實現Prim算法時,保存一個包含所有堆節點的數組是很常見的。這將顯着加快速度。 – templatetypedef
謝謝!有效 ! –