使用priorityQueue的java heapify方法

使用priorityQueue的java heapify方法,java,heap,priority-queue,Java,Heap,Priority Queue,我在java程序中使用priorityQueue作为最大堆实现。现在我需要对创建的堆进行堆化,以计算最大值。priorityQueue似乎没有实现heapify方法。所以我的问题是,使用priorityQueue处理这个问题是否有任何方法?如果没有,java中是否有任何可靠的Max heap实现具有heapify方法?请注意,我的程序使用自己的比较器。所以这个实现应该支持这一点 还有一些解释: PriorityQueue<Customer> marginalGainHeap = ne

我在java程序中使用priorityQueue作为最大堆实现。现在我需要对创建的堆进行堆化,以计算最大值。priorityQueue似乎没有实现heapify方法。所以我的问题是,使用priorityQueue处理这个问题是否有任何方法?如果没有,java中是否有任何可靠的Max heap实现具有heapify方法?请注意,我的程序使用自己的比较器。所以这个实现应该支持这一点

还有一些解释:

PriorityQueue<Customer> marginalGainHeap = new PriorityQueue<Customer>(
            1, new Comparator<Customer>() {
                public int compare(Customer c1, Customer c2) {
                    return Double.compare(c1.getMarginalGain(),
                            c2.getMarginalGain());
                }
            });
但有一个问题:

  • 它给我的程序增加了一些额外的延迟。我想尽可能地提高效率

    • 优先级队列已经是堆,因此它不需要heapify方法。
      这种方法通常在不是堆的结构上实现

      因此,只需在队列中添加/删除元素,然后

      假设最大元素位于位置0(根)

      你想做什么,为什么?如果它是优先级队列,那么在队列的开始(或结尾)有max?我将检索更新堆中的一些值,并检索具有最大值(root)@Fazovsky的值,不一定,如果子节点已更新且其值大于root,该怎么办?您的优先级队列应保持更新中元素的顺序。i、 e.如果值发生变化,则订单可能也需要改变。如何删除该值?首先,我需要找到这个值,这样这个过程将在运行时增加一些延迟。顺便说一句,什么方法可以处理这种情况?看看投票和提供的方法@Alin您可以使用
      poll()
      队列删除元素。这很好,除非项目的优先级发生变化,必须重新调用。从现在开始,您必须删除它,然后将其添加回队列。这要贵得多。@SergueiFedorov只是检查一下,您需要删除并重新插入特定的项目吗?类似于
      queue.add(queue.remove())不起作用?
      
      marginalGainHeap.remove(node)
      marginalGainHeap.add(node)