본문 바로가기

코딩 및 기타/어서와! 자료구조와 알고리즘

우선순위 큐

728x90

 ∙ 우선순위 큐 (priority queue)

- 각각의 데이터에 우선순위가 정의되어 있어서, 입력 순서에 상관없이 우선순위가 가장 높은 데이터가 먼저 출력되는 형태의 자료 구조

- 우선순위의 예 : 응급 자동차, 네트워크 트래픽 우선순위, 운영체제에서 프로그램 우선순위

- 일반 선출(FIFO) 큐 : 큐에 머무른 시간을 우선순위로 설정하면 일반 큐와 같이 동작

- C++에서 우선순위 큐 사용하기

> STL에서 제공하는 std::priority_queue 컨테이너 사용

 

∙ std::priority_queue

- 우선순위 큐의 기능을 제공하는 컨테이너 어댑터

- 삽입 순서에 상관없이 우선순위가 가장 높은 원소가 먼저 출력됨

- 사용자 정의 타입을 저장할 경우, 비교 연산을 지원해야 함

- <queue>에 정의되어 있음

- 주요 멤버 함수

> priority_queue::push(e) : 우선순위 큐에 원소 e를 추가 O(log n)

> priority_queue::pop() : 우선순위 큐의 최상위 원소를 제고 O(log n)

> priority_queue::top() : 우선순위 큐의 최상위 원소를 참조 O(1)

 

∙priority_queue 실습

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

using namespace std;

// pq1, pq2 타입 형태가 다르기 때문에 template 사용
template <typename T>
void print_queue(T q)
{
    while (!q.empty()) {
        cout << q.top() << ", ";
        q.pop();
    }
    cout << endl;
}

// score가 높은 우선순위 비교 클래스
class Student
{
public:
    string name;
    int score;

    bool operator < (const Student& st) const
    {
        return score < st.score;
    }
};

int main()
{
    vector<int> vec {4, 2, 3, 5, 1};

    priority_queue<int> pq1;
    for (auto n : vec)
        pq1.push(n);
    print_queue(pq1);

    priority_queue<int, vector<int>, greater<int>> pq2(vec.begin(), vec.end());
    print_queue(pq2);

    priority_queue<Student> students;
    students.push({"Amelia", 80});
    students.push({"Sophia", 40});
    students.push({"Olivia", 95});
    students.push({"George", 70});

    while (!students.empty()) {
        auto& s = students.top();
        cout << s.name << " (" << s.score << ")" << endl;
        students.pop();
    }
}

'코딩 및 기타 > 어서와! 자료구조와 알고리즘' 카테고리의 다른 글

순서없는 연관 컨테이너  (0) 2023.08.30
해싱과 해시 함수  (0) 2023.08.30
  (0) 2023.08.28
이진 탐색 트리  (0) 2023.08.27
19 일차  (0) 2023.08.27