힙 = 우선순위 큐의 대표 구현
일반 큐: FIFO (선입선출)
우선순위 큐: 우선순위 높은 것 먼저!
활용:
- 작업 스케줄링 (우선순위별)
- 다익스트라 최단경로
- 허프만 코딩 (압축)
- 이벤트 시뮬레이션
힙 정렬
1) 최대 힙 구성: O(N)
2) 루트(최댓값)를 꺼내서 뒤에 배치
3) 힙 재구성
4) 반복 → O(N log N) 정렬
비교
힙 정렬
퀵 정렬
시간
O(N log N)
O(N log N) 평균
최악
O(N log N)
O(N²)
공간
O(1)
O(log N)
안정성
불안정
불안정
캐시
나쁨
좋음
면접에서 이렇게 나옵니다
Q.힙의 구조와 특성을 설명해주세요.
완전 이진 트리이면서 부모와 자식 사이에 크기 관계가 있는 구조입니다.
조건
내용
모양
완전 이진 트리. 위에서 아래로, 왼쪽부터 빈틈없이 채운다
순서
부모가 자식보다 작다(최소 힙) 또는 크다(최대 힙)
형제 사이에는 순서가 없습니다. 그래서 전체 정렬은 아니고 뿌리가 최솟값(또는 최댓값)이라는 것만 보장합니다.
연산
복잡도
최솟값 확인
O(1)
삽입
O(log n)
최솟값 제거
O(log n)
임의 값 탐색
O(n)
모양이 완전 이진 트리라는 점이 중요합니다. 그래서 포인터 없이 배열로 담을 수 있고 높이가 항상 log n 입니다.
흔한 실수: 힙을 정렬된 구조로 설명하는 것. 배열로 출력하면 정렬되어 있지 않습니다. 정렬을 얻으려면 하나씩 꺼내야 하고 그것이 힙 정렬입니다.
Q.힙에서 삽입과 삭제는 어떻게 동작하나요?
완전 이진 트리 모양을 유지한 채로 규칙에 맞는 자리까지 옮깁니다.
삽입
1. 맨 마지막 자리에 넣는다 (모양 유지)
2. 부모와 비교해 더 작으면 자리를 바꾼다
3. 규칙을 만족할 때까지 위로 올린다
삭제 (최솟값 제거)
1. 뿌리를 꺼낸다
2. 마지막 원소를 뿌리로 옮긴다 (모양 유지)
3. 두 자식 중 작은 쪽과 비교해 필요하면 바꾼다
4. 아래로 내려가며 반복한다
둘 다 높이만큼만 움직이므로 O(log n)입니다.
흔한 실수: 삭제할 때 두 자식 중 아무 쪽과 비교하는 것. 더 작은 자식과 바꿔야 새 부모가 두 자식보다 작아집니다. 큰 쪽과 바꾸면 규칙이 다시 깨집니다.
Q.힙을 배열로 구현하는 방법과 인덱스 공식은?
완전 이진 트리라서 빈틈이 없고, 위에서 아래로 왼쪽부터 번호를 매기면 배열 인덱스가 됩니다.