우선순위 큐(PQ: Priority Queue)란?
- 기존의 큐는 먼저 들어온 순서대로 First In, First Out (FIFO)을 만족하지만,
우선순위 큐는 우선순위가 더 높은 원소에 대하여 IO 먼저 진행한다.
우선순위 큐(Priority Queue) 구현은 어떻게 할까?
- 일반적으로 힙(Heap)을 이용한다. (힙이란?)
- 배열이나 연결리스트를 사용하지 않는 이유는? (찬희님의 블로그)
→ 삽입 과정에서 소요되는 시간이 O(n)으로 비교적 길기 때문에
- 배열이나 연결리스트를 사용하지 않는 이유는? (찬희님의 블로그)
- 값이 클 수록 우선순위가 높다고 가정했을 경우, 아래와 같이 최대힙을 사용하여 우선순위 큐를 구현해 준다.
- 힙의 성질에 따라,
- n번째 노드의 자식들은 2n, 2n+1번째에 채워지게 된다.
- n번째 노드의 부모는 n / 2 번째에 위치한다.
- PQ의 Push == 힙의 Insert
- PQ의 Pop == 힙의 Delete
더보기
삽입 (Insert)
삽입이 될 새로운 키를 newKey라고 하자.
- 마지막 위치에 newKey를 채워준다.
- newKey < 부모 Key 일 경우, 부모와 key 값을 교체한다.
- Root까지 2번 작업을 반복한다.
void insert(int newKey) {
heap[++heapSize] = newKey;
for (int i = heapSize; i > 1; i /= 2) {
if (heap[i / 2] > heap[i]) {
swap(i / 2, i);
}
else {
break;
}
}
}
삭제 (Delete)
Heap에서의 삭제는 Root 삭제를 의미한다.
- Root 삭제한다.
- 가장 마지막 Key를 Root로 옮겨준다.
- Key > 자식 Key 일 경우, 자식 중 더 작은 자식과 교체한다.
- 3번 작업을 반복하여 더 이상 큰 자식이 없을 경우 작업을 마친다.
int delete() {
if (heapSize == 0) return 0;
int rootKey = heap[1];
heap[1] = heap[heapSize--];
for (int i = 1; 2 * i <= heapSize) {
int leftChild = 2 * i;
int rightChild = 2 * i + 1;
if (heap[i] < heap[leftChild] && heap[i] < heap[rightChild]) break;
if (heap[leftChild] < heap[rightChild]) {
swap(i, rightChild);
i = rightChild;
}
else {
swap(i, leftChild);
i = leftChild;
}
}
return rootKey;
}
index | [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] |
priority | - | 13 | 5 | 8 | 2 | 1 | 6 | 4 |
Reference
'공부이야기 > Algorithm' 카테고리의 다른 글
[LeetCode][DFS|BFS] 1654. Minimum Jumps to Reach Home (0) | 2021.11.21 |
---|---|
[LeetCode][Greedy] 11. Container With Most Water (0) | 2021.11.19 |
[자료구조] 힙(Heap)이란? (0) | 2021.11.16 |
[LeetCode][Greedy] 55. Jump Game (0) | 2021.10.04 |
[HackerRank][String Manipulation] Special String Again (2) | 2021.04.23 |
댓글