일반적인 큐는 먼저 들어온 데이터가 먼저 나가는 구조(FIFO)지만,
우선순위 큐는 "우선순위가 높은 데이터"를 먼저 꺼내는 자료구조입니다.
Python에서는 heapq 모듈을 사용해 구현하며, 내부적으로 힙(Heap) 자료구조를 기반으로 합니다.
| 사용 목적 | 설명 |
|---|---|
| 최솟값/최댓값 추출 | 정렬 없이 즉시 꺼낼 수 있음 |
| 최단 경로 알고리즘 | 다익스트라, 프림 등에서 활용 |
| 실시간 작업 처리 | 우선순위 높은 작업 먼저 수행 |
| 이벤트 처리 시뮬레이션 | 시간순 혹은 조건순으로 정렬 유지 |
Python의 heapq는 기본적으로 최소 힙(Min Heap) 구조입니다.
즉, 가장 작은 값을 먼저 꺼내는 구조입니다.
import heapq
pq = []
heapq.heappush(pq, 4)
heapq.heappush(pq, 1)
heapq.heappush(pq, 7)
print(heapq.heappop(pq)) # 출력: 1 (가장 작은 값부터 나옴)
Python에는 Max Heap이 없기 때문에, 음수로 변환하여 넣고 꺼낼 때 다시 음수로 바꿔줍니다.
python
복사편집
import heapq
pq = []
heapq.heappush(pq, -4)
heapq.heappush(pq, -1)
heapq.heappush(pq, -7)
print(-heapq.heappop(pq)) # 출력: 7 (가장 큰 값부터 나옴)
import heapq
pq = []
heapq.heappush(pq, (2, 'A')) # 우선순위 2
heapq.heappush(pq, (1, 'B')) # 우선순위 1
print(heapq.heappop(pq)) # 출력: (1, 'B')
| 함수 | 설명 |
|---|---|
heappush(heap, item) | item을 힙에 추가 |
heappop(heap) | 힙에서 최소값 삭제 후 반환 |
heapify(list) | 일반 리스트를 힙으로 변환 |
heapreplace(heap, item) | 최소값 제거하고 item 삽입 |
heappushpop(heap, item) | item 삽입 후 최소값 제거 |
nlargest(k, iterable) | 가장 큰 k개 반환 |
nsmallest(k, iterable) | 가장 작은 k개 반환 |
| 연산 | 시간 복잡도 |
|---|---|
| 삽입 (heappush) | O(log N) |
| 삭제 (heappop) | O(log N) |
| 최소값 접근 | O(1) |
heapq 같은 모듈 없음 → 힙 구조 직접 구현 필요Max Heap은 따로 설계해야 함구조체 + 비교 함수로 (우선순위, 값) 관리upheap, downheap 연산 구현 필요heapq로 구현 가능 (Min Heap만 지원)