허프만 코딩과 산술 코딩의 일반화가 있습니까?


11

허프만 코딩, 산술 코딩 및 범위 코딩 간의 관계를 이해하려고 노력하면서 허프만 코딩의 단점이 소수 비트 패킹 문제와 관련이 있다고 생각하기 시작했습니다 .

즉, 기호에 대해 240 개의 가능한 값이 있고이를 비트로 인코딩해야한다고 가정하면 8은 256 개의 가능한 값을 표현할 수 있기 때문에 "전체"8이 필요하지 않더라도 기호 당 8 비트가 멈출 것입니다. 기호 당. 이 문제에 대한 해결책은 내가 곱셈을 사용하여 2의 비 승수로 "비트 시프트"할 수있는 "프랙 셔널 비트 패킹"이라고하는 것입니다. 그냥 힘 - 중 - 두의 곱셈과 같이 전환하고 x * 2 == x << 1그리고 x * 4 == x << 2너무 너무 당신이 분수 비트 크기의 문자에 비 전력의-2 대신에 곱하여과 "변화"와 팩 수 있으며,이 모든 힘과 등등 .

이 문제는 허프만 코딩과 유사합니다. 길이에 따라 분수가 아닌 비트 크기 여야하는 코드가 생겨 패킹 효율이 떨어집니다. 그러나이 솔루션은 고정 크기의 심볼을 가정하기 때문에 fracitonal-bit-packing 솔루션을 사용할 수는 없습니다.

문제는 산술 코딩과 비슷한 것을 달성하기 위해 분수 비트 패킹과 유사한 아이디어로 허프만 코딩을 개선 할 논문이나 솔루션이 있습니까? (또는 반대로 결과).


1
산술 코딩은 이미 최적입니다. 개선 할 필요가 없습니다.
Yuval Filmus

@YuvalFilmus 예, 허프만 코딩을 개선하여 산술 코딩과 동등하게 만드는 방법을 의미했습니다.
Realz Slaw

1
제안과 마찬가지로, 비대칭 수치 시스템 (ANS) 코딩은 산술 코딩보다 이해하기 쉽습니다. 특히, 특정 공식을 "분획 비트 패킹"으로 보는 것이 조금 더 쉽습니다.
가명

@Pseudonym rANS와 Huffman Coding 사이를 연결하는 것으로 보이는 이 페이지 를 찾았습니다 . 나는 그것을 이해한다고 말할 수는 없지만 충분하다고 생각합니다. 당신이 의견에 답변을한다면 나는 받아 들일 것이다.
Realz Slaw

@YuvalFilmus 나는 산술 코딩에 개선이 필요했고 ANS가 개선 되었으면 좋겠다.
가명

답변:


13

허프만 코딩에 대해 약간 다른 사고 방식을 살펴 보겠습니다.

확률이 0.5, 0.25 및 0.25 인 세 개의 기호 A, B 및 C의 알파벳이 있다고 가정합니다. 확률은 모두 2의 역 거듭 제곱이기 때문에 최적의 허프만 코드가 있습니다 (즉, 산술 코딩과 동일 함). 이 예제에서는 표준 코드 0, 10, 11을 사용합니다.

상태가 큰 정수라고 가정하면 라고 부릅니다 . 인코딩은 현재 상태와 인코딩 할 심볼을 가져 와서 새로운 상태를 반환하는 함수로 생각할 수 있습니다.s

encode(s,A)=2sencode(s,B)=4s+2encode(s,C)=4s+3

이제 상태 11 (2 진에서 1011)로 시작하여 기호 B를 인코딩합니다. 새로운 상태는 46, 2 진에서 101110입니다. 보다시피, 이것은 시퀀스 10이 끝에 추가 된 "오래된"상태입니다. 비트 시퀀스 10을 본질적으로 "출력"합니다.

여태까지는 그런대로 잘됐다.

