a
( intestazione , "a" , n )a
na + lgnun'a + lg( n )nΘ ( lg( n )p/ n)p ≥ 1
lgnnun'na +1a + 2un'na + 1na + 2n
Poiché il rapporto di compressione è troppo vicino al rapporto inverso della lunghezza per l'osservazione visiva, ecco i dati per una piccola lunghezza nella mia implementazione (questo potrebbe dipendere dalla versione della libreria bzip2, poiché ci sono diversi modi per comprimere alcuni input ). La prima colonna indica il numero di a
's, la seconda colonna è la lunghezza dell'output compresso.
1–3 37
4–99 39
100–115 37
116–258 39
259–354 45
355 43
356 40
357–370 41
371–498 43
499–513 41
514–609 45
610 43
611 41
613–625 42
626–753 44
754–764 42
765 40
766–767 41
768 42
769–864 45
…
Bzip2 è molto più complesso di una semplice codifica di lunghezza. Funziona in una serie di passaggi e il primo è un passaggio di codifica di lunghezza di esecuzione , ma con un limite di dimensioni fisse. Il primo passaggio funziona nel modo seguente: se un byte viene ripetuto almeno 4 volte, sostituire i byte dopo il 4 con un byte che indica il conteggio delle ripetizioni dei byte cancellati. Ad esempio, aaaaaaa
viene trasformato in aaaa\d{3}
(dove si \d{003}
trova il carattere con valore byte 3); aaaa
viene trasformato in aaaa\d{0}
e così via. Poiché ci sono solo 256 valori di byte distinti, solo le sequenze in cui il byte viene ripetuto fino a 259 volte possono essere codificate in questo modo; se ce ne sono altri, inizia una nuova sequenza. Inoltre, l'implementazione di riferimento si interrompe con un conteggio ripetuto di 252, che codifica una stringa di 256 byte.
un'n1 ≤ n ≤ 34 ≤ n ≤ 258aaaa\d{252}
\d{252}
è il conteggio delle ripetizioni, non ho verificato) viene ripetuto e quindi compresso dai passaggi successivi.
aaaa\374aa
n = 258a
n = 100un'101aaaa\d{97}
a
aaaaa
n = 101a
A
68 ≤ n ≤ 83
La mia analisi di questo esempio è lungi dall'essere esaustiva. Per capire altri effetti, dovresti studiare gli altri passaggi della trasformazione: mi sono fermato per lo più dopo il passaggio 1 di 9. Spero che questo ti dia un'idea del perché i rapporti di compressione diventano un po 'instabili e non variano monotonicamente. Se vuoi davvero capire ogni dettaglio, ti consiglio di prendere un'implementazione esistente e osservarla con un debugger.
Per la maggior parte, tali minime variazioni non sono al centro dell'attenzione nella progettazione di un algoritmo di compressione: in molti scenari comuni, come algoritmi di compressione generici o multimediali, una differenza di pochi byte è irrilevante. La compressione cerca di spremere ogni bit a livello locale e cerca di incatenare le trasformazioni in modo tale da ottenere spesso mentre raramente perde e quindi non di molto. Esistono tuttavia situazioni come protocolli di comunicazione per scopi specifici progettati per la comunicazione a larghezza di banda ridotta in cui ogni bit è importante. Un'altra situazione in cui la lunghezza esatta dell'output è importante è quando il testo compresso è crittografato: quando un avversario può inviare parte del testo da comprimere e crittografare, le variazioni della lunghezza del testo cifrato possono rivelare la parte del testo compresso e crittografato a l'avversario; Exploit CRIME su HTTPS .