////
Search
Duplicate

우선순위 큐 -지명

우선순위 큐란?

정의
각 요소가 우선순위를 가지며, 우선순위가 높은 요소가 먼저 나가는 자료구조
우선순위에 따라 처리 순서가 결정되는 추상 자료형
특징
선입선출(FIFO - First In First Out) 구조인 일반 큐와는 달리, 요소의 우선 순위에 따라 처리 순서가 달라진다.
4 → 8 → 3 순으로 데이터가 들어간다고 했을 때 큐와 우선순위 큐의 처리순서는 다음과 같다. (높은 값이 높은 우선순위를 갖는다고 가정)
input : 4 → 8 → 3
큐 : 4 → 8 → 3
우선순위 큐 : 8 → 4 → 3
내부적으로 다양한 자료구조(힙, 연결 리스트, 배열)를 사용하여 구현될 수 있으나 효울성을 위해 주로 힙을 사용한다.
배열 기반 구현
삽입은 빠르나 최우선 요소를 찾는 데에는 시간이 많이 걸린다.
연결 리스트 기반 구현
최우선 요소를 쉽게 찾을 수 있으나 삽입과 제거에 더 많은 시간이 소요될 수 있다.
힙 기반 구현
최우선 요소의 삽입과 제거 모두에 효율적이다.
힙 방식이 최악에 경우라도 O(logN)을 보장하기 때문에 일반적으로 힙으로 구현한다.

기본 동작

※ 값이 클수록 우선순위가 높다고 가정 (최대 힙)
peek()
우선순위 큐에서 최대 우선순위 값을 반환한다.
최대 우선순위 값(최대 힙)은 항상 루트에 있으므로 루트 값을 반환한다.
enqueue()
우선순위 큐(최대 힙)에 요소를 삽입하는 작업을 한다.
삽입 작업은 다음과 같다.
1.
힙 끝에 새 요소를 삽입
2.
부모 노드와 비교하여 힙 속성을 위배하는 경우 부모 노드와 값을 바꾼다.
3.
힙 속성이 유지될 때까지 2번 작업을 반복
heapify()
힙 속성을 유지하는 작업을 한다.
위에서 아래로 내려가면서 작업을 한다.
max heap에서 heapify의 작업은 다음과 같다.
1.
자식 노드와 우선순위를 비교
2.
만약 자식 노드 우선순위가 높다면 왼쪽 오른쪽 자식 중 우선순위가 높은 노드와 교환
3.
힙 속성이 유지될 때까지 1,2번 과정을 반복
dequeue() - queue에서 최대 우선 순위 요소를 삭제하고 그 값을 반환한다.
우선순위 큐(최대 힙)에 최대 우선순위 요소를 삭제하고 그 값을 반환하는 작업을 한다.
삭제 작업은 다음과 같다.
1.
루트 노드의 값을 추출한다.
2.
heap 마지막 요소를 루트 노드에 배치한다.
3.
마지막 요소는 제거한다.
4.
루트 노드부터 heapify를 수행한다.

사용 사례

네트워크 트래픽 제어
데이터 패킷의 우선순위를 관리하여 중요한 정보를 먼저 전송한다.
운영체제의 스케쥴링
프로세스 또는 스레드에 우선순위를 부여하여 시스템 자원을 효율적으로 관리한다.
경로 찾기 알고리즘
에이스타(A*) 알고리즘은 그래프 상 두 점 사이의 최단 경로를 찾는 데 사용되는 대표적인 경로 찾기 알고리즘이다.
우선순위 큐를 사용하여 다음에 탐색할 노드를 결정한다.
각 노드는 시작점부터 해당 노드까지의 거리와 목표점까지의 예상 거리를 기반으로 우선순위가 계산되며, 우선순위가 높은 노드(즉, 목표점에 더 가까울 것으로 예상되는 노드)부터 탐색한다.
이 방법으로 불필요한 경로 탐색을 최소화하고 효율적으로 최단 경로를 찾을 수 있다.