문제 12 · 허프만 코드
문제 12 [4점]
어떤 파일이 총 7개의 문자(a: 19개, b: 13개, c: 24개, d: 2개, e: 1개, f: 8개, g: 12개)를 가지고 있다고 할 때, 이를 압축하고자 한다. 압축 알고리즘 중 하나인 허프만 알고리즘Huffman's algorithm을 서술(2점)하고, 이를 이용하여 구현된 허프만 코드Huffman code를 그리시오(2점).
풀이 및 해설
허프만 알고리즘
자주 나오는 문자에 짧은 코드, 드문 문자에 긴 코드를 주는 접두어 코드prefix code를 탐욕적으로 만든다.
- 각 문자를 빈도를 가중치로 하는 리프 노드로 만들어 최소 우선순위 큐에 넣는다.
- 가장 작은 두 노드를 꺼내, 둘을 자식으로 하고 가중치를 두 값의 합으로 하는 새 내부 노드를 만들어 다시 큐에 넣는다.
- 노드가 하나 남을 때까지 반복한다. 그 노드가 루트다.
- 왼쪽 간선을
0, 오른쪽 간선을1로 두면, 각 리프까지의 경로가 그 문자의 코드가 된다.
병합 과정 (빈도: e1, d2, f8, g12, b13, a19, c24, 합 79)
| 단계 | 꺼낸 두 노드 | 합친 가중치 |
|---|---|---|
| 1 | e(1), d(2) | 3 |
| 2 | (ed)3, f(8) | 11 |
| 3 | (edf)11, g(12) | 23 |
| 4 | b(13), a(19) | 32 |
| 5 | (edfg)23, c(24) | 47 |
| 6 | (ba)32, 47 | 79 |
허프만 트리와 코드 (왼쪽=0, 오른쪽=1)
text
(79)
0/ \1
(32) (47)
0/ \1 0/ \1
b a (23) c
0/ \1
(11) g
0/ \1
(3) f
0/ \1
e d| 문자 | 빈도 | 코드 | 길이 |
|---|---|---|---|
| b | 13 | 00 | 2 |
| a | 19 | 01 | 2 |
| c | 24 | 11 | 2 |
| g | 12 | 101 | 3 |
| f | 8 | 1001 | 4 |
| e | 1 | 10000 | 5 |
| d | 2 | 10001 | 5 |
압축 후 총 비트 수(가중 경로 길이)는 내부 노드 가중치의 합과 같다.
(같은 가중치를 꺼내는 순서에 따라 코드 모양은 달라질 수 있으나, 총 비트 수 195는 최적으로 항상 동일하다. 고정 길이 3비트라면