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;
}
你的意思是:'max'指向堆中的實際對象。在開始時,'pq [1]'和'max'指向堆中的同一個對象。即使在'exch()'和'sink()'之後,'max'仍然引用該對象,而'pq [1]'引用堆中的另一個對象? –
這是正確的,是的。 –