Come configurare smartphone e PC. Portale informativo
  • casa
  • Windows Phone
  • Codifica aritmetica di una formula. Una panoramica degli algoritmi di compressione senza perdita di dati

Codifica aritmetica di una formula. Una panoramica degli algoritmi di compressione senza perdita di dati

Codifica aritmetica

La codifica aritmetica è una tecnica che consente l'impacchettamento senza perdita di caratteri dell'alfabeto in ingresso, a condizione che la distribuzione di frequenza di questi caratteri sia nota. La codifica aritmetica è ottimale, raggiungendo il limite teorico del rapporto di compressione. Codifica aritmetica: il blocco e il codice di output sono univoci per ciascuno dei possibili messaggi di input; non può essere suddiviso in codici carattere individuali, a differenza dei codici di Huffman, che non sono a blocchi, ad es. ogni lettera dell'alfabeto in ingresso è associata ad un determinato codice in uscita.

Il testo compresso dal codificatore aritmetico è considerato come una frazione binaria dell'intervallo), e l'intervallo per il simbolo di flusso codificato i-esimo come; Avanti Cristo]), compreso 0,341. Enumerando tutto possibili simboli secondo la tabella sopra, troviamo che solo l'intervallo è (fti-j - li-i); Ciao= li.!+ b ■ (ciao.! - li.i); Se ((l t<= value) && (value < Ciao)) rottura; ); DataFile.WriteSymbol (c ^);

dove valore è il numero (frazione) letto dal flusso e Con - caratteri scompattati scritti nel flusso di output. Quando si utilizza un alfabeto di 256 caratteri Cj il ciclo interno richiede molto tempo per essere completato, ma puoi velocizzarlo. Nota che poiché B [c ^ (\ = a; II delit = 10

Primo_qtr - (h 0 + l) / 4; // - 16384

Metà = Primo_qtr * 2; // - 32768

Terzo_qtr - Primo_qtr * 3; // = 49152

bits_to_follow = 0; // Quanti bit cancellare

while (non DataFile.EOFO) (

c = DataFile.ReadSymbol (); // Leggi il simbolo
J= IndicePerSimbolo(i); io++; // Trova il suo indice
li= li.j + b * (h i. 1 - li-x+ l) / delit;
Ciao= li.!+ B;
Primo_qtr = (h 0 + l) / 4; // = 16384

Metà = Primo_qtr * 2; // = 32768

Terzo_qtr = Primo_qtr * 3; // = 49152

valore = CompressedFile.Readl6Bit ();

per (i = l; i< CompressedFile.DataLengthO; i++){

freq = ((valore-2 i. 1 + l) * delitel-l) / (h i. I - 1±. X+ 1) ;

per (j = l; b<=freq; j++); // Поиск символа

li = 1y+ blj-l] * (bi.!- li- u + l) / delitel;

Ciao= Io sono+ b * (h i. 1 - li.!+ l) / delit - 1;

per (;;) (// Opzioni di processo

se (ciao< Half) // переполнения

; // Nient'altro ifdi> = Half) (

2i- = metà; hi- = metà; valore- = metà; )

else if (di> = First_qtr) && (hi< Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

valore + = valore + CompressedFile.ReadBit (); } DataFile.WriteSymbol (c););

L'esercizio. Suggerisci esempi di sequenze compresse dall'algoritmo con i coefficienti massimo e minimo.

Come puoi vedere, stiamo lottando con imprecisioni aritmetiche eseguendo operazioni separate su / e A, in modo sincrono nel compressore e nel decompressore.

Perdita di precisione insignificante (frazioni di percentuale per un file sufficientemente grande) e, di conseguenza, una diminuzione del rapporto di compressione rispetto a algoritmo perfetto si verificano durante l'operazione di divisione, quando le frequenze relative vengono arrotondate all'intero più vicino, quando gli ultimi bit vengono scritti nel file. L'algoritmo può essere accelerato rappresentando le frequenze relative in modo che il divisore sia una potenza di due (cioè, sostituendo la divisione con un'operazione di spostamento bit per bit).

Per stimare il rapporto di compressione mediante l'algoritmo aritmetico di una particolare stringa, è necessario trovare il numero minimo N, tale che la lunghezza dell'intervallo di lavoro quando si comprime l'ultimo carattere della catena sarebbe inferiore a 1/2 ^ .. Questo criterio significa che all'interno del nostro intervallo c'è sicuramente almeno un numero in rappresentazione binaria che dopo N-ro ci saranno solo segni 0. La lunghezza dell'intervallo è facile da leggere, poiché è uguale al prodotto delle probabilità di tutti i simboli.

Considera l'esempio precedente di una stringa di due caratteri l e B con probabilità 253/256 e 3/256. Lunghezza dell'ultimo intervallo di lavoro per una stringa di 256 caratteri un e B con le probabilità indicate uguali. È facile calcolare che la richiesta N = 24 (1/2 24 = 5,96-10 "8), poiché anche 23 dà grande intervallo(2 volte più largo) e 25 non lo è minimo un numero che soddisfi il criterio. È stato mostrato sopra che l'algoritmo di Huffman codifica questa stringa in 256 bit. Cioè, per l'esempio considerato, l'algoritmo aritmetico offre un vantaggio di dieci volte rispetto all'algoritmo di Huffman e richiede meno di 0,1 bit per carattere.

L'esercizio. Calcolare la stima del rapporto di compressione per la linea "COV.KOROBA".

Alcune parole dovrebbero essere dette sull'algoritmo di compressione aritmetica adattiva. La sua idea è ricostruire la tavola delle probabilità b [f] durante l'imballaggio e il disimballaggio immediatamente al ricevimento del carattere successivo. Tale algoritmo non richiede la memorizzazione dei valori delle probabilità dei caratteri nel file di output e, di regola, fornisce un elevato rapporto di compressione. Quindi, ad esempio, un file come 1000 £ 1000 con 1000 b / 1000 (dove il grado indica il numero di ripetizioni di un determinato carattere) l'algoritmo adattivo sarà in grado di comprimere in modo più efficiente rispetto a spendere 2 bit per carattere. L'algoritmo di cui sopra si trasforma semplicemente in uno adattivo. In precedenza, abbiamo salvato la tabella delle gamme su un file, e ora calcoliamo proprio nel corso del compressore e del decompressore, ricalcoliamo le relative frequenze, regolando la tabella delle gamme in base ad esse. È importante che le modifiche alla tabella avvengano nel compressore e nel decompressore in modo sincrono, cioè, ad esempio, dopo codifica catene di lunghezza 100 la tabella degli intervalli dovrebbe essere esattamente la stessa di dopo decodifica catene di lunghezza 100. Questa condizione è facile da soddisfare se si cambia la tabella dopo codifica e decodifica del carattere successivo. Per maggiori dettagli sugli algoritmi adattivi, vedere il cap. 4.

Caratteristiche dell'algoritmo aritmetico:

Rapporto di compressione migliore e peggiore: migliore> 8 (è possibile codificare meno di un bit per simbolo), peggiore - 1.

Pro dell'algoritmo: Fornisce un rapporto di compressione migliore rispetto al ritmo Algo-I Huffman (su dati tipici dell'1-10%).

Caratteristiche: oltre alla codifica di Huffman, non aumenta la dimensione dei dati originali nel peggiore dei casi.

Codifica dell'intervallo

A differenza dell'algoritmo classico, la codifica a intervalli presuppone che si tratti di interi discreti che possono richiedere numero limitato i valori. Come già notato, l'intervallo iniziale nell'aritmetica degli interi è scritto come [OD) o, dove N- numero valori possibili variabile utilizzata per memorizzare i limiti dell'intervallo.

Per comprimere i dati nel modo più efficiente, dobbiamo codificare ogni carattere S tramite -log 2 (Ј) bit, dove F,- frequenza simbolo S. Certo, in pratica, tale precisione è irraggiungibile, ma possiamo per ogni personaggio S assegnare un intervallo di valori in un intervallo , Prev_freq [c], 10);

