Sei sulla pagina 1di 91

Compactao de Dados

Letcia Rodrigues Bueno


UFABC

Compactao de Dados: Introduo

Compactao de Dados: Introduo

Objetivo:

Compactao de Dados: Introduo

Objetivo:
1. minimizar espao de memria utilizado;

Compactao de Dados: Introduo

Objetivo:
1. minimizar espao de memria utilizado;
2. minimizar custo da transmisso dos arquivos na rede ou
tempo de leitura do arquivo no disco;

Compactao de Dados: Introduo

Objetivo:
1. minimizar espao de memria utilizado;
2. minimizar custo da transmisso dos arquivos na rede ou
tempo de leitura do arquivo no disco;
3. minimizar tempo de pesquisa no arquivo.

Compactao de Dados: Introduo

Compactao de Dados: Introduo

Possvel soluo: substituir smbolos do texto por outros

com menor nmero de bits ou bytes

Compactao de Dados: Introduo

Possvel soluo: substituir smbolos do texto por outros

com menor nmero de bits ou bytes (codificao de


mensagens);

Compactao de Dados: Introduo

Possvel soluo: substituir smbolos do texto por outros

com menor nmero de bits ou bytes (codificao de


mensagens);
1. Dada uma cadeia de caracteres (mensagem);

Compactao de Dados: Introduo

Possvel soluo: substituir smbolos do texto por outros

com menor nmero de bits ou bytes (codificao de


mensagens);

1. Dada uma cadeia de caracteres (mensagem);


2. problema: codificar mensagem atravs de atribuio de
cdigos a smbolos;

Compactao de Dados: Introduo

Possvel soluo: substituir smbolos do texto por outros

com menor nmero de bits ou bytes (codificao de


mensagens);

1. Dada uma cadeia de caracteres (mensagem);


2. problema: codificar mensagem atravs de atribuio de
cdigos a smbolos;
3. tabela de cdigos armazenada para decodificao;

Algoritmo de Frequncia de Caracteres

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC
3B1E4A2F5H1C1B2M1A3L1C2D7B2C

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC
3B1E4A2F5H1C1B2M1A3L1C2D7B2C
3BE4A2F5HCB2MA3LC2D7B2C

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC
3B1E4A2F5H1C1B2M1A3L1C2D7B2C
3BE4A2F5HCB2MA3LC2D7B2C
texto no pode ter caracteres numricos;

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC
3B1E4A2F5H1C1B2M1A3L1C2D7B2C
3BE4A2F5HCB2MA3LC2D7B2C
texto no pode ter caracteres numricos;

pode-se utilizar uma representao para diferenciar

smbolos e frequncias;

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC
3B1E4A2F5H1C1B2M1A3L1C2D7B2C
3BE4A2F5HCB2MA3LC2D7B2C
texto no pode ter caracteres numricos;

pode-se utilizar uma representao para diferenciar

smbolos e frequncias;

AAA33333BA6666888DDDDDDD99999999999AABBB

Algoritmo de Frequncia de Caracteres

BBBEAAAAFFHHHHHCBMMALLLCDDBBBBBBBCC
3B1E4A2F5H1C1B2M1A3L1C2D7B2C
3BE4A2F5HCB2MA3LC2D7B2C
texto no pode ter caracteres numricos;

pode-se utilizar uma representao para diferenciar

smbolos e frequncias;

AAA33333BA6666888DDDDDDD99999999999AABBB
3A5@3BA4@63@87D11@92A3B

Algoritmo de Huffman

proposto em 1952;

Algoritmo de Huffman

proposto em 1952;

ideia bsica: atribuir cdigos mais curtos a smbolos com

frequncias altas;

Algoritmo de Huffman

proposto em 1952;

ideia bsica: atribuir cdigos mais curtos a smbolos com

frequncias altas;

implementao tradicional: considera caractere como

smbolo (comprime texto em 25%);

Algoritmo de Huffman

proposto em 1952;

ideia bsica: atribuir cdigos mais curtos a smbolos com

frequncias altas;

implementao tradicional: considera caractere como

smbolo (comprime texto em 25%);

considerar palavras como smbolos comprime texto em

60%;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;


fi frequncia de si no texto, para 1 i n;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;

fi frequncia de si no texto, para 1 i n;


Queremos atribuir um cdigo a cada smbolo para

compactar o texto todo;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;

fi frequncia de si no texto, para 1 i n;


Queremos atribuir um cdigo a cada smbolo para

compactar o texto todo;

Nenhum cdigo deve ser prefixo de outro: rvore binria

de prefixo;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;

fi frequncia de si no texto, para 1 i n;


Queremos atribuir um cdigo a cada smbolo para

compactar o texto todo;

Nenhum cdigo deve ser prefixo de outro: rvore binria

de prefixo;

Cada smbolo si associado a uma folha da rvore;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;

fi frequncia de si no texto, para 1 i n;


Queremos atribuir um cdigo a cada smbolo para

