Char Code
==== ====
E 0000
i 0001
y 0010
l 0011
k 0100
. 0101
space 011
e 10
r 1100
s 1101
n 1110
a 1111
Texto original:
Olhos misteriosos vistos perto do lago
Codificado:
0000101100000110011100010101101101001111101011111100011001111110100100101
Por que não há necessidade de um separador na codificação Huffman?
coding-theory
encoding-scheme
huffman-coding
BufBills
fonte
fonte
Eerie eyes seen near lake
(bem, exceto pelo caractere de espaço). Mas os personagens em si não precisam de separadores. Por que não é isso?cat cheat for mice
≠catch eat form ice
. Sua analogia é falha: cada letra é atômica; as letras são trivialmente distintas e intrinsecamente separáveis. Uma analogia melhor seria "Por que você pode ler um script cursivo (manuscrito), quando cada palavra é apenas uma linha longa, distorcida e com interseção automática?", E mesmo essa é uma analogia ruim, pois é possível olhar para uma palavra manuscrita ( ou até uma parte de uma) e discernir as letras individuais - enquanto uma string codificada por Huffman é sem sentido se você não pode ver o começo.Respostas:
Você não precisa de um separador porque os códigos Huffman são códigos sem prefixo (também, sem ajuda, conhecidos como "códigos de prefixo"). Isso significa que nenhuma palavra de código é um prefixo de qualquer outra palavra de código. Por exemplo, a palavra de código para "e" no seu exemplo é 10 e você pode ver que nenhuma outra palavra de código começa com os dígitos 10.
Isso significa que você pode decodificar com avidez lendo a sequência codificada da esquerda para a direita e exibindo um caractere assim que visualizar uma palavra-código. Por exemplo, 0, 00 e 000 não codificam nada, então você continua lendo bits. Quando você lê 0000, ele codifica "E" e, como o código é livre de prefixo, você sabe que não há outra palavra de código 0000x; portanto, agora você pode emitir "E" e começar a ler a próxima palavra de código. Novamente, 1 não codifica nada, mas 10 codifica "e". Nenhuma outra palavra de código começa com "10", para que você possa imprimir "e". E assim por diante.
fonte
É útil imaginá-lo como uma árvore. Você está simplesmente percorrendo a árvore até atingir um nó folha e, em seguida, reiniciando a partir da raiz. A partir do algoritmo que codifica huffman, você pode ver que esse tipo de estrutura é criado no processo.
https://en.wikipedia.org/wiki/File:HuffmanCodeAlg.png
fonte
Nenhum código diferente de E começa com 0000. Nenhum código além de i começa com 0001. E assim por diante. Como um caso extremo, nenhum código diferente de e começa com 01. Você não possui coisas como E = 0000, espaço = 000, nas quais você não saberia o que fazer se encontrar três zeros.
Veja sua sequência codificada: 0000101100000 ...
Você leu o primeiro zero. Você sabe que o código é E, i, y, l, k, vírgula ou espaço. O próximo zero significa que não é k, vírgula ou espaço, mas E, i, y ou l. O próximo zero significa que é E ou i. O próximo zero significa que é um E. Quando você sabe qual é o código, sabe que analisou todos os bits desse código.
Então você tem 101100000 ... O 1 significa que você tem e, r, s, n ou a. O próximo bit é 0, então o código é e. Novamente, você terminou com esse personagem.
fonte
Não podemos usar o separador na codificação Huffman porque o equivalente binário de cada letra não corresponde ao código prefixado de qualquer letra, portanto, podemos fazer isso sem usar o separador.
fonte