728x90
정의
- 우선순위 큐(priority queue)는 각 요소에 어떠한 우선순위가 추가로 부여되어 있는 컨테이너
- container를 max heap으로 유지
특징
- 우선순위가 높은 요소는 우선순위가 낮은 요소보다 먼저 제공
- 일부 구현에서 두 요소의 우선 순위가 같으면 대기열에 포함된 순서에 따라 제공된다.
- 다른 구현에서 동일한 우선 순위를 가진 요소의 순서는 정의되지 않은 상태로 유지
- 데이터가 완벽히 정렬된 상태는 아니지만 최댓값은 빠르게 찾을 수 있음
- 연속적으로 데이터의 최댓값 또는 최솟값만 필요 시
- 상수가 큰 std::set 보다 훨신 효율적 동작
시간복잡도
- 힙 기반으로 -> 완전 이진 트리로 최소힙 또는 최대힙이 있다.
- 삽입, 삭제, 탐색, 수정에 대해 O(logN)
int형 우선순위큐
- greater를 써서 오름차순
- less를 써서 내림차순
- 기본값 -> 내림차순이므로 단순하게 priority_queue<타입>을 쓰면 해당 타입에 대해 내림차순 설정
- 메서드는 stack과 동일
#include <bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> > pq; // 오름차순
priority_queue<int> pq2; // 내림차순
priority_queue<int, vector<int>, less<int> > pq3; // 내림차순
int main(){
for(int i = 5; i >= 1; i--){
pq.push(i); pq2.push(i); pq3.push(i);
}
while(pq.size()){
cout << pq.top() << " : " << pq2.top() << " : " << pq3.top() << '\n';
pq.pop(); pq2.pop(); pq3.pop();
}
return 0;
}
/*
1 : 5 : 5
2 : 4 : 4
3 : 3 : 3
4 : 2 : 2
5 : 1 : 1
*/
구조체를 담은 우선순위큐
- int 뿐만 아니라 구조체(struct) 등 다른 자료구조를 넣어서 할 수도 있다.
- 구조체를 담은 우선순위를 보자
#include <bits/stdc++.h>
using namespace std;
struct Point{
int y, x;
Point(int y, int x) : y(y), x(x){}
Point(){y = -1; x = -1;}
bool operator < (const Point & a) const{
return x > a.x;
}
};
priority_queue<Point> pq;
int main(){
pq.push({1, 1});
pq.push({2, 2});
pq.push({3, 3});
pq.push({4, 4});
pq.push({5, 5});
pq.push({6, 6});
cout << pq.top().x << "\n";
return 0;
}
/*
1
*/
- 위의 코드를 보면 분명 < 연산자에 x > a.x를 했기 때문에 분명 내림차순으로 정렬되어 6이 출력이 되어야 하는데 1이 출력된다.
- 우선순위큐에 커스텀 정렬을 넣을 때 반대로 넣어야 하는 특징 때문
#include <bits/stdc++.h>
using namespace std;
struct Point{
int y, x;
Point(int y, int x) : y(y), x(x){}
Point(){y = -1; x = -1; }
bool operator < (const Point & a) const{
return x < a.x;
}
};
priority_queue<Point> pq;
int main(){
pq.push({1, 1});
pq.push({2, 2});
pq.push({3, 3});
pq.push({4, 4});
pq.push({5, 5});
pq.push({6, 6});
cout << pq.top().x << "\n";
return 0;
}
/*
6
*/
- 위에 보면 x > a.x가 x < a.x로 바뀐 모습
- 우선순위큐에 커스텀 정렬을 넣을 때는 반대라고 생각하면 된다.
- 가장 최소를 끄집어 내고 싶은 로직이라면 >
- 최대라면 <
- 아래처럼도 가능하다.
#include <bits/stdc++.h>
using namespace std;
struct Point{
int y, x;
};
struct cmp{
bool operator()(Point a, Point b){
return a.x < b.x;
}
};
priority_queue<Point, vector<Point>, cmp> pq;
int main(){
pq.push({1, 1});
pq.push({2, 2});
pq.push({3, 3});
pq.push({4, 4});
pq.push({5, 5});
pq.push({6, 6});
cout << pq.top().x << "\n";
return 0;
}
/*
6
*/
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] 포인터 (1) | 2023.11.30 |
---|---|
[C++] 구조체 (0) | 2023.11.29 |
[C++] 접근 지정자와 인라인 함수 (0) | 2023.11.29 |
[C++] 소멸자 (2) | 2023.11.29 |
[C++] 생성자 (1) | 2023.11.27 |