Risultato

Normalizzazione

Normalizzazione

Normalizzazione

Come già notato, molto spesso non si verifica alcun riporto durante la normalizzazione. Procedendo da ciò, Dmitry Subbotin 1 ha proposto di abbandonare del tutto il trasferimento. Si è scoperto che la perdita di compressione è abbastanza insignificante, nell'ordine di pochi byte. Tuttavia, anche il guadagno di velocità non era molto evidente. Il vantaggio principale di questo approccio è la semplicità e la compattezza del codice. Ecco come appare la funzione di normalizzazione per l'aritmetica a 32 bit:

definire CODEBITS 24

definire TOP (l "CODEBITS)

definire BOTTOM (TOP "8)

definire BIGBYTE (0xFF “(CODEBITS-8))

void encode_normalize (void) (whid (range< BOTTOM) {

if (basso & BIGBYTE == BIGBYTE &&

range + (basso & BOTTOM-1)> = BOTTOM) range = BOTTOM - (basso & BOTTOM-1); output_byte (basso "24); gamma<<=8; low«=8; })

Si può notare che la tempestiva riduzione forzata del valore della dimensione dell'intervallo consente di evitare il trasferimento. Succede

quando il secondo byte più significativo basso è impostato su OxFF e quando il valore della dimensione dell'intervallo viene aggiunto a basso, si verifica un riporto. Questa è la procedura di normalizzazione ottimizzata:

void encode_normalize (void) (while ((low "low + range) } }

void decode_normalize (void) (whid ((basso e basso + intervallo) }

L'esercizio. Applica la codifica spaziata senza interruzioni di riga "mucca. mucca".

Schema di compressione LZW

Codifica Huffman

Codifica di gruppo

Comprimere le immagini

La compressione delle immagini si basa sui principi generali della compressione dei dati. La ridondanza viene eliminata: invece di un gruppo di pixel dello stesso colore, vengono memorizzate le informazioni sul colore e il numero di ripetizioni. Viene utilizzata anche la codifica. Ma il prezzo per questo è l'incompatibilità dei formati di file, il rischio che alcuni programmi non siano in grado di leggere il disegno. Esistono anche file autoestraenti che utilizzano la cosiddetta compressione interna, ad es. lo scanner è incorporato nella struttura del file.

Uno dei metodi di compressione più semplici è la codifica batch o la compressione batch. Un altro nome è "compressione RLE" (codifica run-length). L'idea è che invece di ripetere i pixel, vengono memorizzate informazioni sul colore del punto e sul numero di ripetizioni. La presentazione dei dati ha delle opzioni: prima potrebbe esserci una registrazione sul colore, poi sulla quantità, forse il contrario. Questo crea problemi di riproduzione. Per la maggior parte dei file raster, in particolare per i file fotorealistici, la compressione RLE è inefficace. il numero di pixel ripetuti è piccolo. C'è anche uno spreco di risorse.

La codifica di Huffman è uno schema di compressione generale. L'approccio è stato creato nel 1952 per i file di testo. Ci sono molte opzioni. L'idea principale è assegnare un codice binario a ciascun elemento univoco e la lunghezza di questi codici è diversa. Per gli elementi ripetuti più frequentemente vengono utilizzati codici più brevi. Le assegnazioni sono memorizzate in una tabella di ricerca, che viene caricata nel decoder prima dei codici stessi. Esistono vari algoritmi per la costruzione di codici. Il rapporto di compressione è stimato come 8: 1 ... Per i file con sequenze lunghe, lo schema di Huffman non funziona molto bene. La compressione di massa è migliore qui. Perché le statistiche sono necessarie per costruire i codici, di solito vengono utilizzati 2 passaggi. Innanzitutto, viene creato un modello statistico, quindi viene eseguita la compressione effettiva (codifica). Perché lavorare con codici a lunghezza variabile richiede tempo, codificare e decodificare richiede tempo.

Il metodo prende il nome dalle prime lettere dei cognomi degli sviluppatori: Lempel, Ziv, Welch. Sviluppato nel 1984. Inizialmente, il metodo era destinato all'implementazione dell'hardware. Come l'algoritmo di Huffman, l'algoritmo LZW ha diverse varianti. L'idea è di trovare pattern di pixel ripetuti e codificarli. La tabella dei codici non viene creata prima della codifica, ma durante il processo di codifica, il che rende l'algoritmo adattivo. Considera la sequenza "ababaaacaaaad". Lascia che ogni lettera sia codificata nell'immagine con un valore di 2 bit. La tabella dei codici iniziale codifica ogni oggetto atomico: a - 00, b - 01, c - 10, d - 11... L'algoritmo procede quindi alla ricerca delle sequenze. Può riconoscere solo sequenze di 1 lettera. La prima sequenza di 2 lettere non viene riconosciuta e deve essere codificata. Perché la lunghezza del codice è esaurita, è aumentata di 1: a - 000, b - 001, c - 010, d - 011, ab - 100... La successiva combinazione di 2 lettere viene riconosciuta. C'era una descrizione a 2 bit per ogni lettera. La sequenza richiede 2 * 2 = 4 bit. Quando si sostituisce una sequenza con un codice a 3 bit, si salva 1 bit per ogni occorrenza della sequenza. Rapporto di compressione tipico per il metodo 3: 1 ... Le immagini con motivi di colore ripetuti vengono compresse in 10: 1 ... Le foto e le immagini scansionate che non contengono motivi non vengono compresse bene.

Quando si risponde a questa domanda, è necessario spiegare il concetto di "codifica aritmetica", confrontarlo con altri metodi di codifica noti e parlare dell'algoritmo per la costruzione del codice aritmetico di un determinato messaggio.

La codifica aritmetica è uno degli algoritmi di compressione dell'entropia. L'algoritmo di codifica aritmetica fornisce un rapporto di compressione quasi ottimale in termini di stima dell'entropia di codifica di Shannon. Ogni personaggio richiede quasi h po' dove h- entropia informativa della sorgente.

La codifica aritmetica è un metodo che consente di comprimere i simboli dell'alfabeto di input senza perdita, a condizione che la distribuzione delle frequenze di questi simboli sia nota e sia la più ottimale, poiché viene raggiunto il limite teorico del rapporto di compressione.

Stima richiesto sequenza di caratteri, quando compresso con il metodo di codifica aritmetica è considerato come alcuni frazione binaria dall'intervallo)

Principali articoli correlati