우선순위큐와 힙 내용 정리
C++를 이용한 우선순위큐 프로그래밍 방법 정리
백준 1966번 - 프린터 큐
우선순위큐 O(n) - 우선순위큐는 우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조
- 스택이나 큐를 우선순위큐로 구현 가능
- 배열을 이용한 구현 연결리스트를 이용한 구현, 힙을 이용한 구현이 있음
- 시뮬레이션, 네트워크 트래픽 제어, OS의 작업 스케쥴링 등에 사용
우선순위큐의 데이터
우선순위큐의 연산
- insert(item) : 우선순위큐에 항목 item을 추가
- remove() : 우선순위 큐로부터 가장 우선순위가 높은 요소를 삭제하고 이 요소를 반환
- find() : 우선순위가 가장 높은 요소를 삭제하지 않고 반환
- isEmpty() : 우선순위큐가 공백상태인지 검사
- isFull() : 우선순위큐가 포화상태인지 검사
- display() : 우선순위큐의 모든 요소를 출력
힙(Heap) - 완전이진트리 형태의 자료구조
최대 힙(Max Heap)
: 부모 노드의 key값이 자식 노드의 key값보다 크거나 같은 완전 이진 트리
최소 힙(Min Heap)
: 부모 노드의 key값이 자식 노드의 key값보다 작거나 같은 완전 이진 트리
힙의 높이
힙의 구현
: 배열을 이용해 힙을 구현할 수 있음
삽입 연산
삭제 연산
힙의 복잡도
- 삽입연산에서의 최악의 경우
: O(logn)- 삭제연산에서의 최악의 경우
: O(logn)
-> 두 경우 모두 트리의 높이에 해당하는 비교 연산 및 이동 연산이 필요
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<int> pq; // 우선순위 큐 선언
pq.push(9);
pq.push(3);
pq.push(7);
pq.push(1);
pq.push(10); // 우선순위 큐에 원소 삽입
cout << pq.size() << endl; // 결과 출력
while(!pq.empty()) // 우선순위 큐가 비어있지 않다면 반복문 실행
{
int temp = pq.top(); // 큐의 제일 앞부분 값 불러오기
cout << temp; // 큐 제일 앞부분 빼기
pq.pop();
}
return 0;
}
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int n, m = 0; // 문서 개수, 문서 위치
int imp; // 중요도
int cnt = 0;
int test_case; //
cin >> test_case;
for (int i = 0; i < test_case; i++)
{
cin >> n >> m;
queue<pair<int, int>> q;
priority_queue <int> pq;
for (int j = 0; j < n; ++j)
{
cin >> imp;
q.push({ j,imp });
pq.push(imp);
}
while (!q.empty())
{
int index = q.front().first;
int value = q.front().second;
q.pop();
if(pq.top() == value)
{
pq.pop();
cnt++;
if (index == m)
{
cout << cnt << endl;
break;
}
}
}
else q.push({ index,value });
}
}