mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-29 05:14:18 +00:00
51 lines
1.5 KiB
Markdown
51 lines
1.5 KiB
Markdown
# Compressione
|
|
|
|
_Comprimere_ un file significa **ridurne le dimensioni** senza modificarne il significato.
|
|
|
|
## Categorie
|
|
|
|
### Compressione lossless
|
|
|
|
Nella _compressione lossless_, i dati possono essere decompressi riottenendo una copia identica dell'originale.
|
|
|
|
> Immaginiamo un file che contiene solo le lettere `a, b, c, d, e, f`.
|
|
>
|
|
> Le lettere compaiono con questa frequenza:
|
|
> |a|b|c|d|e|f|
|
|
> |45%|13%|12%|16%|9%|5%|
|
|
>
|
|
> Possiamo codificare le lettere nel seguente modo:
|
|
> |a|b|c|d|e|f|
|
|
> |`0b0`|`0b100`|`0b101`|`0b111`|`0b1100`|`0b1101`|
|
|
>
|
|
> Scrivere `abacadae` richiederebbe 64 bits con la codifica ASCII estesa, ma in questo modo riusciamo a scriverlo con soli 17 bits!
|
|
|
|
Le codifiche di un file compresso devono rispettare la proprietà del _Codice a prefisso_, che dice che **nessun codice deve essere il prefisso di un altro codice**; altrimenti, si avrebbero ambiguità nella decodifica.
|
|
|
|
> a = `1`
|
|
> b = `11`
|
|
>
|
|
> `111` è `ab`, `ba` oppure `aaa`?
|
|
|
|
Creiamo allora un _albero di decodifica_: un **albero binario** che, leggendo uno ad uno i bit codificati, ci permette di arrivare al **valore del codice presente sulle foglie** dell'albero.
|
|
|
|
Gli alberi di decodifica sono sempre **completi**.
|
|
|
|
> Un albero di decodifica incompleto sarebbe non ottimizzato!
|
|
|
|
#### Esempi
|
|
|
|
- .png
|
|
- .flac
|
|
- .zip
|
|
- ...
|
|
|
|
### Compressione lossy
|
|
|
|
Nella _compressione lossy_, alcuni dati [solitamente](http://needsmorejpeg.com/) irrilevanti vengono perduti: non si può, dunque, ricostruire l'originale.
|
|
|
|
#### Esempi
|
|
|
|
- .jpeg
|
|
- .mp3
|
|
- ...
|