Publish:

태그: , ,

카테고리:


Priority_Queue (우선순위 큐) 란?

  • Queue의 한 종류로, 우선순위에 따라 정렬된 Queue이다.
  • 어떤 원소가 삽입(push) 된다면 뒤에 삽입되었다가 지정된 우선순위에 맞춰서 Queue가 정렬된다.
  • 삭제(pop)는 정렬된 Queue의 맨 앞에서 이루어진다.
  • 자료구조 Heap으로 구현되었기 때문에 Heap의 시간복잡도와 같은 O(logN)이다.
  • 여기서 heap 과 다른 점이 나타나는데, heap은 make_heap으로 만들 수 있고 이것은 vector 데이터를 heap 구조로 변경해주는 것이다.
  • 우선순위 큐는 내부적으로 make_heap, push_heap, pop_heap 을 사용하지만 Priority_Queue 라는 Container를 제공해준다.

C++ STL에서의 Queue

먼저 queue 라이브러리를 include 해줘야 한다.

1
#include <queue>

그리고 이런식으로 선언할 수 있다.

1
2
3
4
5
6
7
8
priority_queue<자료형> 변수명  // 원소가 내림차순(기본, less)으로 정렬되는 우선순위 큐가 생성된다.  
priority_queue<int> queue;  

priority_queue<자료형, Container> 변수명  // 내부 컨테이터 변경
priority_queue<int, vector<int>> queue;  // 내부 컨테이너는 구조체를 넣어줄 수도 있다. 이땐 비교 연산자를 정의해줘야 한다.

priority_queue<자료형, Container, 정렬기준> 변수명  // 정렬 기준 변경
priority_queue<int, vector<int>, greater<int>> queue;  // 오름차순으로 정렬 기준 변경. 정렬 기준은  연산자 오버로딩으로 재정의할 수 있다.

멤버 함수

  • push(element) : 원소 삽입 (정렬 기준에 따라 내부적으로 정렬 된다)
  • pop() : 맨 앞에 있는 원소 삭제
  • top() : 맨 앞에 있는 원소를 반환
  • empty() : 큐가 비어있으면 true, 아니면 false 반환
  • size() : 큐의 크기 반환

Pair와 사용하기

1
2
3
4
priority_queue<pair<int,int>> pairQueue;

pairQueue.push(make_pair(1, 100));
pairQueue.push(make_pair(2, 200));

pair와 같이 사용되는 경우 비교 우선순위는 먼저 첫번째 요소이고,
첫번째 요소가 같다면 두번째 요소로 비교하게 된다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <queue>
using namespace std;
 
struct Sample
{
    int index;
    int value;

    Sample(int _index, int _value)
    {
        index = _index;
        value = _value;
    }
};

struct Compair
{
    bool operator() (Sample s1, Sample s2)
    {
        // value가 큰 순서대로 정렬된다
        return s1.value < s2.value;
    }
};

void main()
{
    priority_queue<Sample, vector<Sample>, Compair> queue;

    queue.push(Sample(0, 111));
    queue.push(Sample(1, 222));
    queue.push(Sample(2, 333));
    queue.push(Sample(3, 444));
    queue.push(Sample(3, 555));

    Sample popValue = queue.top();  // { index=3 value=555 }
    queue.pop();
    popValue = queue.top();         // { index=3 value=444 }
    queue.pop();
}

이렇게 구조체를 넣어줄 수도 있고, 비교 기준을 바꿔줄 수도 있다.
( + 만약 int가 아니라 char 자료형이라면, 문자의 아스키코드 값이 더 큰 순서대로 정렬될 것 )


이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기