Search
🙈

우선 순위 큐와 힙

Intro::

우선순위 큐와 힙에 대한 정리입니다.

우선순위 큐

정의: 가장 높은 우선순위 항목을 먼저 꺼내는 추상 자료구조입니다.
동작: 삽입(insert) 시 우선순위를 함께 지정하고, 삭제(remove) 시 우선순위가 가장 높은 항목을 반환합니다.

정의: 완전 이진 트리 형태로 구현한 배열 기반 자료구조입니다.
동작: 부모 노드의 값이 자식 노드의 값보다 크거나(최대 힙) 작도록(최소 힙) 유지합니다. 이 성질 덕분에 루트(root) 노드에 최대값 또는 최소값이 위치합니다.

차이점

구분
우선순위 큐
자료구조 유형
추상(어떤 방식으로든 구현 가능)
구체적(완전 이진 트리 배열 구현)
인터페이스
offer, poll, peek 등 제공
배열과 인덱스 연산으로 직접 구현
시간 복잡도
일반적으로 O(log n) (힙 기반 구현)
삽입·삭제·최댓값/최솟값 조회 O(log n)
사용 예시
작업 스케줄링, 다익스트라 최단경로
힙 정렬, 우선순위 큐 내부 구현
요약: 우선순위 큐는 ‘무엇을 할 수 있는지’를, 힙은 ‘어떻게 구현했는지’를 말합니다.

우선순위 큐 사용 예시

import java.util.PriorityQueue; public class PriorityQueueExample { public static void main(String[] args) { // 숫자가 작을수록 우선순위가 높음(최소 힙) PriorityQueue<String> pq = new PriorityQueue<>( (a, b) -> Integer.compare(getPriority(a), getPriority(b)) ); pq.offer("작업A: 우선순위 2"); // 우선순위 2 pq.offer("작업B: 우선순위 1"); // 우선순위 1 pq.offer("작업C: 우선순위 3"); // 우선순위 3 // 우선순위가 가장 높은 항목(숫자 1)부터 꺼냄 while (!pq.isEmpty()) { System.out.println(pq.poll()); } } private static int getPriority(String task) { // 문자열 끝 숫자로 우선순위를 판단 return Integer.parseInt(task.substring(task.length() - 1)); } }
Java
복사
PriorityQueue 클래스는 내부적으로 힙(완전 이진 트리 배열)을 사용해 구현됩니다.

최소 힙 직접 구현 예시

public class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity + 1]; // 1번 인덱스부터 사용 size = 0; } // 삽입 public void add(int value) { heap[++size] = value; int cur = size; while (cur > 1 && heap[cur] < heap[cur / 2]) { swap(cur, cur / 2); cur /= 2; } } // 삭제(최솟값 반환) public int poll() { if (size == 0) return -1; int min = heap[1]; heap[1] = heap[size--]; heapify(1); return min; } private void heapify(int idx) { int smallest = idx; int left = idx * 2; int right = idx * 2 + 1; if (left <= size && heap[left] < heap[smallest]) { smallest = left; } if (right <= size && heap[right] < heap[smallest]) { smallest = right; } if (smallest != idx) { swap(idx, smallest); heapify(smallest); } } private void swap(int i, int j) { int tmp = heap[i]; heap[i] = heap[j]; heap[j] = tmp; } public static void main(String[] args) { MinHeap heap = new MinHeap(10); heap.add(5); heap.add(2); heap.add(8); System.out.println(heap.poll()); // 2 System.out.println(heap.poll()); // 5 } }
Java
복사
배열 인덱스 연산을 통해 부모·자식 관계를 유지하며 힙 속성을 관리합니다.

References::