2014-11-24 40 views
0

我使用PriorityQueue在我的代碼中擁有堆數據結構。我不想找到最低價格爲cost的顧客。在執行過程中,客戶的成本可能會發生變化。所以我保留了所有客戶的堆。我嘗試下面的代碼 - (輸出在評論表示)HeapifyJava priorityQueue

PriorityQueue<Customer> pq = new PriorityQueue<>(); 
    Customer c1 = new Customer(10); 
    Customer c2 = new Customer(20); 
    Customer c3 = new Customer(3); 
    Customer c4 = new Customer(40); 
    pq.add(c1);pq.add(c2);pq.add(c3);pq.add(c4); 

    System.out.println(pq.peek() == c3); //Prints true 

    c1.cost = 1; 

    System.out.println(pq.peek() == c1); //Prints false 

雖然對象c1的狀態改變時,堆沒有得到Heapified。基本上我想要兩條線都輸出true。我沒有找到任何明確Heapifying堆的javadoc幫助。有人可以請幫忙,我該怎麼做/調整呢?

回答

0

更新後,您需要刪除對象並將其重新插入到PriorityQueue中。優先級隊列通過在插入新元素時將新元素放在適當的位置並且不考慮更新來工作。

+1

據我所見,這是正確的。但是,這不是優先級隊列*應該如何工作的方式。更新堆中給定的元素只需要對該元素執行heapUp/heapDown操作(取決於鍵是增加還是減少),並且運行時間爲O(log n)。然而,'remove'調用需要花費時間O(n)來查找要移除的元素......這可能無法擺脫首先使用二進制堆的目的。 – misberner 2014-11-24 11:26:25