이제 산술 코딩의 작동 방식에 대해 잠시 생각해보십시오. 확률을 공통 분모로 옮길 경우 기호 A는 실제로 에서, 기호 B는 범위[2를나타냄[04,24)및 기호 C는 범위[3을나타냄[24,34).[34,44)

기본적으로 우리가하고있는 일은 모든 분모에 공통 분모를 곱하는 것입니다. 상태가 실제로베이스 4에 있다고 상상해보십시오. 심볼 B를 인코딩하면 실제로 해당베이스의 숫자 2가 출력되고 심볼 C를 인코딩하면 해당베이스의 숫자 3이 출력됩니다.

그러나 기호 A는 기본 4의 전체 숫자가 아니기 때문에 약간 다릅니다.

대신, 알파벳을 동일한 확률로 기호 A_0, A_1, B, C 세트로 생각할 수 있습니다. 이것은 다시 최적의 허프만 코드 00, 01, 10, 11을 갖습니다. 또는 다시베이스 4에서 이것을 생각할 수 있습니다. 심볼을 인코딩하려면 다음을 수행하십시오.

encode(s,A0)=4s+0encode(s,A1)=4s+1encode(s,B)=4s+2encode(s,C)=4s+3

A0A1

s

s=s2
i=smod2

encode(s,Ai)

s=11s=5i=1encode(5,A1)=4×5+1=21

이제 이것은 허프만 코딩과 정확히 같은 비트 출력을 생성하지는 않지만 길이가 같은 출력을 생성합니다. 그리고 당신이 볼 수있는 것은 이것도 독창적입니다. 심볼을 디코딩하기 위해 4로 나눌 때 나머지를 취합니다. 값이 2 또는 3이면 심볼은 각각 B 또는 C입니다. 0 또는 1 인 경우 기호는 A이며 상태에 2를 곱하고 0 또는 1을 더하여 정보 비트를 다시 넣을 수 있습니다.

이 접근법의 좋은 점은 확률의 분자 및 / 또는 분모가 2의 거듭 제곱이 아닌 경우 자연스럽게 분수 비트 인코딩으로 확장된다는 것입니다. A의 확률이 두 개의 기호 A와 B가 있다고 가정합니다.3525

encode(s,A0)=5s+0encode(s,A1)=5s+1encode(s,A2)=5s+2encode(s,B0)=5s+3encode(s,B1)=5s+4

s=s3i=smod3encode(s,Ai)

이것은 산술 코딩과 같습니다. 실제로 비대칭 수치 시스템 (Asymmetric Numeral Systems) 으로 알려진 방법 군이며 , 지난 몇 년 동안 Jarek Duda에 의해 개발되었습니다. 이름의 의미는 분명해야합니다. 확률 로 기호를 인코딩하려면pq

이것이 코딩 방법의 계열 인 이유는 여기에서 본 것이 비현실적이기 때문입니다. 상태 변수를 효율적으로 조작하기 위해 무한 정수를 가지고 있지 않다는 사실을 처리하기 위해 약간의 수정이 필요하며이를 달성 할 수있는 다양한 방법이 있습니다. 물론 산술 코딩은 상태의 정밀도와 비슷한 문제가 있습니다.

실제 변형에는 rANS ( "r"은 "비율"을 의미) 및 tANS ( "테이블 기반")가 포함됩니다.

ANS는 실제와 이론 모두 산술 코딩에 비해 몇 가지 흥미로운 장점이 있습니다.

  • 산술 코딩과 달리 "상태"는 단어 쌍이 아닌 단일 단어입니다.
  • 뿐만 아니라 ANS 인코더와 해당 디코더의 상태 는 동일 하며 동작은 완전히 대칭입니다. 이것은 다른 스트림의 인코딩 된 심볼을 인터리브 할 수 있고 모든 것이 완벽하게 동기화 되는 것과 같은 흥미로운 가능성을 높 입니다.
  • 실제적인 구현은 물론 정보를 "출력"해야하며, 마지막에 쓰여질 큰 정수로 정보를 수집하는 것이 아닙니다. 그러나 "보통"크기는 압축 손실에 대한 대가로 구성 할 수 있습니다. 따라서 산술 코더가 한 번에 비트를 출력해야하는 경우 ANS는 한 번에 바이트 또는 니블을 출력 할 수 있습니다. 이것은 속도와 압축 사이의 직접적인 균형을 제공합니다.
  • 이진 산술 코딩만큼 현재 세대 하드웨어에서 빠르기 때문에 Huffman 코딩과 경쟁이 치열합니다. 이는 대 알파벳 산술 코딩 및 그 변형 (예 : 범위 코딩)보다 훨씬 빠릅니다.
  • 특허가없는 것 같습니다.

나는 다시 산술 코딩을 할 것이라고 생각하지 않습니다.


4
지금까지 내가 본 ANS 인코딩에 대한 가장 명확한 설명입니다.
Michael Deardeuff 23시 47 분

2

간단한 예를 들어, 각각 1/3 1/3의 확률로 3 개의 심볼이있는 경우 최적의 허프만 인코딩은 평균 5/3 비트의 비트 3, 0, 10 및 11을 사용합니다.

원래 심볼 중 5 개를 연결하여 생성 된 243 개의 심볼이 있으며 각각은 확률 1/243입니다. 1/256에 훨씬 가깝습니다. 최적의 허프만 인코딩은 그룹당 평균 7.9465 비트 또는 원래 심볼 당 1.5893 비트에 대해 7 비트에서 7 비트로 230 개 그룹을 230 비트 그룹으로 인코딩하며, 원래 허프만 코딩에서 1.6667 비트에서 1.5850으로 감소했습니다. 비트.

이론적으로는 두 개의 심볼을 각각 하나의 더 큰 심볼로 결합하거나 세 개의 심볼을 각각 하나의 더 큰 심볼로 결합하고 Hufman 코딩을 조합에 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.