우선순위 큐
큐는 선입선출(First In First Out) 자료구조이지만
우선순위 큐는 들어온 순서가 아닌 정의된 우선순위에 따라 먼저 처리되는 구조이다.
ex) 수행할 작업이 여러개 있고 시간이 제한되어 있을 때 우선순위가 높은 것부터 수행
※ 여러 자료구조들로 구현할 수 있으나 heap 특성과 많이 닮아 heap으로 구현하는 경우가 많다.
ex) 연결 리스트나 배열에 원소들을 집어넣고,
원소를 꺼낼 때마다 모든 원소를 순회하며 우선순위가 가장 높은 원소를 찾는 방법
힙(Heap) 자료구조란?
Heap - 최대값 또는 최소값을 빠르게 구하기 위한 자료구조 - 완전 이진 트리를 기본으로 한 자료구조 - 마지막 레벨을 제외한 모든 레벨에 노드가 꽉 차 있어야 한다. - 트리가 한쪽으로 기울어진
zoosso.tistory.com
[큐] Queue란?
Queue란? 선입선출(First In First Out, FIFO)의 자료 구조 ▶ 큐(Queue)는 한쪽에서 삽입(Push, Enqueue) 하며, 다른 한쪽에서 빠져나오는(Pop, Dequeue) 구조 두 지점을 와 로 표현한다. (Front, Rear) ▶ C++..
zoosso.tistory.com
[C++] [STL] Priority_queue
우선순위 큐 (Priority_queue) 큐(Queue) 선입선출(First In First Out) 구조였다면 우선순위 큐(Priority Queue)는 들어온 순서가 아닌 우선순위에 따라 먼저 처리되는 구조이다. 내부적으로 Heap 자료 구조가..
zoosso.tistory.com
구현 예시
const int LM = 20010;
bool Max(int a, int b) { return a > b; }
bool Min(int a, int b) { return a < b; }
void swap(int& a, int& b) {
int t = a; a = b; b = t;
}
typedef struct PriorityQueue PQ;
struct PriorityQueue {
int heap[LM];
int hn;
bool (*comp)(int a, int b);
void init(int sign) {
hn = 0;
comp = sign ? Max : Min;
}
int top() { return heap[1]; }
int size() { return hn; }
bool empty() { return hn == 0; }
void push_heap(int num) {
heap[++hn] = num;
int c = hn;
for (; c > 1 && comp(heap[c], heap[c / 2]); c /= 2)
swap(heap[c], heap[c / 2]);
}
int pop_heap() {
int p = 1, c = 2, ret = heap[1];
swap(heap[1], heap[hn--]);
for (; c <= hn; p = c, c *= 2) {
if (c < hn && comp(heap[c + 1], heap[c])) c++;
if (!comp(heap[c], heap[p])) break;
swap(heap[c], heap[p]);
}
return ret;
}
}maxpq, minpq;
[구현 예시] template 버전
const int LM = 20010;
template<class T>
bool Max(T& a, T& b) { return a > b; }
template<class T>
bool Min(T& a, T& b) { return a < b; }
template<class T>
void swap(T& a, T& b) {
T t = a; a = b; b = t;
}
template<class T>
struct PriorityQueue {
T heap[LM];
int hn
;
bool (*comp)(T& a, T& b);
void init(int sign) {
hn = 0;
comp = sign ? Max<T> : Min<T>;
}
T top() { return heap[1]; }
int size() { return hn; }
bool empty() { return hn == 0; }
void push_heap(int num) {
heap[++hn] = num;
int c = hn;
for (; c > 1 && comp(heap[c], heap[c / 2]); c /= 2)
swap(heap[c], heap[c / 2]);
}
T pop_heap() {
int p = 1, c = 2;
T ret = heap[1];
swap(heap[1], heap[hn--]);
for (; c <= hn; p = c, c *= 2) {
if (c < hn && comp(heap[c + 1], heap[c])) c++;
if (!comp(heap[c], heap[p])) break;
swap(heap[c], heap[p]);
}
return ret;
}
};
Reference
'자료구조' 카테고리의 다른 글
[큐] Queue란? (2) | 2021.04.23 |
---|---|
[스택] Stack 이란? (0) | 2021.04.22 |
힙(Heap) 시뮬레이션 (0) | 2021.02.27 |
힙(Heap) 자료구조란? (0) | 2021.02.27 |
그래프 정의 및 구현 방식 (인접 행렬 & 인접 리스트) (0) | 2021.02.25 |
댓글