compressione dati

Transcript

compressione dati
COMPRESSIONE DATI
Cosa significa comprimere ?
compressione
File
Originale
File
compresso
decompressione
IDENTICI !!!
File
Originale
1
COMPRESSIONE DATI
Per quale motivo vogliamo comprimere un
file ?
• Per risparmiare spazio quando memorizziamo
il file
• Per risparmiare tempo quando lo spediamo
(attraverso la rete per esempio)
SVANTAGGI:
• Tempo impiegato per comprimere e
decomprimere
• Il file compresso non è usabile direttamente.
Per usarlo occorre decomprimerlo
• Il file compresso è più “fragile”. Alcuni errori
di trasmissione possono completamente
alterarne il contenuto
2
COMPRESSIONE DATI
Per quale motivo si può comprimere ?
Partiamo con un semplice indovinello.
Completare la parte mancante
PERS#STENEREL#SAMEDIIN#ORMAT#CAGEN
ER#LECONSUCC#SSOALPRIMOA#PELL#OCCO
R#ESTUDIAR#ALM#NOD#ECIOREA#GIORNOP
ERUN#ERIODODIAL#ENOSE#MESI
PERSOSTENERELESAMEDIINFORMATICAGEN
ERALECONSUCCESSOALPRIMOAPPELLOOCC
ORRESTUDIAREALMENODIECIOREALGIORN
OPERUNPERIODODIALMENOSEIMESI
PER SOSTENERE L’ESAME DI INFORMATICA
GENERALE CON SUCCESSO AL PRIMO
APPELLO OCCORRE STUDIARE ALMENO
DIECI ORE AL GIORNO PER UN PERIODO DI
ALMENO SEI MESI
3
COMPRESSIONE DATI
L’indovinello del lucido precedente mostra una
rudimentale forma di compressione dati che
sfrutta il fatto che la lingua italiana, come tutti i
linguaggi naturali, è ridondante.
Un linguaggio è ridondante quando usa frasi più
lunghe del necessario per descrivere un concetto.
La ridondanza aiuta a correggere errori di
trasmissione ma rallenta la trasmissione stessa.
Comprimere un file significa eliminare la parte
ridondante senza precludersi la possibilità di
ricostruire deterministicamente il messaggio
originale.
C’è un limite alla compressione che è dato dalla
quantità di informazione contenuta nel
messaggio, chiamata in gergo tecnico entropia.
4
COMPRESSIONE DATI
Codici
Alfabeto = {A,B,C,D}
Pr(A) = 1/2
Pr(B) = 1/4
Pr(C) = 1/8
Pr(D) = 1/8
Codice1:
A 00
B 01
C 10
D 11
lunghezza della parola di codice 2
lunghezza della parola di codice 2
lunghezza della parola di codice 2
lunghezza della parola di codice 2
Lunghezza media del Codice1:
1
1
1
1
Lunghezza =  2 ×  +  2 ×  +  2 ×  +  2 ×  = 2
 2   4   8  8
5
COMPRESSIONE DATI
Codici
Alfabeto = {A,B,C,D}
Pr(A) = 1/2
Pr(B) = 1/4
Pr(C) = 1/8
Pr(D) = 1/8
Codice2:
A 0
B 10
C 110
D 111
lunghezza della parola di codice 1
lunghezza della parola di codice 2
lunghezza della parola di codice 3
lunghezza della parola di codice 3
Lunghezza media del Codice2:
1 7
1
1
1
Lunghezza = 1 ×  +  2 ×  +  3 ×  +  3 ×  = < 2
 2   4   8  8 4
6
COMPRESSIONE DATI
Codifica di:
ABAABCDBABDDAA
Codice1:
A B A A B C D B A B D D A A
00 01 00 00 01 10 11 01 00 01 11 11 00 00
1 4 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 43
28
Codice2:
A B A A B C D B A B D D A A
0 10 0 0 10 110 111 10 0 10 111 111 0 0
1 4 4 4 4 4 4 4 4 4 4 44 2 4 4 4 4 4 4 4 4 4 4 4 43
26
7
COMPRESSIONE DATI
Idea:
Non tutte le parole di un linguaggio hanno la
stessa frequenza all’interno di un testo scritto in
quel linguaggio.
Quindi:
A parole più frequenti associamo una
codifica più corta a parole meno frequenti
una codifica più lunga.
8
COMPRESSIONE DATI
Algoritmo di compressione dovuto a
Ziv e Lempel
Esempio
Stringa di caratteri da codificare
0110110110101000111……
Token (pezzetti) distinti:
123 4 5 6 7 8 9
0110110110101000111……
Ogni token è codificato con una coppia
(posizione,ultima cifra)
IDEA: I token si allungano progressivamente
…nell’esempio:
(1,0)(2,1)(2,0)(2,1)(1,1)(3,1)
(5,0)(1,0)(4,1)
9