허프만 코딩에 대해 약간 다른 사고 방식을 살펴 보겠습니다.
확률이 0.5, 0.25 및 0.25 인 세 개의 기호 A, B 및 C의 알파벳이 있다고 가정합니다. 확률은 모두 2의 역 거듭 제곱이기 때문에 최적의 허프만 코드가 있습니다 (즉, 산술 코딩과 동일 함). 이 예제에서는 표준 코드 0, 10, 11을 사용합니다.
상태가 큰 정수라고 가정하면 라고 부릅니다 . 인코딩은 현재 상태와 인코딩 할 심볼을 가져 와서 새로운 상태를 반환하는 함수로 생각할 수 있습니다.에스
인코딩 ( s , A )인코딩 (s,B)인코딩 (S , C)= 2 초= 4 초 + 2= 4 초 + 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에서 이것을 생각할 수 있습니다. 심볼을 인코딩하려면 다음을 수행하십시오.
인코딩 (s, A0)인코딩 (s, A1)인코딩 (s,B)인코딩 (s , C)= 4 초 + 0= 4 초 + 1= 4 초 + 2= 4 초 + 3
ㅏ0ㅏ1
에스
에스'= ⌊ s2⌋
i = s mod 2
인코딩 ( S', A나는)
s = 11에스'= 5나는 = 1인코딩 (5, A1) = 4 × 5 + 1 = 21
이제 이것은 허프만 코딩과 정확히 같은 비트 출력을 생성하지는 않지만 길이가 같은 출력을 생성합니다. 그리고 당신이 볼 수있는 것은 이것도 독창적입니다. 심볼을 디코딩하기 위해 4로 나눌 때 나머지를 취합니다. 값이 2 또는 3이면 심볼은 각각 B 또는 C입니다. 0 또는 1 인 경우 기호는 A이며 상태에 2를 곱하고 0 또는 1을 더하여 정보 비트를 다시 넣을 수 있습니다.
이 접근법의 좋은 점은 확률의 분자 및 / 또는 분모가 2의 거듭 제곱이 아닌 경우 자연스럽게 분수 비트 인코딩으로 확장된다는 것입니다. A의 확률이 두 개의 기호 A와 B가 있다고 가정합니다.삼525
인코딩 (s, A0)인코딩 (s, A1)인코딩 (s, A2)인코딩 (s, B0)인코딩 (s, B1)= 5 초 + 0= 5 초 + 1= 5 초 + 2= 5 초 + 3= 5 초 + 4
에스'= ⌊ s삼⌋i = s mod 3인코딩 ( S', A나는)
이것은 산술 코딩과 같습니다. 실제로 비대칭 수치 시스템 (Asymmetric Numeral Systems) 으로 알려진 방법 군이며 , 지난 몇 년 동안 Jarek Duda에 의해 개발되었습니다. 이름의 의미는 분명해야합니다. 확률 로 기호를 인코딩하려면pq
이것이 코딩 방법의 계열 인 이유는 여기에서 본 것이 비현실적이기 때문입니다. 상태 변수를 효율적으로 조작하기 위해 무한 정수를 가지고 있지 않다는 사실을 처리하기 위해 약간의 수정이 필요하며이를 달성 할 수있는 다양한 방법이 있습니다. 물론 산술 코딩은 상태의 정밀도와 비슷한 문제가 있습니다.
실제 변형에는 rANS ( "r"은 "비율"을 의미) 및 tANS ( "테이블 기반")가 포함됩니다.
ANS는 실제와 이론 모두 산술 코딩에 비해 몇 가지 흥미로운 장점이 있습니다.
- 산술 코딩과 달리 "상태"는 단어 쌍이 아닌 단일 단어입니다.
- 뿐만 아니라 ANS 인코더와 해당 디코더의 상태 는 동일 하며 동작은 완전히 대칭입니다. 이것은 다른 스트림의 인코딩 된 심볼을 인터리브 할 수 있고 모든 것이 완벽하게 동기화 되는 것과 같은 흥미로운 가능성을 높 입니다.
- 실제적인 구현은 물론 정보를 "출력"해야하며, 마지막에 쓰여질 큰 정수로 정보를 수집하는 것이 아닙니다. 그러나 "보통"크기는 압축 손실에 대한 대가로 구성 할 수 있습니다. 따라서 산술 코더가 한 번에 비트를 출력해야하는 경우 ANS는 한 번에 바이트 또는 니블을 출력 할 수 있습니다. 이것은 속도와 압축 사이의 직접적인 균형을 제공합니다.
- 이진 산술 코딩만큼 현재 세대 하드웨어에서 빠르기 때문에 Huffman 코딩과 경쟁이 치열합니다. 이는 대 알파벳 산술 코딩 및 그 변형 (예 : 범위 코딩)보다 훨씬 빠릅니다.
- 특허가없는 것 같습니다.
나는 다시 산술 코딩을 할 것이라고 생각하지 않습니다.