본문 바로가기

알고리즘 Algorithm/자료구조 Data structure

우선순위 큐 (Priority queue) - [C++ STL]

원리


  • 일반 큐와 달리 우선순위가 높은 값이 먼저 나오는 원리입니다.
  • 큐 (Queue)와 마찬가지로 배열, 리스트를 이용해서 구현이 가능합니다.
  • 하지만 일반적으로 배열을 이용한 힙을 이용하여 구현합니다.

힙을 이용하는 이유


구조 push pop
배열 \(O(n)\) \(O(1)\)
리스트 \(O(n)\) \(O(1)\)
\(O(log_2n)\) \(O(log_2n)\)
  • 자료 저장 및 삭제에 대한 성능에서 차이가 큽니다.
  • 힙의 시간 복잡도를 구하는 방법은 힙 (Heap)을 참고하면 됩니다.
  • 힙을 배열로 구현하는 이유는 마지막 노드 추가 시 마지막 노드를 탐색하는데 용이하기 때문입니다.

소스 코드(구현)


힙 (Heap)에서 구현한 코드가 우선순위 큐와 원리가 같은 코드이기 때문에 코드가 같습니다.

STL


queue를 include하여 이용하면 됩니다.
std 네임스페이스에 속합니다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int, vector<int>, less<int>> q;

    q.push(2);
    q.push(3);
    q.push(1);
    q.push(5);
    q.push(4);

    while (!q.empty())
    {
        cout << q.top() << endl;
        q.pop();
    }

    return 0;
}
  • priority_queue<자료형>과 priority_queue<자료형, 컨테이너, 정렬기준>으로 선언이 가능합니다.
  • priority_queue<자료형>으로 선언 시 컨테이너는 vector가 default이며, 정렬기준은 내림차순입니다.
  • 정렬 기준은 기본적으로 less(내림차순)과 greater(오름차순)이 있으며, 아래 코드처럼 연산자를 다중 정의(overloading)하여 직접 만들어서 사용할 수도 있습니다.
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct cmp
{
    bool operator()(int data1, int data2){
        return data1 > data2;
    }
};

int main()
{
    priority_queue<int, vector<int>, cmp> q;

    q.push(2);
    q.push(3);
    q.push(1);
    q.push(5);
    q.push(4);

    while (!q.empty())
    {
        cout << q.top() << endl;
        q.pop();
    }

    return 0;
}
  • 메서드

    • push : 값을 저장합니다. operator의 우선 순위에 맞추어서 저장합니다.

    • pop : top에 있는 값을 삭제합니다.

    • top : 맨 위 값을 반환합니다.

    • empty : 노드가 비어있을 시 true, 아닐 시 false를 반환합니다.

    • size : 원소의 개수를 반환합니다.

    • swap : 두 우선순위 큐를 서로 교환합니다. (C++11)

    • emplace : 컨테이너 내부에서 값을 저장합니다. (C++11)

'알고리즘 Algorithm > 자료구조 Data structure' 카테고리의 다른 글

정렬 (sort) : 선택 정렬 (Selection sort)  (0) 2021.02.24
정렬 (sort) : 버블 정렬 (Bubble sort)  (0) 2021.02.24
힙 (Heap)  (0) 2021.02.18
이진 트리 (Binary Tree)  (0) 2021.02.10
트리 (Tree)  (0) 2021.02.10