compactar o texto todo;

Nenhum cdigo deve ser prefixo de outro: rvore binria

de prefixo;

Cada smbolo si associado a uma folha da rvore;


Cdigos dos smbolos so sequncias binrias;

Algoritmo de Huffman

Conjunto de smbolos: S = {s1 , s2 , . . . , sn }, n > 1;

fi frequncia de si no texto, para 1 i n;


Queremos atribuir um cdigo a cada smbolo para

compactar o texto todo;

Nenhum cdigo deve ser prefixo de outro: rvore binria

de prefixo;

Cada smbolo si associado a uma folha da rvore;


Cdigos dos smbolos so sequncias binrias;

Vantagem de utilizar cdigo de prefixo: facilidade para

codificao e decodificao;

Algoritmo de Huffman: (de)codificao

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

011

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

011 0101

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

011 0101 0101

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

011 0101 0101 00

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

011 0101 0101 00 0101

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

011 0101 0101 00 0101 00

s5
1
0

s4
0

s2

s3

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100 0101

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100 0101 1

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100 0101 1 0100

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100 0101 1 0100 0100

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100 0101 1 0100 0100 0100

Algoritmo de Huffman: (de)codificao


s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4

s1:00
s2:0100 0
s3:0101 s1
s4:011
s5:1

s5
1
0

s4
0

s2

s3

011 0101 0101 00 0101 00 011 1 00 0101 0101 0101 0101


0101 0100 0101 1 0100 0100 0100 011

Algoritmo de Huffman

Se rvore de prefixo T conhecida, (de)codificao feita

em O(m) onde m o tamanho da sequncia binria


codificada;

Algoritmo de Huffman

Se rvore de prefixo T conhecida, (de)codificao feita

em O(m) onde m o tamanho da sequncia binria


codificada;

Para 0110101010100010100011100010101010101

01010101010001011010001000100011, custo c(T ) = 69;

Algoritmo de Huffman

Se rvore de prefixo T conhecida, (de)codificao feita

em O(m) onde m o tamanho da sequncia binria


codificada;

Para 0110101010100010100011100010101010101

01010101010001011010001000100011, custo c(T ) = 69;

necessrio minimizar c(T );

Algoritmo de Huffman

Se rvore de prefixo T conhecida, (de)codificao feita

em O(m) onde m o tamanho da sequncia binria


codificada;

Para 0110101010100010100011100010101010101

01010101010001011010001000100011, custo c(T ) = 69;

necessrio minimizar c(T );

rvore mnima ou rvore de Huffman: rvore de prefixo

T com c(T ) mnimo;

Algoritmo de Huffman

Algoritmo de Huffman

21
0

s1:101 s3
12
s2:111
0
1
s3:0
5
7
s4:110
0
1
0
1
s5:100
s5 s1 s4 s2

f1:3
f2:4
f3:9
f4:3
f5:2

Algoritmo de Huffman

21
0

s1:101 s3
12
s2:111
0
1
s3:0
5
7
s4:110
0
1
0
1
s5:100
s5 s1 s4 s2

f1:3
f2:4
f3:9
f4:3
f5:2

s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4 produz

Algoritmo de Huffman

21
0

s1:101 s3
12
s2:111
0
1
s3:0
5
7
s4:110
0
1
0
1
s5:100
s5 s1 s4 s2

f1:3
f2:4
f3:9
f4:3
f5:2

s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4 produz
110001010101110100101000001110100111111111110

Algoritmo de Huffman

21
0

s1:101 s3
12
s2:111
0
1
s3:0
5
7
s4:110
0
1
0
1
s5:100
s5 s1 s4 s2

f1:3
f2:4
f3:9
f4:3
f5:2

s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4 produz
110001010101110100101000001110100111111111110
que tem c(T ) = 45 e que mnima.

Ideia do Algoritmo de Huffman

Ideia do Algoritmo de Huffman

f(T)

