Código de Huffman

8
Código de Huffman Gustavo Pinoti Leonardo Matias Baldo Leopoldo Ferreira de Paula Lorenna de Araújo Martins Murillo Cuervo Tarôuco

Transcript of Código de Huffman

Page 1: Código de Huffman

Código de Huffman

Gustavo PinotiLeonardo Matias BaldoLeopoldo Ferreira de PaulaLorenna de Araújo MartinsMurillo Cuervo Tarôuco

Page 2: Código de Huffman

• Principio do Huffman seria usar menos bits para letras mais populares, casos que seriam mais comuns de ocorrer, como exemplo A e E sendo mais populares e Z ou K menos, assim como é usado em arquivos .zip, a compactação de arquivos depende do uso de um menor número de bits que o normal para representar dados.

Page 3: Código de Huffman

Se você quer codificar informações eficientemente, pode se usar o bem conhecido Código de Morse, podemos observar que a letra mais comum E, possui apenas 1 bip curto, o problema desta codificação é que não se pode decodificar imediatamente pois se por exemplo ouvisse um bip curto e um longo, pode representar tanto A, quanto E seguido de T, poderia se pausar em cada letra para melhor identificação, mas, qual o sentido de pausar se o objetivo é acelerar o envio de informação?

Código Morse

Page 4: Código de Huffman

Foi então que David Albert Huffman criou uma codificação que fizesse com que os padrões de letras mais populares fosse menor, e menos populares maiores, porém, sem a falha que o código morse pode causar sendo uma representação prefixo de outra.

Baseado em Árvores Binárias onde há talvez um filho a esquerda, talvez um a direito e só, por exemplo, se uma pessoa queira enviar uma mensagem assim:“ECEABEADCAEDEEEECEADEEEEEDBAAEABDBBAAEAAACDDCCEABEEDCBEEDEAEEEEEAEEDBCEBEEADEAEEDAEBCDEDEAEEDCEEAEEE”

Caso conte a frequência das letras e as dividir pelo número total de letras, obtemos a seguinte tabela:

Carácter A B C D E

Frequência 0.2 0.1 0.1 0.15 0.45

Page 5: Código de Huffman

Como podemos obter uma decodificação em binário para cada uma dessas letras de um jeito que os “E”s tenham um padrão pequeno e “B”s e “C”s tenham um padrão um pouco mais longo?

De um jeito mais rudimentar podemos pensar na linguagem C como variáveis float representando as frequências e variáveis char representando as letras, no nível maior, representa uma floresta de cinco árvores onde cada uma delas tem apenas um Nó, o que Huffman propõe é combinar essas árvores que tem menores frequências em árvores um pouco maiores as fundindo por uma nova árvore que recebe um filho a esquerda e um a direita, após isso repete o processo buscando os dois menores nós, os juntam até que se obtenha uma única árvore.

Page 6: Código de Huffman
Page 7: Código de Huffman

Assim obtemos a codificação de Huffman onde a letra E, é representado por 1, pois deve-se apenas mover a direita para se chegar, já o A, será representado por 01, pois deve-se mover a esquerda depois a direita para se chegar até ele, seguindo essa lógica obtemos: 100011010000101001000101100111110001101001111110010000010110100000010000000001011010101000100100100010001101000011001000100001100110111111011100100000001100001101001101110010110000000100110011011100100011101111

Não tem como se confundir ou conflitar entre as letras pois estão todas sendo construídas da raiz para as folhas, os padrões são determinantes e únicos para cada letra resolvendo a ambiguidade de Morse.

Page 8: Código de Huffman

A sua grande utilidade é que se caso você queira enviar uma mensagem prensada pela internet, melhor que usar a comum tabela ASCII, pode-se enviar uma “mensagem Huffman codificada” onde caso queira enviar a letra E, utilizará apenas 1 bit, contrário aos comuns 8 bits seguidos de outros 8 bits. O problema desta codificação é que a escolha entre frequências iguais é feito de forma arbitrária (B e C = 10%) portanto receptor da mensagem codificada não consegue codificá-la sem antes ser informado o mapeamento da árvore. A sacada do uso do codificação de Huffman vem de que seja enviada apenas mensagens médias ou grandes pois enviar uma mensagem pequena como Oi, seria enviado apenas 3 bits, porém informar o mapeamento da árvore daria muito mais trabalho e “pesar mais” que apenas enviar os 16 bits de uma vez, podemos ver o caso de arquivos Zips que se forem muito pequenos, eles podem até aumentar o tamanho para compressão, mas o zip identifica e não executa nada.