UFSM-CTISM Comunicação de Dados Aula-16 CÓDIGOS DE HUFFMAN Professor: Andrei Piccinini Legg Santa Maria, 2012 CÓDIGOS DE HUFFMAN Definição: A codificação de Huffman é uma técnica para a compressão de dados, amplamente usada e muito efetiva. Exemplo: Um arquivo contem 100.000 caracteres. Se sabe que é composto apenas por 6 caracteres diferentes e a frequência de aparição de cada um deles é: Frequência a 45 b 13 c 12 d 16 e 9 f 5 Como codificar os caracteres para comprimir o espaço ocupado utilizando um código binário? Solução 2 Código de comprimento variable, as palavras com maior frequência possuem o rótulo mais curto. Restrição: nenhum rótulo pode ser prefixo de outro.(224000 bits) comprimento variável a 0 b 101 c 100 d 111 e 1101 f 1100 Solução 2 comprimento variável a 0 b 101 c 100 d 111 e 1101 f 1100 Esta técnica de codificação se denomina de código prefixo. Codificação: Basta concatenar o código de cada um dos caracteres. Exemplo : aabacd ⇒ 0-0-101-0-100-111 ⇒ 001010100111 Decodificação: Fácil porque nenhuma palavra do código é prefixo do outra. Não existe ambiguidade. Exemplo : 001010100111 ⇒ aabacd Solução 2 Uma estrutura em árvore é uma forma de representar o código prefixo que simplifica o processo de decodificação: As folhas são os símbolos; O caminho da raiz até as folhas com o 0 para esquerda e 1 para direita corresponde ao código para cada folha. 100 1 0 86 14 0 1 58 0 a : 45 0 28 1 b : 13 0 c : 12 14 1 d : 16 0 e:9 Comprimento fixo! 1 f :5 Solução 2 100 1 0 55 a : 45 0 1 25 0 b : 13 30 1 0 1 c : 12 14 d : 16 0 f :5 1 e:9 Comprimento variável! Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. passo 1 Dada uma distribuição de frequência (probabilidade) para o aparecimento dos símbolos, coloca-la em ordem crescente: Frequência a 42 b 13 c 8 d 15 e 12 f 4 g 6 c 8 g 6 f 4 Colocando em ordem crescente temos: Frequência a 42 d 15 b 13 e 12 Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. passo 2 Vamos começar a estruturar nossa arvore partindo dos últimos dois símbolos (os com menor probabilidade de transmissão), e reordenar as probabilidades em na ordem crescente. Esse passo será repetido diversas vezes. Acompanhem o procedimento. Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. a : 42 a : 42 d : 15 d : 15 b : 13 b : 13 e : 12 e : 12 c:8 10 1 g:6 f :4 c:8 0 Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. a : 42 a : 42 a : 42 d : 15 d : 15 18 b : 13 b : 13 d : 15 e : 12 e : 12 b : 13 1 c:8 1 g:6 f :4 e : 12 10 0 c:8 0 Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. a : 42 a : 42 a : 42 a : 42 d : 15 d : 15 18 25 b : 13 b : 13 d : 15 18 1 e : 12 e : 12 0 1 c:8 1 f :4 e : 12 10 g:6 0 c:8 0 d : 15 b : 13 Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. a : 42 a : 42 a : 42 a : 42 a : 42 d : 15 d : 15 18 25 33 b : 13 b : 13 d : 15 18 1 25 1 0 e : 12 e : 12 c:8 10 0 1 1 g:6 f :4 0 e : 12 0 c:8 d : 15 b : 13 Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. a : 42 a : 42 a : 42 a : 42 a : 42 d : 15 d : 15 18 25 33 b : 13 b : 13 d : 15 18 e : 12 e : 12 b : 13 c:8 10 58 1 1 0 25 1 0 0 1 1 g:6 f :4 0 e : 12 0 c:8 d : 15 a : 42 Algoritmo Greedy Huffman inventou um algoritmo simples para construir um código prefixo ótimo. a : 42 a : 42 a : 42 a : 42 a : 42 d : 15 d : 15 18 25 33 b : 13 b : 13 d : 15 18 e : 12 e : 12 b : 13 c:8 10 58 1 1 0 25 1 0 0 1 1 g:6 f :4 0 e : 12 0 c:8 d : 15 a : 42 1 0 100