더북(TheBook)

3.3 허프만 코딩

 

 

최소 우선순위 큐가 있으면 이진 트리로 유일 접두어 코드를 만들 수 있다. 이것을 허프만 코드(Huffman code)라고 하는데, 1951년에 데이비드 허프만(David A. Huffman)이 25살 대학원생이었을 때 고안한 방법이다. 허프만 코딩은 기호들의 빈도를 활용하여 정보를 압축하는 효율적인 무손실 압축 시스템이다.

허프만 코딩은 우선순위 큐로 시작하며, 큐의 원소는 이진 트리이다. 이 이진 트리의 리프 노드들은 문자와 텍스트에서 문자의 빈도를 담고 있다. 초기에 각 이진 트리는 리프 노드이면서 루트 노드인 하나의 노드를 갖는다.

단어 ‘effervescence’는 그림 3-5의 첫 번째 행처럼 최솟값이 왼쪽에 있는 우선순위 큐로 시작한다. 큐에서 최소 원소를 두 번 취하는데, 이들은 문자 R과 N에 대한 최소 빈도를 갖는 두 개의 단일 노드 트리다. 그다음 우선순위 큐에서 꺼내 온 두 개의 트리를 자식으로 하는 새로운 루트 노드의 이진 트리를 생성한다. 새로운 트리의 루트는 문자 R과 N의 빈도 합을 빈도로 가지며 두 문자의 결합 빈도를 나타낸다. 그림 3-5의 두 번째 줄을 보면 새로 생성된 트리를 큐에 넣고, 세 번째 줄에서 다음 두 노드인 V와 S에 같은 작업을 수행한다. 그리고 네 번째 줄에서 이전 단계에서 생성한 두 개의 트리를 결합하여, R, N, S, V 네 개의 노드를 갖는 하나의 트리를 생성한다. 이러한 작업을 모든 노드가 하나의 트리에 놓일 때까지 진행한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.