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:
Ojos misteriosos vistos cerca del lago
Codificado:
0000101100000110011100010101101101001111101011111100011001111110100100101
¿Por qué no hay necesidad de un separador en la codificación de Huffman?
coding-theory
encoding-scheme
huffman-coding
BufBills
fuente
fuente
Eerie eyes seen near lake
(bueno, excepto el carácter de espacio). Pero los personajes en sí no necesitan separadores. ¿Por qué no es eso?cat cheat for mice
≠catch eat form ice
. Su analogía es defectuosa: cada letra es atómica; Las letras son trivialmente distinguidas e intrínsecamente separables. Una mejor analogía sería "¿Por qué puedes leer un guión cursivo (escrito a mano), cuando cada palabra es solo una línea larga, ondulada y auto intersectada?", E incluso esa es una analogía pobre, ya que puedes ver una palabra escrita a mano ( o incluso una parte de uno) y discernir las letras individuales, mientras que una cadena codificada por Huffman es un galimatías si no puede ver el comienzo.Respuestas:
No necesita un separador porque los códigos de Huffman son códigos sin prefijo (también, inútilmente, conocidos como "códigos de prefijo"). Esto significa que ninguna palabra de código es un prefijo de ninguna otra palabra de código. Por ejemplo, la palabra de código para "e" en su ejemplo es 10, y puede ver que ninguna otra palabra de código comienza con los dígitos 10.
Esto significa que puede decodificar codiciosamente leyendo la cadena codificada de izquierda a derecha y generando un carácter tan pronto como haya visto una palabra de código. Por ejemplo, 0, 00 y 000 no codifican nada, así que sigue leyendo bits. Cuando lee 0000, eso codifica "E" y, dado que el código no tiene prefijo, sabe que no hay otra palabra de código 0000x, por lo que ahora puede generar "E" y comenzar a leer la siguiente palabra de código. Nuevamente, 1 no codifica nada pero 10 codifica "e". Ninguna otra palabra de código comienza con "10", por lo que puede generar "e". Y así.
fuente
Es útil imaginarlo como un árbol. Simplemente está atravesando el árbol hasta llegar a un nodo hoja y luego reiniciando desde la raíz. Desde el algoritmo que codifica huffman, puede ver que este tipo de estructura se crea en el proceso.
https://en.wikipedia.org/wiki/File:HuffmanCodeAlg.png
fuente
Ningún código que no sea E comienza con 0000. Ningún código que no sea I comienza con 0001. Y así sucesivamente. Como caso extremo, ningún código que no sea e comienza con 01. No tiene cosas como E = 0000, espacio = 000, donde no sabría qué hacer si encuentra tres ceros.
Mire su cadena codificada: 0000101100000 ...
Lees el primer cero. Usted sabe que el código es uno de E, i, y, l, k, coma o espacio. El siguiente cero significa que no es k, coma o espacio, sino E, i, y o l. El siguiente cero significa que es E o i. El siguiente cero significa que es una E. Cuando sabes qué código es, sabes que has analizado todos los bits para ese código.
Entonces tienes 101100000 ... El 1 significa que tienes e, r, s, no a. El siguiente bit es 0, entonces el código es e. De nuevo, ya terminaste con ese personaje.
fuente
No podemos usar separador en la codificación de Huffman porque el equivalente binario de cada letra no coincide con el código prefijado de ninguna letra, por lo que podemos hacerlo sin siquiera usar el separador.
fuente