这个优先级队列 delMax() 方法中的一个潜在错误,是吗?
A potential bug in this prioprity queue delMax() method, is it?
这是一段 Java 代码,用于实现删除优先级队列中的最大值。
问题是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;
}
没有。 pq[1]
指的是堆中其他地方的某个对象,在 Key max = pq[1]
之后,max
指的是同一个对象。在该点之后更改 pq[1]
不会更改 max
.
更改 pq[1]
引用的 对象的 内容会更改 max
引用的对象,因为它们是同一个对象,但仅仅设置 pq[1]
来引用不同的对象不会改变 max
.
这是一段 Java 代码,用于实现删除优先级队列中的最大值。
问题是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;
}
没有。 pq[1]
指的是堆中其他地方的某个对象,在 Key max = pq[1]
之后,max
指的是同一个对象。在该点之后更改 pq[1]
不会更改 max
.
更改 pq[1]
引用的 对象的 内容会更改 max
引用的对象,因为它们是同一个对象,但仅仅设置 pq[1]
来引用不同的对象不会改变 max
.