MAC0323Algoritmose EstruturasdeDadosII Edição2020–2
Transcript of MAC0323Algoritmose EstruturasdeDadosII Edição2020–2
![Page 1: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/1.jpg)
MAC0323 Algoritmos eEstruturas de Dados II
Edição 2020 – 2
![Page 3: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/3.jpg)
Algoritmo de Huffman
Fonte: Huffman codingReferências: Algoritmo de Huffman para compressão de dados
(PF), Data Compression (SW), slides (SW), video (SW)
![Page 4: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/4.jpg)
Ideias
O algoritmo de Huffman recebeum fluxo de bits e devolve um fluxo de bits.
Fluxo de bits original é lido de 8 em 8 bits.0100000101000010010100100100000101000011ABRAC
0101001010001000100000100100001001010010ADABR
0100000100100001A!
![Page 5: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/5.jpg)
IdeiasUma tabela de códigos levacada caractere de 8 bits no seu código.
caractere frequência código! 5000 1010A 45000 0B 13000 111C 9000 1011D 16000 100R 12000 110
Ideia do algoritmo de Huffman:usar códigos curtos para os caracteres queocorrem com frequência e deixar os códigosmais longos para os caracteres mais raros.
![Page 6: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/6.jpg)
IdeiasUma tabela de códigos levacada caractere de 8 bits no seu código.
caractere frequência código! 5000 1010A 45000 0B 13000 111C 9000 1011D 16000 100R 12000 110
A tabela deve ser livre de prefixos.Uma tabela de códigos é livre de prefixos(prefix-free) se nenhum código é prefixo de outro.
![Page 7: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/7.jpg)
Trie do códigoA tabela de códigos inversa leva cada códigono correspondente caractere. Exemplo:
código caractere101 !
0 A1111 B110 C100 D
1110 R
A tabela inversa é uma ST de strings: as chavessão strings de 0s e 1s e os valores são caracteres.A tabela será representada por uma trie binária.
![Page 8: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/8.jpg)
![Page 9: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/9.jpg)
![Page 10: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/10.jpg)
AULA 25
![Page 11: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/11.jpg)
Construção de uma trie
O segredo do algoritmo de Huffman estána maneira de escolher a tabela de códigos.
A tabela de códigos de Huffman não é universal.
Ela é construída sob medida para a string a sercodificada de tal modo que o comprimento dacadeia codificada seja o menor possível quandocomparado com outros códigos livres de prefixos.
Primeiro, construímos a trie do código,depois extraímos dela a tabela de códigos.
![Page 12: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/12.jpg)
Construção de uma trie
O segredo do algoritmo de Huffman estána maneira de escolher a tabela de códigos.
A tabela de códigos de Huffman não é universal.
Ela é construída sob medida para a string a sercodificada de tal modo que o comprimento dacadeia codificada seja o menor possível quandocomparado com outros códigos livres de prefixos.
Primeiro, construímos a trie do código,depois extraímos dela a tabela de códigos.
![Page 13: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/13.jpg)
Construção de uma trie
O segredo do algoritmo de Huffman estána maneira de escolher a tabela de códigos.
A tabela de códigos de Huffman não é universal.
Ela é construída sob medida para a string a sercodificada de tal modo que o comprimento dacadeia codificada seja o menor possível quandocomparado com outros códigos livres de prefixos.
Primeiro, construímos a trie do código,depois extraímos dela a tabela de códigos.
![Page 14: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/14.jpg)
Construção de uma trie
O algoritmo de construção da trie é iterativo.No início de cada iteração, temos umacoleção de tries mutuamente disjuntas.
Dada a string a ser codificada,a coleção de tries inicial é construída assim:1. determine a frequência de cada caractere
da string original;2. para cada caractere, crie um nó e armazene o
caractere e sua frequência nos campos ch e freq;3. cada nó será uma trie da coleção inicial.
Assim, no início da primeira iteração,cada trie tem um único nó.
![Page 15: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/15.jpg)
Construção de uma trie
O algoritmo de construção da trie é iterativo.No início de cada iteração, temos umacoleção de tries mutuamente disjuntas.Dada a string a ser codificada,a coleção de tries inicial é construída assim:1. determine a frequência de cada caractere
da string original;2. para cada caractere, crie um nó e armazene o
caractere e sua frequência nos campos ch e freq;3. cada nó será uma trie da coleção inicial.
Assim, no início da primeira iteração,cada trie tem um único nó.
![Page 16: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/16.jpg)
Construção de uma trie
O algoritmo de construção da trie é iterativo.No início de cada iteração, temos umacoleção de tries mutuamente disjuntas.Dada a string a ser codificada,a coleção de tries inicial é construída assim:1. determine a frequência de cada caractere
da string original;2. para cada caractere, crie um nó e armazene o
caractere e sua frequência nos campos ch e freq;3. cada nó será uma trie da coleção inicial.
Assim, no início da primeira iteração,cada trie tem um único nó.
![Page 17: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/17.jpg)
Construção de uma trie
Repita a seguinte iteração até quea coleção de tries tenha apenas uma trie:1. escolha duas tries cujas raízes,
digamos x e y, tenham freq mínima;
2. crie um novo nó parent e façacom que x e y sejam filhos desse nó;
3. faça parent.freq igual a x.freq + y.freq;4. insira essa nova trie na coleção.
![Page 18: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/18.jpg)
Construção de uma trie
Repita a seguinte iteração até quea coleção de tries tenha apenas uma trie:1. escolha duas tries cujas raízes,
digamos x e y, tenham freq mínima;2. crie um novo nó parent e faça
com que x e y sejam filhos desse nó;
3. faça parent.freq igual a x.freq + y.freq;4. insira essa nova trie na coleção.
![Page 19: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/19.jpg)
Construção de uma trie
Repita a seguinte iteração até quea coleção de tries tenha apenas uma trie:1. escolha duas tries cujas raízes,
digamos x e y, tenham freq mínima;2. crie um novo nó parent e faça
com que x e y sejam filhos desse nó;3. faça parent.freq igual a x.freq + y.freq;4. insira essa nova trie na coleção.
![Page 20: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/20.jpg)
![Page 21: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/21.jpg)
![Page 22: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/22.jpg)
![Page 23: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/23.jpg)
![Page 24: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/24.jpg)
![Page 25: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/25.jpg)
![Page 26: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/26.jpg)
![Page 27: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/27.jpg)
![Page 28: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/28.jpg)
![Page 29: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/29.jpg)
![Page 30: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/30.jpg)
![Page 31: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/31.jpg)
![Page 32: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/32.jpg)
![Page 33: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/33.jpg)
![Page 34: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/34.jpg)
![Page 35: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/35.jpg)
![Page 36: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/36.jpg)
![Page 37: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/37.jpg)
![Page 38: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/38.jpg)
![Page 39: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/39.jpg)
![Page 40: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/40.jpg)
![Page 41: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/41.jpg)
![Page 42: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/42.jpg)
Recebe a frequência dos caracteres.
static Node buildTrie(int *freq) {MinPQ pq = MinPQInit(); /* fila de nós */Node x, y, parent;
for (char c = 0; c < R; c++)if (freq[c] > 0) {
x = newNode(c, freq[c], NULL, NULL);insert(pq, x);
}while (size(pq) > 1) {
x = delMin(pq);y = delMin(pq);parent = newNode('\0', x->freq + y->freq, x, y);insert(pq, parent);
}return delMin(pq);
}
![Page 43: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/43.jpg)
Recebe a frequência dos caracteres.
static Node buildTrie(int *freq) {MinPQ pq = MinPQInit(); /* fila de nós */Node x, y, parent;for (char c = 0; c < R; c++)
if (freq[c] > 0) {x = newNode(c, freq[c], NULL, NULL);insert(pq, x);
}
while (size(pq) > 1) {x = delMin(pq);y = delMin(pq);parent = newNode('\0', x->freq + y->freq, x, y);insert(pq, parent);
}return delMin(pq);
}
![Page 44: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/44.jpg)
Recebe a frequência dos caracteres.
static Node buildTrie(int *freq) {MinPQ pq = MinPQInit(); /* fila de nós */Node x, y, parent;for (char c = 0; c < R; c++)
if (freq[c] > 0) {x = newNode(c, freq[c], NULL, NULL);insert(pq, x);
}while (size(pq) > 1) {
x = delMin(pq);y = delMin(pq);parent = newNode('\0', x->freq + y->freq, x, y);insert(pq, parent);
}return delMin(pq);
}
![Page 45: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/45.jpg)
Mais um código de Huffman
![Page 46: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/46.jpg)
buildCode()
A tabela de códigos st[] usadana codificação é calculada a partir da trie:
static char **buildCode(Node root) {char **st = mallocSafe(R*sizeof(char *));char s[MAX];s[0] = '\0';buildCode(st, root, s);return st;
}
![Page 47: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/47.jpg)
buildCode()A tabela de códigos st[] usadana codificação é calculada a partir da trie:static void buildCode(char **st, Node x, char *s) {
if (isLeaf(x))copy(st[x->ch], s); /* aloca e copia */
else {int n = strlen(s);s[n+1] = '\0';s[n] = '0';buildCode(st, x->left, s);s[n] = '1';buildCode(st, x->right, s);s[n] = '\0';
}}
![Page 48: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/48.jpg)
A trie de Huffman é ótima
Proposição. A cadeia de bits produzida peloalgoritmo de Huffman é mínima no seguinte sentido:
nenhuma outra cadeia produzidapor um código livre de prefixos émais curta que a cadeia produzidapelo algoritmo de Huffman.
Em MAC0338 Análise de Algoritmos lembrar distoquando estiverem vendo Algoritmos Gulosos.
![Page 49: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/49.jpg)
A trie de Huffman é ótima?
% more abra.txt | java BinaryDump 096 bits
% java Huffman - < abra.txt |java BinaryDump 0
120 bits
![Page 50: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/50.jpg)
A trie de Huffman é ótima?
% more abra.txtABRACADABRA!
% java Huffman - < abra.txt |java BinaryDump 30
010100000100101000100010010000110100001101010100101010000100000000000000000000000000000110001111100101101000111110010100120 bits
![Page 51: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/51.jpg)
A trie de Huffman é ótima?
% java Huffman - < abra.txt |java BinaryDump 30
01010000010010100010001001000011010000110101010010101000010
00000000000000000000000000001100
01111100101101000111110010100120 bits
![Page 52: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/52.jpg)
A trie de Huffman é ótima?
01010000010010100010001001000011010000110101010010101000010
código caractere0 1 01000001 A0 0 1 01000100 D0 1 00100001 !1 01000011 C0 1 01010010 R1 01000010 B
![Page 53: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/53.jpg)
Codificação da trie
A cadeia de bits produzida pelo algoritmode Huffman não pode ser decodificadasem a correspondente trie.
É preciso acrescentar a trie à cadeia codificada.
![Page 54: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/54.jpg)
Codificação da trie
![Page 55: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/55.jpg)
Codificação da trie
static void writeTrie(Node x) {if (isLeaf(x)) {
write(true);write(x->ch);return;
}write(false);writeTrie(x->left);writeTrie(x->right);
}
![Page 56: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/56.jpg)
Codificação da trie
static Node readTrie() {if (readBoolean()) {
char c = readChar();return newNode(c, 0, NULL, NULL);
}return newNode('\0', 0, readTrie(), readTrie());
}
A frequência não é usada mais.
![Page 57: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/57.jpg)
Compressão completa
Com buidTrie(), buildCode() e writeTrie(),podemos completar o método de compressão.
void compress() {char *input = readString();/* aqui vai a construção de st[]...*/int *freq = mallocSafe(R*sizeof(int));for (int i = 0; i < strlen(input); i++)
freq[input[i]]++;Node root = buildTrie(freq);char **st = buildCode(root);
![Page 58: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/58.jpg)
Compressão completa
writeTrie(root);write(strlen(input));for (int i=0; i<strlen(input); i++) {
char *code = st[input[i]];for(int j=0; j<strlen(code); j++)
if (code[j] == '1')write(true);
elsewrite(false);
}close();
}
![Page 59: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/59.jpg)
Esqueleto da biblioteca Huffman
Rotinas em Huffman.c:
static int R = 256; /* alfabeto */
typedef struct node *Node;... /* rotinas de manipulação de nós */
void compress() {...}void expand() {...}
static Node buildTrie(int *freq) {...}static char **buildCode(Node root) {...}static void writeTrie(Node x) {...}static Node readTrie() {...}
![Page 60: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/60.jpg)
Algoritmo LZW
Referências: Data Compression (SW), slides (SW),LZW compression, video (SW)
![Page 61: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/61.jpg)
Algoritmo LZW
Desenvolvido por Abraham Lempel e Jakob Zivem 1977 (LZ77).Refinamento de LZ78 por Terry Welch em 1978.Huffman é um método estatístico de compressãode dados.LZW é um método baseado em dicionários(dictionary based compression systems).
Diferentemente do algoritmo de Huffman, o algoritmoLZW transforma strings de tamanho variado em códigosde tamanho fixo de W bits (usualmente de 8 a 12).
![Page 62: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/62.jpg)
Algoritmo LZW
Desenvolvido por Abraham Lempel e Jakob Zivem 1977 (LZ77).Refinamento de LZ78 por Terry Welch em 1978.Huffman é um método estatístico de compressãode dados.LZW é um método baseado em dicionários(dictionary based compression systems).Diferentemente do algoritmo de Huffman, o algoritmoLZW transforma strings de tamanho variado em códigosde tamanho fixo de W bits (usualmente de 8 a 12).
![Page 63: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/63.jpg)
Métodos baseados em dicionários
Não usam conhecimento estatístico dos dados.compress(): a medida que a entrada éprocessada, constrói um dicionário e utiliza osíndices das strings no dicionário como código.
expand(): a medida que a entrada éprocessada, reconstrói o dicionário parareverter o trabalho de compress().
Exemplos: LZW, LZ77, SequiturAplicações: Unix compress, gzip, GIF
![Page 64: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/64.jpg)
Métodos baseados em dicionários
Não usam conhecimento estatístico dos dados.compress(): a medida que a entrada éprocessada, constrói um dicionário e utiliza osíndices das strings no dicionário como código.expand(): a medida que a entrada éprocessada, reconstrói o dicionário parareverter o trabalho de compress().
Exemplos: LZW, LZ77, SequiturAplicações: Unix compress, gzip, GIF
![Page 65: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/65.jpg)
LZW compress()
input = string de entrada
crie dicionário com símbolos do alfabeto
repitaencontre o maior prefixo s de input
que está no dicionáriotransmita para saída o índice de sponha s+c no dicionário onde c é
o símbolo que segue s em input(unmatched symbol).
apague do input o prefixo saté que input é vazio
![Page 66: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/66.jpg)
LZW compress()
input = string de entrada
crie dicionário com símbolos do alfabetorepita
encontre o maior prefixo s de inputque está no dicionário
transmita para saída o índice de s
ponha s+c no dicionário onde c éo símbolo que segue s em input(unmatched symbol).
apague do input o prefixo saté que input é vazio
![Page 67: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/67.jpg)
LZW compress()
input = string de entrada
crie dicionário com símbolos do alfabetorepita
encontre o maior prefixo s de inputque está no dicionário
transmita para saída o índice de sponha s+c no dicionário onde c é
o símbolo que segue s em input(unmatched symbol).
apague do input o prefixo saté que input é vazio
![Page 68: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/68.jpg)
LZW exemplo
Decisões de projeto:I Alfabeto = {a, b} ⇒ R = 2I W = 3 bits ⇒ índices entre 0 e 7I tamanho L do dicionário é 2W = 8I índice R codificará EOF (end of file)
![Page 69: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/69.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação
dicionáriostring códigoa 0b 1EOF 2
![Page 70: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/70.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0
dicionáriostring códigoa 0b 1EOF 2ab 3
![Page 71: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/71.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0 1
dicionáriostring códigoa 0b 1EOF 2ab 3ba 4
![Page 72: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/72.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0 1 3
dicionáriostring códigoa 0b 1EOF 2ab 3ba 4aba 5
![Page 73: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/73.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0 1 3 5
dicionáriostring códigoa 0b 1EOF 2ab 3ba 4aba 5abab 6
![Page 74: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/74.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0 1 3 5 4
dicionáriostring códigoa 0b 1EOF 2ab 3ba 4aba 5abab 6bab 7
![Page 75: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/75.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0 1 3 5 4 1
dicionáriostring códigoa 0b 1EOF 2ab 3ba 4aba 5abab 6bab 7
![Page 76: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/76.jpg)
LZW compress(): exemploinput a b a b a b a b a b
codificação 0 1 3 5 4 1 2
dicionáriostring códigoa 0b 1EOF 2ab 3ba 4aba 5abab 6bab 7
![Page 77: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/77.jpg)
LZW compress(): exemplo
Resumo
Fomos de 8× 10 = 80 bits para representar
a b a b a b a b a b
para W× 7 = 3× 7 = 21 bits:
000 001 011 101 100 001 010
Taxa de compressão = 21/80 = 0.2625 ∼ 26%
![Page 78: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/78.jpg)
LZW compress(): mais um exemplo
Decisões de projeto:I Alfabeto = ASCII ⇒ R = 128I W = 8 bits ⇒ índices entre 0 e 255I tamanho L do dicionário é 2W = 256I índice R = 128 (= 80 hexa) codificará EOF
![Page 79: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/79.jpg)
LZW compress(): mais um exemplo
Fonte: algs4
![Page 80: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/80.jpg)
LZW compress(): mais um exemplo
Fonte: algs4
![Page 81: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/81.jpg)
Sobre o dicionárioDicionário de tamanho fixo:I W bits de índices permite um dicionário de
tamanho 2W;I dificilmente todas as entradas no dicionário
serão úteis.Estratégias quando o dicionário atinge seu limite:I não ponha mais strings,
somente use o que já está no dicionário;I jogue tudo fora e comece um novo dicionário;I dobre o dicionário, acrescentando mais um bit
aos índices (W ← W + 1);I jogue fora as entradas mais recentes
para fazer espaço para mais entrada;I ideias?
![Page 82: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/82.jpg)
Dicionário (Trie) de LZW
Fonte: algs4
![Page 83: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/83.jpg)
compress()Estatística dos dados não precisa serpassada por compress() para expand().string(i): devolve string de comprimento 1string(i): com o caracter de código i
void compress() {char *input = readString();TST st = TSTInit(); /* trie ternária */for (int i = 0; i < R; i++)
put(st, string(i), i);
/* R é o código para EOF */int code = R+1;
![Page 84: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/84.jpg)
compress()while (strlen(input) > 0) {
char *s = longestPrefixOf(st, input);write(get(st, s), W);int t = strlen(s), n = strlen(input);if (t < n && code < L) {
s = substring(input, 0, t+1);put(st, s, code++);
}input = substring(input, t, n);
}write(R, W); /* EOF */close();
}
![Page 85: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/85.jpg)
LZW expand(): exemplomsg codificada 0 1 3 5 4 1 2
output
dicionáriocódigo string
![Page 86: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/86.jpg)
LZW expand(): exemplomsg codificada 0 1 3 5 4 1 2
output
dicionáriocódigo string
0 a1 b2 EOF
![Page 87: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/87.jpg)
LZW expand(): exemplomsg codificada 0 1 3 5 4 1 2
output a
dicionáriocódigo string
0 a1 b2 EOF3 a?
![Page 88: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/88.jpg)
LZW expand(): exemplomsg codificada 0 1 3 5 4 1 2
output a b
dicionáriocódigo string
0 a1 b2 EOF3 ab
![Page 89: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/89.jpg)
LZW expand(): exemplomsg codificada 0 1 3 5 4 1 2
output a b
dicionáriocódigo string
0 a1 b2 EOF3 ab4 b?
![Page 90: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/90.jpg)
LZW expand(): exemplomsg codificada 0 1 3 5 4 1 2
output a b a b
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba
![Page 91: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/91.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 ab?
![Page 92: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/92.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 ab?
Xiii!
![Page 93: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/93.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b ?
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 ab?
Xiii!
![Page 94: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/94.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba
:-)
![Page 95: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/95.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba6 aba?
![Page 96: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/96.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a b a
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba6 aba?
![Page 97: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/97.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a b a
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba6 abab
![Page 98: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/98.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a b a
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba6 abab7 ba?
![Page 99: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/99.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a b a b
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba6 abab7 ba?
![Page 100: MAC0323Algoritmose EstruturasdeDadosII Edição2020–2](https://reader036.fdocumentos.tips/reader036/viewer/2022071118/62cb136ba6e12e554118ac62/html5/thumbnails/100.jpg)
LZW expand(): exemplomsg código 0 1 3 5 4 1 2output a b a b a b a b a b
dicionáriocódigo string
0 a1 b2 EOF3 ab4 ba5 aba6 abab7 bab