Examinons une façon légèrement différente de penser le codage Huffman.
Supposons que vous ayez un alphabet de trois symboles, A, B et C, avec des probabilités de 0,5, 0,25 et 0,25. Parce que les probabilités sont toutes des puissances inverses de deux, cela a un code de Huffman qui est optimal (c'est-à-dire qu'il est identique au codage arithmétique). Nous utiliserons le code canonique 0, 10, 11 pour cet exemple.
Supposons que notre état soit un grand entier, que nous appellerons . Vous pouvez penser à l'encodage comme une fonction qui prend l'état actuel, et un symbole à encoder, et retourne le nouvel état:s
encoder ( s , A )encoder (s,B)encoder (s,C)= 2 s= 4 s + 2= 4 s + 3
Commençons donc par l'état 11 (qui est 1011 en binaire), encodons le symbole B. Le nouvel état est 46, qui est 101110 en binaire. Comme vous pouvez le voir, c'est "l'ancien" état avec la séquence 10 ajoutée à la fin. Nous avons essentiellement "sorti" la séquence de bits 10.
Jusqu'ici tout va bien.
Réfléchissez maintenant un instant au fonctionnement du codage arithmétique. Si vous placez les probabilités sur un dénominateur commun, le symbole A représente en fait la plage , le symbole B représente la plage[2[ 04, 24)et le symbole C représente la plage[3[ 24, 34).[ 34, 44)
Fondamentalement, ce que nous faisons ici est de tout multiplier par le dénominateur commun. Imaginez que l'état était en fait dans la base 4. L'encodage d'un symbole B génère réellement le chiffre 2 dans cette base, et l'encodage d'un symbole C génère le chiffre 3 dans cette base.
Cependant, le symbole A est un peu différent, car il ne s'agit pas d'un chiffre entier dans la base 4.
Au lieu de cela, nous pouvons considérer l'alphabet comme l'ensemble des symboles A_0, A_1, B, C, avec une probabilité égale. Ceci, encore une fois, a un code Huffman optimal 00, 01, 10, 11. Ou, encore une fois, nous pouvons penser à cela dans la base 4. Pour coder un symbole, nous faisons simplement:
encoder (s, A0)encoder (s, A1)encoder (s,B)encoder (s,C)= 4 s + 0= 4 s + 1= 4 s + 2= 4 s + 3
UNE0UNE1
s
s′= ⌊ s2⌋
i = s mod 2
encoder ( s′, Aje)
s = 11s′= 5i = 1encoder (5, A1) = 4 × 5 + 1 = 21
Maintenant, cela ne produit pas exactement la même sortie binaire que le codage Huffman, mais cela génère une sortie qui a la même longueur. Et ce que j'espère que vous pouvez voir, c'est que c'est également uniquement décodable. Pour décoder un symbole, nous prenons le reste divisé par 4. Si la valeur est 2 ou 3, alors le symbole est B ou C respectivement. Si c'est 0 ou 1, alors le symbole est A, puis nous pouvons remettre le bit d'information en multipliant l'état par 2 et en ajoutant 0 ou 1.
3525
encode(s,A0)encode(s,A1)encode(s,A2)encode(s,B0)encode(s,B1)=5s+0=5s+1=5s+2=5s+3=5s+4
s′=⌊s3⌋i=smod3encode(s′,Ai)
pq
La raison pour laquelle il s'agit d'une famille de méthodes de codage est que ce que nous avons vu ici n'est pas pratique en soi; il a besoin de quelques modifications pour faire face au fait que vous n'avez probablement pas d'entiers de précision infinie pour manipuler efficacement la variable d'état, et il existe différentes façons d'y parvenir. Le codage arithmétique, bien sûr, a un problème similaire avec la précision de son état.
Les variantes pratiques incluent rANS (le "r" signifie "ratio") et tANS ("piloté par table").
Le SNA présente quelques avantages intéressants par rapport au codage arithmétique, à la fois pratique et théorique:
- Contrairement au codage arithmétique, "l'état" est un seul mot, plutôt qu'une paire de mots.
- Non seulement cela, mais un codeur ANS et son décodeur correspondant ont des états identiques et leurs opérations sont complètement symétriques. Cela soulève des possibilités intéressantes, telles que vous pouvez entrelacer différents flux de symboles codés et tout se synchronise parfaitement.
- Les implémentations pratiques doivent, bien sûr, «produire» des informations au fur et à mesure, et pas seulement les collecter dans un grand entier pour les écrire à la fin. Cependant, la taille de la "sortie" peut être configurée en échange d'une perte de compression (généralement modeste). Ainsi, lorsque les codeurs arithmétiques doivent produire un bit à la fois, ANS peut produire un octet ou un nybble à la fois. Cela vous donne un compromis direct entre la vitesse et la compression.
- Il semble être à peu près aussi rapide sur le matériel de génération actuelle que le codage arithmétique binaire, et donc compétitif avec le codage Huffman. Cela le rend beaucoup plus rapide que le codage arithmétique en gros alphabet et ses variantes (par exemple le codage par plage).
- Il semble être sans brevet.
Je ne pense pas que je vais recommencer le codage arithmétique.