Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

데이터 구조의 허프만 트리(Huffman Tree) — 개념부터 예제까지 완벽 정리

허프만 트리란 무엇인가?

허프만 코딩(Huffman Coding)은 문자마다 코드를 부여하는 기법으로, 코드의 길이가 해당 문자의 상대적 빈도나 가중치에 따라 결정됩니다. 즉, 자주 사용되는 문자에는 짧은 코드를, 드물게 사용되는 문자에는 긴 코드를 할당하여 전체 데이터를 효율적으로 압축할 수 있습니다.

허프만 코드는 가변 길이(variable-length) 방식이며, 접두어가 없는(prefix-free) 특징을 가집니다. 여기서 '접두어 없음'이란 어떤 코드도 다른 코드의 접두어가 되지 않는다는 의미입니다. 덕분에 디코딩 시 코드 사이의 경계를 혼동하지 않고 고유하게 해석할 수 있습니다.

모든 접두어 자유 이진 코드는 인코딩된 문자가 리프(leaf) 노드에 저장된 이진 트리 형태로 표현할 수 있습니다.

허프만 트리의 정의

허프만 트리(Huffman Tree) 또는 허프만 코딩 트리는 다음과 같이 정의됩니다.

  • 주어진 알파벳의 각 문자가 트리의 리프 노드에 대응되는 완전 이진 트리(full binary tree)
  • 최소 외부 경로 가중치(minimum external path weight)를 갖는 이진 트리

여기서 '외부 경로 가중치'란 각 리프의 가중치(빈도)와 루트에서 해당 리프까지의 경로 길이를 곱한 값들의 합을 의미합니다. 따라서 허프만 트리의 목표는 주어진 리프 집합에 대해 가중 경로 길이의 합이 최소가 되는 트리를 구성하는 것입니다.

예제: 문자 빈도표

다음은 8개 문자에 대한 빈도(frequency) 정보입니다.

문자(Letter)zkmcudle
빈도(Frequency)272432374242120

예제: 허프만 코드 결과

위 빈도표를 바탕으로 허프만 트리를 구성하면 다음과 같은 코드가 생성됩니다. 빈도가 가장 높은 'e'는 단 1비트로, 빈도가 가장 낮은 'z'는 6비트로 인코딩되는 것을 확인할 수 있습니다.

문자(Letter)빈도(Freq)코드(Code)비트 수(Bits)
e12001
d421013
l421103
u371003
c3211104
m24111115
k71111016
z21111006

위 예제에 대한 허프만 트리 구조는 아래 그림과 같습니다.

데이터 구조의 허프만 트리(Huffman Tree) — 개념부터 예제까지 완벽 정리

허프만 트리의 핵심 요약

  • 탐욕 알고리즘(Greedy Algorithm) 기반: 매 단계에서 빈도가 가장 작은 두 노드를 선택해 병합합니다.
  • 최적성(Optimality): 허프만 코드는 주어진 문자 빈도에 대해 가장 짧은 평균 코드 길이를 보장하는 최적의 접두어 코드입니다.
  • 활용 분야: ZIP, JPEG, MP3 등 다양한 데이터 압축 기술의 기반 원리로 활용됩니다.