나는 우선 순위 큐에 대한 아이디어를 가지고있다.하지만 인덱스 우선 순위 큐에 관해서는, 나는 약간의 메소드 구현과 혼동된다. 변경 (int k, 항목 항목) 및 삭제 (int i).인덱스 우선 순위 큐의 혼란
변화 (INT의 K, 상품 아이템)
삭제 항목 (K)와 연관된 항목을 변경하는 K와 연관된 항목을 제거하는 것 (전 INT)
public void changeKey(int i, Key key) {
if (i < 0 || i >= maxN) throw new IndexOutOfBoundsException();
if (!contains(i)) throw new NoSuchElementException("index is not in the priority queue");
keys[i] = key;
swim(qp[i]);
sink(qp[i]);
}
public void delete(int i) {
if (i < 0 || i >= maxN) throw new IndexOutOfBoundsException();
if (!contains(i)) throw new NoSuchElementException("index is not in the priority queue");
int index = qp[i];
exch(index, n--);
swim(index);
sink(index);
keys[i] = null;
qp[i] = -1;
}
private void swim(int k) {
while (k > 1 && greater(k/2, k)) {
exch(k, k/2);
k = k/2;
}
}
private void sink(int k) {
while (2*k <= n) {
int j = 2*k;
if (j < n && greater(j, j+1)) j++;
if (!greater(k, j)) break;
exch(k, j);
k = j;
}
}
private int maxN; // maximum number of elements on PQ
private int n; // number of elements on PQ
private int[] pq; // binary heap using 1-based indexing
private int[] qp; // inverse of pq - qp[pq[i]] = pq[qp[i]] = i
private Key[] keys; // keys[i] = priority of i
싱크 및 수영의 작동을 이해합니다. 그러나 이유는 입니다. (int i) 및 eKey (int i, Key key)에는 swim(qp[i]/index);
과 sink(qp[i]/index);
의 문장이 있습니다.
우선 순위 큐와 인덱스 우선 순위 큐 사이의 요소 구성 스타일을 알고 인덱스 우선 순위 큐의 이진 힙에 저장되는 내용은 무엇입니까?
IndexPrioriryQueue (또는 명명 된 클래스가 무엇이든) 표준 클래스가 아닙니다. 이 클래스의 나머지 코드를 공유 할 수 있습니까? 또는 사용중인 API의 이름? – Asoub
@Asoub [코드] (http://algs4.cs.princeton.edu/24pq/IndexMaxPQ.java.html)는 [알고리즘] (http://algs4.cs.princeton.edu/24pq)에서 오는 것으로 보입니다. /) 도서. –