Compressione solida
 
    Un file da comprimere è una sequenza di simboli, come lettere prese da un alfabeto di possibili. Lo scopo della compressione entropica è quello di produrre una sequenza di codici più corta dell'originale, che se interpretata da un algoritmo di decompressione riproduca l'identica stringa originale. Per far ciò codifichiamo i simboli della stringa originale con un alfabeto di codici di lunghezza differente, in particolare usiamo codici corti per i simboli originali più frequenti, e quelli più lunghi per quelli più infrequenti. Nel Codice Morse vale la stessa regola, ad esempio le frequenti vocali sono codificate con pochissimi punti e linee, mentre le consonanti più infrequenti hanno le codifiche più lunghe. Così trasmettendo del testo coerente abbiamo un risparmio di punti e linee, rispetto a quelle che trasmetteremmo usando codici tutti della stessa lunghezza.
    I file di un computer sono però di vario tipo, non tutti sono costituiti da solo testo, ed i simboli più frequenti varieranno da file a file. Per cui i compressori sono composti idealmente da due stadi, prima analizzano la struttura statistica del file e generano un dizionario temporaneo che specifica quali sono i simboli più frequenti, dopodichè codificano il file originario tenendo conto di tali frequenze. Nel file compresso oltre alla codifica deve essere quindi presente anche questo dizionario delle frequenze, indispensabile per poter fare la decompressione.
    Quando diamo una serie di file al WinZip esso genera un dizionario di statistiche indipendente per ogniuno. Quindi l'unico file che restituisce il programma è composto da coppie dizionario - codifica. Si capisce chiaramente che se i file sono tutti di tipo simile i dizionari prodotti saranno quasi uguali, e ciò è uno spreco. Si potrebbe calcolare un dizionario per tutti i file e trasmettere le codifiche solo rispetto ad esso.
    Per farlo c'è un modo semplice: si può far credere al WinZip di lavorare non su una serie di file ma su uno soltanto. Ad esempio si può impacchettare tutti i file col WinZip senza attivare la compressione. Poi si può ricomprimere il risultato come se fosse un file unico. Per far ciò spesso dobbiano rinominare il suffisso del file-pacco per ingannare il WinZip e fargli credere di non lavorare su un file già impacchettato.
    Esistono programmi dal solo scopo di impacchettare molti file, da poi passare a compressori, ad esempio il Tar di Unix. Altrimenti esistono compressori che eseguono automaticamente questa operazione, detta compressione solida.
    I programmi reali di compressione non funzionano veramente in due stadi, analisi e codifica. In pratica per motivi di efficienza costruiscono il dizionario statistico dinamicamente man a mano che codificano il file in ingresso.
    La compressione solida presenta quindi vantaggi e svantaggi. Il vantaggio principale è che se i file forniti sono veramente simili, si avrà un file finale mediamente più piccolo. Ci sono però degli svantaggi, di solito la compressione solida è più lenta, e dà problemi se i file non sono tutti simili. Ci sono poi altri svantaggi, dovuti al fatto che le statistiche sono raccolte dinamicamente: per decomprimere un file si deve almeno decomprimere tutti i precedenti, inoltre gli archivi solidi sono molto più sensibili agli errori di quelli normali. Un errore può far perdere tutto quello che segue nel file compresso solidamente. Negli archivi normali un errore localizzato al più farà perdere il file sulla cui coppia dizionario - codifica si trova.
    Alcuni compressori, come il WinZip non hanno la compressione solida. Altri come Rkive e Acb la usano sempre, altri ancora come 777, WinRar, Boa, ecc., danno all'utente la possibilità di scegliere che tipo di metodo usare.

    Per finire un esperimento. Nella Sfida Compressori ho impacchettato la libreria di sorgenti pascal Numerical Recipes con Lzh, per poi passarla ai compressori che non possiedono la compressione solida. Ma ecco qualche confronto di dimensioni:
Originale: 580KB
Compresso non solido con WinZip: 275KB
Impacchettati con lzh: 595KB
Imapcchettato con Lzh e poi compresso con WinZip: 156KB
Compressi solidamente col WinRar 2.0: 135KB