我有一个实现为堆的索引最小优先级队列。删除索引元素时,代码为:
public void delete(int i) {
if (i < 0 || i >= maxN) throw new IllegalArgumentException();
if (!contains(i)) throw new NoSuchElementException("index is not in the priority queue");
int index = qp[i];
exch(index, n--);
swim(index); // Why is this needed?
sink(index);
keys[i] = null;
qp[i] = -1;
}
其余代码可以在这里找到:https : //algs4.cs.princeton.edu/24pq/IndexMinPQ.java.html
由于pq[N] 是 中的最后一个元素pq[],并且它与元素 at 交换pq[i](将被删除),这是否意味着pq[i]交换后的值大于或等于pq[i]交换前的值?问题是为什么我们必须打电话swim(i)而不是sink(i)单独打电话?什么情况下需要swim(i)在swap后调用?
(有3个阵列,qp[]并keys[]与相应的索引,以及pq[]使得qp[pq[i]]= pq[qp[i]]= i。)
湖上湖
相关分类