所以我正在学习算法的课程(由Sedgewick教授,很棒的课程顺便说一句),这个"无序的数组优先级队列中有一部分我很困惑"
public class UnorderedPQ < Item extends Comparable > {
private Comparable[] pq;
private int N;
public UnorderedPQ(int maxN) {
pq = new Comparable[maxN];
}
public boolean isEmpty() {
return N == 0;
}
public void insert(Item x) {
pq[N++] = x;
}
public Item delMax() {
int max = 0;
for (int i = 1; i < N; i++)
if (less(max, i)) max = i;
exch(max, N - 1);
return (Item) pq[--N];
}
}
return (Item) pq[--N];
&lt; ---这一部分,评论说明&#34;从PQ中删除并返回最大元素&#34;
所以基本上我理解的只是pq[--N]
,请记住,我基本上从未做过任何java。
我明白为什么这会返回第N-1个数组项....但是它究竟会如何完全删除它。在课程中,它声明我们这样做是为了防止游荡,并且#34;?但我不完全确定它是如何工作的?
旁注:任何想法为什么在for循环中为delMax()从1开始?我认为这是因为我们正在加入前面,所以他们没有理由我们检查第一项?
答案 0 :(得分:3)
你有两个问题:
1) pq[--N]
如何完全删除该项?答案是它没有。它有效地通过递减N
来删除它,因此它不会被视为优先级队列中的存在,但对Item
的引用仍然存在于数组中{ {1}}。要完全删除它(并使其符合垃圾回收条件),数组元素应该已设置为pq
。我将其归类为内存泄漏。
2)为什么null
中的循环从1开始?它从1开始的原因是前一行 - delMax()
- 将元素0设置为最大元素。检查元素0是否小于它本身是没有意义的。