Skip to content

문제 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를 탐욕적으로 만든다.

  1. 각 문자를 빈도를 가중치로 하는 리프 노드로 만들어 최소 우선순위 큐에 넣는다.
  2. 가장 작은 두 노드를 꺼내, 둘을 자식으로 하고 가중치를 두 값의 합으로 하는 새 내부 노드를 만들어 다시 큐에 넣는다.
  3. 노드가 하나 남을 때까지 반복한다. 그 노드가 루트다.
  4. 왼쪽 간선을 0, 오른쪽 간선을 1 로 두면, 각 리프까지의 경로가 그 문자의 코드가 된다.

병합 과정 (빈도: e1, d2, f8, g12, b13, a19, c24, 합 79)

단계꺼낸 두 노드합친 가중치
1e(1), d(2)3
2(ed)3, f(8)11
3(edf)11, g(12)23
4b(13), a(19)32
5(edfg)23, c(24)47
6(ba)32, 4779

허프만 트리와 코드 (왼쪽=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
문자빈도코드길이
b13002
a19012
c24112
g121013
f810014
e1100005
d2100015

압축 후 총 비트 수(가중 경로 길이)는 내부 노드 가중치의 합과 같다.

총 비트=132+192+242+123+84+15+25=195 bit

(같은 가중치를 꺼내는 순서에 따라 코드 모양은 달라질 수 있으나, 총 비트 수 195는 최적으로 항상 동일하다. 고정 길이 3비트라면 79×3=237 비트이므로 절약된다.)

👉 실습(C++)에서 확인하기

PDF