Java 如何在Fibonacci堆中实现reduce键以在O(1)摊销时间内运行?

Java 如何在Fibonacci堆中实现reduce键以在O(1)摊销时间内运行?,java,big-o,prims-algorithm,fibonacci-heap,decrease-key,Java,Big O,Prims Algorithm,Fibonacci Heap,Decrease Key,如何在斐波那契堆上的减少键操作中获得O1摊销复杂性?使用BFS在Fibonacci堆中查找包含该元素的节点需要很长时间,这将使获得O1摊销时间变得不可能 以下是我的BFS实现,用于搜索相关节点,以供参考: public fHeapNode search(int x){ Stack<fHeapNode> stack = new Stack<fHeapNode>(); stack.push(minNode); //Brea

如何在斐波那契堆上的减少键操作中获得O1摊销复杂性?使用BFS在Fibonacci堆中查找包含该元素的节点需要很长时间,这将使获得O1摊销时间变得不可能

以下是我的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;
        }
    }

通常,在实现斐波那契堆时,enqueue的实现将返回指向新插入节点的指针。这样,就可以存储指针供以后使用。如果没有指向该节点的指针,则必须花时间搜索该节点,这是绝对正确的

作为一个例子,这里是。此处给出了排队方法:

public Entry<T> enqueue(T value, double priority) {
     // ...
}
这里,参数是对应于持有其键应该减少的元素的节点的条目。在没有enqueue返回的条目的情况下调用此方法是不可能的,因为否则将无法有效地实现


希望这有帮助

我可以通过制作头节点的阵列列表来完成吗??因此,如果发生更新,它也会自动反映在arraylist中,因为它们只是引用??我说的对吗?在实现Prim算法时,存储一个包含所有堆节点的数组是很常见的,原因正是您提到的。这将大大加快速度。@RohitGarg-很高兴能帮上忙!请记住,您始终可以接受此答案来标记问题已结束:-
public void decreaseKey(Entry<T> entry, double newPriority) {
     // ...
}