허프만 코딩 예제

n-ary Huffman 알고리즘은 {0, 1, … … n − 1} 알파벳을 사용하여 메시지를 인코딩하고 n-ary 트리를 작성합니다. 이 방법은 허프만이 원래 논문에서 고려했습니다. 동일한 알고리즘은 이진 (n 은 2 와 동등한) 코드에 대해 적용되며, n 최소 가능한 기호가 2 개의 가장 가능성이 낮은 기호가 대신 함께 가져온다는 점을 제외하면. n보다 큰 n의 경우 모든 소스 단어 집합이 Huffman 코딩을 위한 n-ary 트리를 제대로 형성할 수 있는 것은 아닙니다. 이러한 경우 0-확률 장소 홀더를 추가해야 합니다. 이는 트리가 n대 1 계약자를 형성해야 하기 때문입니다. 바이너리 코딩의 경우, 이것은 2 대 1 계약자이며, 모든 크기의 세트는 그러한 계약자를 형성 할 수 있습니다.

소스 단어의 수가 1 modulo n-1에 일치하면 소스 단어 집합이 적절한 허프맨 트리를 형성합니다. Huffman 코딩을 사용하는 동안 이 특정 비효율성을 해결하려면 두 가지 관련 접근 방식이 있습니다. 고정된 수의 심볼(“차단”)을 결합하면 압축이 증가하는 경우가 많습니다. 블록의 크기가 무한대에 가까워지면 허프만코딩은 이론적으로 엔트로피 한계, 즉 최적의 압축에 접근합니다. 그러나 허프맨 코드의 복잡성은 인코딩할 수 있는 가능성의 수에 선형이기 때문에 임의로 큰 기호 그룹을 차단하는 것은 실용적이지 않습니다. 이렇게 하면 실제로 수행되는 차단 의 양이 제한됩니다. 일반적으로 코드워드 길이의 차이를 최소화하는 것이 좋습니다. 예를 들어 Huffman 인코딩된 데이터를 수신하는 통신 버퍼는 트리가 특히 불균형한 경우 특히 긴 기호를 처리하려면 더 커야 할 수 있습니다.

분산을 최소화하려면 첫 번째 큐에서 항목을 선택하여 큐 간의 관계를 끊기만 하면 됩니다. 이 수정은 분산을 최소화하고 가장 긴 문자 코드의 길이를 최소화하면서 허프만 코딩의 수학적 최적성을 유지합니다. Huffman 코딩은 각 기호에 대한 표현을 선택하기 위한 특정 메서드를 사용하여 접두사 코드(“접두사 없는 코드”라고도 함, 즉 특정 기호를 나타내는 비트 문자열은 비트 문자열의 접두사가 아닙니다. 다른 기호)를 참조하십시오. 허프만 코딩은 “허프만 코드”라는 용어가 허프만의 알고리즘에 의해 생성되지 않은 경우에도 “접두사 코드”의 동의어로 널리 사용되는 접두사 코드를 만드는 광범위한 방법입니다. 일반적으로 압축 해제 프로세스는 일반적으로 각 비트가 입력 스트림에서 읽을 때 Huffman 트리 노드를 노드별로 통과하여 접두사 코드 스트림을 개별 바이트 값으로 변환하는 것입니다(리프 노드에 반드시 도달). 해당 바이트 값에 대한 검색을 종료합니다). 그러나 이 작업을 수행하려면 먼저 허프만 나무를 어떻게든 재구성해야 합니다. 문자 주파수를 상당히 예측할 수 있는 가장 간단한 경우 트리를 미리 구성할 수 있으며(각 압축 주기에서 통계적으로 조정) 매번 재사용할 수 있으며, 최소한 어느 정도의 압축 효율을 희생해야 합니다. 그렇지 않으면 트리를 재구성하는 정보를 사전에 보내야 합니다. 순진한 방법은 압축 스트림에 각 문자의 주파수 수를 준비하는 것입니다.

안타깝게도 이러한 경우 오버헤드는 몇 킬로바이트에 달할 수 있으므로 이 방법은 실용적이지 않습니다. 표준 인코딩을 사용하여 데이터를 압축하는 경우 압축 모델은 B 2 B {디스플레이 스타일 B2^{B}} 비트(B {displaystyle B}가 기호당 비트 수인 경우)로 정확하게 재구성할 수 있습니다. 또 다른 방법은 단순히 출력 스트림에 비트씩 허프만 트리를 프레우딩하는 것입니다. 예를 들어 값이 0이 부모 노드와 1 리프 노드를 나타낸다고 가정하면 트리 빌드 루틴이 발생할 때마다 다음 8비트를 읽으면 특정 리프의 문자 값을 결정합니다. 마지막 리프 노드에 도달할 때까지 프로세스가 재귀적으로 계속됩니다. 그 시점에서, 허프만 나무는 충실하게 재건 될 것입니다.

About the author: mcadmin