원소마다 우선순위가 있고, 들어온 순서와 상관없이 우선순위가 가장 높은 것부터 꺼내는 추상 자료형(Abstract Data Type, ADT). 같은 우선순위끼리의 순서는 보장하지 않는다. 응급실 대기 순서가 좋은 비유다.
구현 방법
- 정렬 안 된 배열: 넣기는
O(1)이지만 꺼낼 때마다 전체를 훑어O(n) - 이진 힙: 넣기·꺼내기 모두
O(log n). 표준 구현이다. 보통 최소 힙을 쓰고 "숫자가 작을수록 우선순위가 높다"로 정한다
type Item<T> = { value: T; priority: number }
// 최소 힙: 부모의 priority가 자식보다 작거나 같다
// enqueue: 끝에 넣고 bubble up / dequeue: 루트를 꺼내고 마지막을 루트로 올려 sink down어디에 쓰나
- 다익스트라 최단 경로: 아직 확정되지 않은 노드 중 거리가 가장 짧은 것을 꺼낸다
- 작업 스케줄러: 운영체제 프로세스 스케줄링, React가 업데이트에 우선순위(레인, Lane)를 매겨 급한 입력부터 처리하는 것도 같은 생각이다(동시성 렌더링)
- 상위 k개 구하기, 이벤트 시뮬레이션, 허프만 코딩(Huffman Coding)
언어마다 내장 여부가 다르다. 파이썬은 heapq, 자바는 PriorityQueue가 있지만 JavaScript에는 내장이 없어 직접 만들거나 라이브러리를 쓴다. 도착 순서대로 꺼내는 보통의 큐와 비교해 보면 차이가 분명하다.