큐는 먼저 들어오는 데이터가 먼저 나가는 선입선출 (FIFO) 형식의 자료구조지만 우선순위 큐는 들어오는 순서에 상관 없이 우선순위가 높은 데이터가 먼저 나가는 자료구조이다.
우선순위 큐는 힙(Heap)을 이용하여 구현하는 것이 가장 효율적이다.
완전이진트리 형태의 자료구조
완전이진트리는 마지막 레벨을 제외한 모든 레벨이 모두 채워져 있고 마지막 레벨은 왼쪽부터 채워져 있어야 함
최대 힙(Max Heap): 부모 노드의 키값이 자식 노드보다 큰 구조
최소 힙(Min Heap): 부모 노드의 키값이 자식 노드보다 작은 구조
배열로 힙을 표현할 때
Heapify: Heap의 특성을 만족하도록 각 노드들의 위치를 조정하는 과정
Max Heap의 삽입 연산
void insert(int item) {
int i = ++size;
//heapify (up-heap)
while(i > 1 && item > heap[i/2]) {
heap[i] = heap[i/2];
i /= 2;
}
heap[i] = item;
}
Max Heap의 삭제 연산
int delete() {
int item = heap[1];
int temp = heap[size--];
int parent = 1, child = 2;
//heapify (down-heap)
while(child <= size) {
if((child < size) && (heap[child] < heap[child+1]))
child++;
if(tmp >= heap[child]) break;
else{
heap[parent] = heap[child];
parent = child;
child *= 2;
}
}
heap[parent] = temp;
return item;
}
다익스트라 알고리즘 (Dijkstra's Algorithm): 그래프의 한 정점에서 다른 정점까지의 최단거리를 구하는 알고리즘