2016-02-21 55 views
0

這是一段Java代碼實現刪除優先級隊列中的最大值。這個prprority隊列delMax()方法中的潛在錯誤,是嗎?

問題是Key max = pq[1],如果Key是一個原始類型,那麼這行真的會將pq[1]複製到max變量中。但是,如果Key是引用,則在exch()sink()之後,此max不再引用此優先級隊列中的最大值(它永久引用pq [1]),但是是次最大值。我認爲正確嗎?

/** 
* Removes and returns a largest key on this priority queue. 
* 
* @return a largest key on this priority queue 
* @throws NoSuchElementException if this priority queue is empty 
*/ 
public Key delMax() { 
    if (isEmpty()) throw new NoSuchElementException("Priority queue underflow"); 
    Key max = pq[1]; 
    exch(1, N--); 
    sink(1); 
    pq[N+1] = null;  // to avoid loiterig and help with garbage collection 
    if ((N > 0) && (N == (pq.length - 1)/4)) resize(pq.length/2); 
    assert isMaxHeap(); 
    return max; 
} 

回答

2

pq[1]是指堆一些對象別處,和Key max = pq[1]後,max指的是同一個對象。在該點不改變之後更改pq[1]max

改變對象的內容提到通過pq[1]將由max改變所指的對象,因爲它們是相同的對象,但只設置pq[1]指不同的對象不會改變max

+0

你的意思是:'max'指向堆中的實際對象。在開始時,'pq [1]'和'max'指向堆中的同一個對象。即使在'exch()'和'sink()'之後,'max'仍然引用該對象,而'pq [1]'引用堆中的另一個對象? –

+0

這是正確的,是的。 –