f(T")

T"

Ideia do Algoritmo de Huffman

f(T)

f(T")

T"

f(T)+f(T")

=
T

T"

Construo da rvore de Huffman

Construo da rvore de Huffman

s1 s2 s3 s4 s5

Construo da rvore de Huffman

s1 s2 s3 s4 s5

s2 s3 s4

5
0

s1 s5

Construo da rvore de Huffman

s1 s2 s3 s4 s5

s2 s3 s4

5
0

s1 s5

5
0

s3

7
1

s1 s5

s4 s2

Construo da rvore de Huffman

5
0

s3

7
1

s1 s5

s4 s2

Construo da rvore de Huffman

5
0

s3

7
1

s1 s5

s4 s2

s3

12
0

5
0

7
1

s1 s5

s4 s2

Construo da rvore de Huffman

s3

12
0

5
0

7
1

s1 s5

s4 s2

Construo da rvore de Huffman

s3

12
0

5
0

7
1

s1 s5

s4 s2

21
0

s3

12
0

5
0

7
1

s1 s5

s4 s2

Algoritmo de Huffman: insero em lista de prioridades

Algoritmo de Huffman: insero em lista de prioridades

1
2
3
4

inserir(T , f , F ):
F [n + 1] T
n++
subir(n)

Algoritmo de Huffman: insero em lista de prioridades

1
2
3
4

inserir(T , f , F ):
F [n + 1] T
n++
subir(n)

1
2
3
4
5
6

subir(i):
j = bi/2c
se j 1 ento
se T [i] < T [j] ento
T [i] T [j]
subir(j)

Algoritmo de Huffman: insero em lista de prioridades

1
2
3
4

1
2
3
4
5
6

inserir(T , f , F ):
F [n + 1] T
n++
subir(n)

subir(i):
j = bi/2c
se j 1 ento
se T [i] < T [j] ento
T [i] T [j]
subir(j)

inserir(T , f , F ) e
subir(i): mtodos de
lista de prioridades
implementada por
heap;

Algoritmo de Huffman: remoo de lista de prioridades

Algoritmo de Huffman: remoo de lista de prioridades


1
2
3
4
5
6

minimo(T , f , F ):
se n 6= 0 ento
remove T [1]
T [1] T [n]
n- descer(1, n)

Algoritmo de Huffman: remoo de lista de prioridades


1
2
3
4
5
6

minimo(T , f , F ):
se n 6= 0 ento
remove T [1]
T [1] T [n]
n- descer(1, n)

1
2
3
4
5
6
7
8
9

descer(i, n):
j =2i
se j n ento
se j < n ento
se T [j + 1] < T [j] ento
j =j +1
se T [i] > T [j] ento
T [i] T [j]
descer(j, n)

Algoritmo de Huffman: remoo de lista de prioridades


1
2
3
4
5
6

1
2
3
4
5
6
7
8
9

minimo(T , f , F ):
se n 6= 0 ento
remove T [1]
T [1] T [n]
n- descer(1, n)

descer(i, n):
j =2i
se j n ento
se j < n ento
se T [j + 1] < T [j] ento
j =j +1
se T [i] > T [j] ento
T [i] T [j]
descer(j, n)

minimo(T , f , F ) e
descer(1, n): mtodos
de lista de prioridades
implementada por
heap;

Algoritmo de Huffman

1 huffman():
2
para i 1 at n 1 faa
3
minimo(T 0 , f , F );
4
minimo(T 00 , f , F );
5
T T 0 T 00 ;
6
f (T ) f (T 0 ) f (T 00 );
7
inserir (T , f , F );

Algoritmo de Huffman

1 huffman():
2
para i 1 at n 1 faa
3
minimo(T 0 , f , F );
4
minimo(T 00 , f , F );
5
T T 0 T 00 ;
6
f (T ) f (T 0 ) f (T 00 );
7
inserir (T , f , F );

Operao de
minimizao ou
incluso na lista de
prioridades: O(log n);

Algoritmo de Huffman

1 huffman():
2
para i 1 at n 1 faa
3
minimo(T 0 , f , F );
4
minimo(T 00 , f , F );
5
T T 0 T 00 ;
6
f (T ) f (T 0 ) f (T 00 );
7
inserir (T , f , F );

Operao de
minimizao ou
incluso na lista de
prioridades: O(log n);
operao requer
nmero constante de
passos;

Algoritmo de Huffman

1 huffman():
2
para i 1 at n 1 faa
3
minimo(T 0 , f , F );
4
minimo(T 00 , f , F );
5
T T 0 T 00 ;
6
f (T ) f (T 0 ) f (T 00 );
7
inserir (T , f , F );

Operao de
minimizao ou
incluso na lista de
prioridades: O(log n);
operao requer
nmero constante de
passos;
Total de n 1
iteraes;

Algoritmo de Huffman

1 huffman():
2
para i 1 at n 1 faa
3
minimo(T 0 , f , F );
4
minimo(T 00 , f , F );
5
T T 0 T 00 ;
6
f (T ) f (T 0 ) f (T 00 );
7
inserir (T , f , F );

Operao de
minimizao ou
incluso na lista de
prioridades: O(log n);
operao requer
nmero constante de
passos;
Total de n 1
iteraes;
Complexidade:
O(n log n);

Exerccios

1. Desenhar a rvore de Huffman para o seguinte conjunto


de chaves e frequncias, respectivamente na primeira e
segunda linhas da tabela:
s1 s2 s3 s4 s5 s6 s7 s8
1 6 2 1 1 9 2 3
2. A rvore fornecida pelo algoritmo de Huffman nica, ou
seja, o algoritmo sempre fornecer a mesma rvore?

Bibliografia

SZWARCFITER, J. L. e MARKENZON, L. Estruturas de Dados e


seus Algoritmos, LTC, 1994.
ZIVIANI, N. Projeto de Algoritmos: com implementaes em Java e
C++, 1a edio, Cengage Learning, 2009.

Perguntas?

Potrebbero piacerti anche