L' articolo di Wikipedia ha una buona descrizione del processo adattivo di codifica Huffman che utilizza una delle notevoli implementazioni, l'algoritmo Vitter. Come hai notato, un codificatore Huffman standard ha accesso alla funzione di massa di probabilità della sua sequenza di input, che utilizza per costruire codifiche efficienti per i valori dei simboli più probabili. Nell'esempio prototipico di compressione di dati basata su file, ad esempio, questa distribuzione di probabilità può essere calcolata istogrammando la sequenza di input, contando il numero di occorrenze di ciascun valore di simbolo (i simboli potrebbero essere sequenze di 1 byte, ad esempio). Questo istogramma viene utilizzato per generare un albero di Huffman, come questo (tratto dall'articolo di Wikipedia):
L'albero è disposto diminuendo peso o probabilità di occorrenza nella sequenza di input; i nodi foglia in alto rappresentano i simboli più probabili, che pertanto ricevono le rappresentazioni più brevi nel flusso di dati compresso. L'albero viene quindi salvato insieme ai dati compressi e successivamente viene utilizzato dal decompressore in seguito per rigenerare nuovamente la sequenza di input (non compressa). Come una delle prime implementazioni del codice entropico, la codifica Huffman standard è abbastanza semplice.
La struttura adattativa del programmatore di Huffman è abbastanza simile; utilizza una rappresentazione simile ad albero delle statistiche della sequenza di input per selezionare codifiche efficienti per ciascun valore del simbolo di input. La differenza principale è che, come implementazione in streaming dell'algoritmo, non è disponibile una conoscenza a priori della funzione di massa di probabilità dell'ingresso; le statistiche della sequenza devono essere stimate al volo. Se si desidera utilizzare lo stesso schema di codifica Huffman, ciò significa che l'albero utilizzato per generare la codifica di ciascun simbolo nel flusso compresso deve essere creato e gestito dinamicamente durante l'elaborazione del flusso di input.
L'algoritmo Vitter è un modo per raggiungere questo obiettivo; man mano che ciascun simbolo di input viene elaborato, l'albero viene aggiornato, mantenendo la sua caratteristica di probabilità ridotta di occorrenza del simbolo mentre si sposta verso il basso l'albero. L'algoritmo definisce un insieme di regole su come l'albero viene aggiornato nel tempo e su come i dati compressi risultanti vengono codificati nel flusso di output. Man mano che la sequenza di input viene consumata, la struttura dell'albero dovrebbe rappresentare una descrizione sempre più accurata della distribuzione di probabilità dell'input. Contrariamente all'approccio di codifica Huffman standard, il decompressore non ha un albero statico da utilizzare per la decodifica; deve svolgere continuamente le stesse funzioni di manutenzione dell'albero durante il processo di decompressione.
In sintesi : il codificatore Huffman adattivo funziona in modo molto simile all'algoritmo standard; tuttavia, anziché una misurazione statica delle statistiche dell'intera sequenza di input (l'albero di Huffman), viene utilizzata una stima dinamica, cumulativa (cioè dal primo simbolo al simbolo corrente) della distribuzione di probabilità della sequenza per codificare (e decodificare) ciascun simbolo . Contrariamente all'approccio di codifica Huffman standard, l'algoritmo Huffman adattivo richiede questa analisi statistica sia sull'encoder che sul decoder.