Diamo un'occhiata a un modo leggermente diverso di pensare alla codifica di Huffman.
Supponiamo di avere un alfabeto di tre simboli, A, B e C, con probabilità 0,5, 0,25 e 0,25. Poiché le probabilità sono tutte potenze inverse di due, questo ha un codice Huffman che è ottimale (cioè è identico alla codifica aritmetica). Useremo il codice canonico 0, 10, 11 per questo esempio.
Supponiamo che il nostro stato sia un intero di grandi dimensioni, che chiameremo . Puoi pensare alla codifica come una funzione che accetta lo stato corrente e un simbolo per codificare e restituisce il nuovo stato:S
codifica ( s , A )codifica (s,B)codifica (s,C)= 2 s= 4 s + 2= 4 s + 3
Quindi cominciamo con lo stato 11 (che è 1011 in binario), codificate il simbolo B. Il nuovo stato è 46, che è 101110 in binario. Come puoi vedere, questo è lo stato "vecchio" con la sequenza 10 aggiunta alla fine. Abbiamo essenzialmente "emesso" la sequenza di bit 10.
Fin qui tutto bene.
Ora pensa per un momento a come funziona la codifica aritmetica. Se metti le probabilità su un comune denominatore, il simbolo A rappresenta effettivamente l'intervallo , il simbolo B rappresenta l'intervallo[2[ 04, 24)e il simbolo C rappresenta l'intervallo[3[ 24, 34).[ 34, 44)
Fondamentalmente quello che stiamo facendo qui è moltiplicare tutto per il comune denominatore. Immagina che lo stato fosse effettivamente nella base 4. La codifica di un simbolo B sta davvero emettendo la cifra 2 in quella base, e la codifica di un simbolo C sta emettendo la cifra 3 in quella base.
Tuttavia, il simbolo A è leggermente diverso, poiché non è una cifra intera nella base 4.
Invece, possiamo pensare all'alfabeto come l'insieme dei simboli A_0, A_1, B, C, con uguale probabilità. Questo, ancora una volta, ha un codice Huffman ottimale 00, 01, 10, 11. O, ancora, possiamo pensarlo in base 4. Per codificare un simbolo, facciamo semplicemente:
codifica (s, A0)codifica (s, A1)codifica (s,B)codifica (s,C)= 4 s + 0= 4 s + 1= 4 s + 2= 4 s + 3
UN0UN1
S
S'= ⌊ s2⌋
i = s mod 2
encode(s′,Ai)
s=11s′=5i = 1codificare (5, A1) = 4 × 5 + 1 = 21
Questo non produce esattamente lo stesso bit output della codifica Huffman, ma genera un output che ha la stessa lunghezza. E quello che spero che possiate vedere è che anche questo è unicamente decodificabile. Per decodificare un simbolo, prendiamo il resto quando diviso per 4. Se il valore è 2 o 3, allora il simbolo è rispettivamente B o C. Se è 0 o 1, il simbolo è A, quindi possiamo riportare il bit di informazione moltiplicando lo stato per 2 e aggiungendo 0 o 1.
3525
codifica (s, A0)codifica (s, A1)codifica (s, A2)codifica (s, B0)codifica (s, B1)= 5 s + 0= 5 s + 1= 5 s + 2= 5 s + 3= 5 s + 4
S'= ⌊ s3⌋i = s mod 3codificare ( s', Aio)
pq
Il motivo per cui è una famiglia di metodi di codifica è che ciò che abbiamo visto qui non è pratico da solo; ha bisogno di alcune modifiche per far fronte al fatto che probabilmente non hai numeri interi a precisione infinita per manipolare la variabile di stato in modo efficiente e ci sono vari modi per raggiungere questo obiettivo. La codifica aritmetica, ovviamente, ha un problema simile con precisione per il suo stato.
Le varianti pratiche includono rANS ("r" significa "rapporto") e tANS ("guidato dalla tabella").
ANS presenta alcuni vantaggi interessanti rispetto alla codifica aritmetica, sia pratica che teorica:
- A differenza della codifica aritmetica, lo "stato" è una singola parola, piuttosto che una coppia di parole.
- Non solo, ma un codificatore ANS e il relativo decodificatore hanno stati identici e le loro operazioni sono completamente simmetriche. Ciò solleva alcune possibilità interessanti, come ad esempio che puoi intercalare diversi flussi di simboli codificati e tutto si sincronizza perfettamente.
- Le implementazioni pratiche devono, ovviamente, "produrre" informazioni man mano che procedi, e non solo raccoglierle in un intero grande da scrivere alla fine. Tuttavia, la dimensione dell '"output" può essere configurata in cambio di una perdita di compressione (generalmente modesta). Pertanto, laddove i programmatori aritmetici devono emettere un po 'alla volta, ANS può emettere un byte o un nybble alla volta. Questo ti dà un compromesso diretto tra velocità e compressione.
- Sembra essere veloce tanto quanto l'hardware di generazione attuale quanto la codifica aritmetica binaria, e quindi competitivo con la codifica Huffman. Ciò lo rende molto più veloce della codifica aritmetica a caratteri alfabetici di grandi dimensioni e delle sue varianti (ad es. Codifica di intervallo).
- Sembra essere privo di brevetti.
Non credo che farò mai più codifica aritmetica.