Cómo comprimir datos usando huffman coding

El algoritmo de Huffman se utiliza para comprimir o codificar datos. Normalmente, cada carácter en un archivo de texto se almacena como ocho bits (dígitos, ya sea 0 o 1) que el mapa con ese personaje usando una codificación llamada ASCII. Un archivo codificado con Huffman se rompe la estructura rígida de 8 bits para que los caracteres más utilizados se almacenen en un solo unos pocos bits (`A` podría ser "10" o "1000" en lugar de la ASCII, que es "01100001"). Los caracteres menos comunes, entonces, a menudo ocuparán mucho más de 8 bits (`Z` podría ser "00100011010"), pero como ocurren, rara vez, la codificación de Huffman, en general, crea un archivo mucho más pequeño que el original.

Pasos

Parte 1 de 2:
Codificación
  1. Imagen titulada Comprimir datos usando Huffman codificación Paso 1
1. Contar la frecuencia de cada personaje en el archivo a codificar. Incluya un carácter ficticio para marcar el final del archivo, esto será importante más adelante. Por ahora, llámelo el EOF (final del archivo) y marquelo como una frecuencia de 1.
  • Por ejemplo, si desea codificar un archivo de texto que lee "AB AB CABING," Tendría `A` con frecuencia 3, `B` con frecuencia 3, `` (espacio) con frecuencia 2, `C` con frecuencia 1, y EOF con frecuencia 1.
  • Imagen titulada Comprimir datos usando Huffman codificación Paso 2
    2. Almacene los caracteres como nodos de los árboles y póngalos en una cola de prioridad. Estarás construyendo un gran árbol binario con cada personaje como una hoja, por lo que debe almacenar los personajes en un formato de manera que puedan convertirse en nodos del árbol. Coloque estos nodos en una cola de prioridad con la frecuencia de cada personaje como la prioridad de su nodo.
  • Un árbol binario es un formato de datos donde cada pieza de datos es un nodo que puede tener hasta un padre y dos niños. A menudo se dibuja como un árbol ramificador, de ahí el nombre.
  • Una cola es una recolección de datos con nombre acertadamente donde la primera cosa para entrar en la cola también es la primera cosa que debe salir (como esperar en línea). en un prioridad cola, los datos se almacenan en orden de su prioridad, de modo que lo primero que debe salir es lo más urgente, la cosa con la prioridad más pequeña, en lugar de lo primero enqueado.
  • En el "AB AB CABING" Ejemplo, su cola prioritaria se vería así: {`C`: 1, EOF: 1, ``: 2, `A`: 3, `B`: 3}
  • Imagen titulada Comprimir datos usando Huffman codificación Paso 3
    3. Empezar a construir tu árbol. Eliminar (o dede) Las dos cosas más urgentes de la cola de prioridad. Cree un nuevo nodo de árbol para ser el padre de estos dos nodos, almacenando el primer nodo como su hijo izquierdo y el segundo como su hijo derecho. La prioridad del nuevo nodo debe ser la suma de las prioridades de su hijo. Luego se enveja este nuevo nodo en la cola de prioridad.
  • La cola de prioridad ahora se ve así: {``: 2, NUEVO NODE: 2, `A`: 3, `B`: 3}
  • Imagen titulada COMPRESS DATOS usando Huffman codificación Paso 4
    4. Termina construir tu árbol: Repita el paso anterior hasta que haya un solo nodo en la cola. Tenga en cuenta que, además de los nodos que creó para los personajes y sus frecuencias, también serás saliente, se convirtió en árboles y volvió a enminar los nodos de los padres, los nodos que ya son en sí.
  • Cuando hayas terminado, el último nodo en la cola será el raíz del árbol de codificación, con todos los otros nodos ramificándose de ella.
  • Los caracteres más utilizados serán las hojas más cercanas a la parte superior del árbol, mientras que los caracteres raramente usados ​​se colocarán en la parte inferior del árbol, más alejados de la raíz.
  • Imagen titulada COMPRESS DATOS usando Huffman codificación Paso 5
    5. Crear un mapa de codificación. Camina por el árbol para llegar a cada personaje. Cada vez que visita el niño izquierdo de un nodo, eso es un `0`. Cada vez que visita el niño derecho de un nodo, eso es un `1`. Cuando llegues a un personaje, guarde el carácter con la secuencia de 0s y 1s que tomó para llegar allí. Esta secuencia es lo que el personaje se codificará como en el archivo comprimido. Almacena los caracteres y sus secuencias en un mapa.
  • Por ejemplo, comience en la raíz. Visite el niño izquierdo de la raíz y luego visite el niño izquierdo del nodo. Dado que el nodo en el que en este momento no tiene hijos, ha llegado a un personaje. Esto es ` `. Desde que caminaste dos veces para llegar aquí, la codificación para `` es "00".
  • Para este árbol, el mapa se verá así: {``:"00", `a`:"10", `B`:"11", `C`:"010", Eof:"011"}.
  • Imagen titulada Comprimir datos usando Huffman codificación Paso 6
    6. En el archivo de salida, incluya el mapa de codificación como un encabezado. Esto permitirá que el archivo sea decodificado.
  • Imagen titulada Comprimir datos usando Huffman codificación Paso 7
    7. Codificar el archivo. Para que cada personaje en el archivo se codifique, escriba la secuencia binaria que ha almacenado en el mapa. Una vez que haya terminado de codificar el archivo, asegúrese de agregar el EOF al final.
  • Para el archivo "AB AB CABING", El archivo codificado se verá así: "1011001011000101011011".
  • Los archivos se almacenan como bytes (8 bits, u 8 dígitos binarios). Debido a que el algoritmo de codificación Huffman no usa el formato de 8 bits, los archivos codificados a menudo no tendrán longitudes que son múltiplos de 8. Los dígitos restantes se rellenarán con 0s. En este caso, se agregarían dos 0s al final del archivo, que se parece a otro espacio. Esto podría ser un problema: ¿cómo sabría el decodificador cuándo dejar de leer?? Sin embargo, debido a que incluimos un personaje final del archivo, el decodificador llegará a esto y luego se detendrá, ignorando cualquier otra cosa que se haya agregado después de.
  • Parte 2 de 2:
    Descodificación
    1. Imagen titulada Comprimir datos usando Huffman codificación Paso 8
    1. Leer en un archivo codificado con Huffman. Primero, lea el encabezado, que debe ser el mapa de codificación. Use esto para construir un árbol de decodificación de la misma manera que construyó el árbol que usó para codificar el archivo. Los dos árboles deben ser idénticos.
  • Imagen titulada Comprimir datos usando Huffman codificación Paso 9
    2. Leer en el binario un dígito a la vez. Traverse el árbol a medida que lee: Si lees en un `0`, vaya al niño izquierdo del nodo, y si lees en un `1`, vaya al niño derecho. Cuando llegas a una hoja (un nodo sin hijos), has llegado a un personaje. Escribe el personaje en el archivo decodificado.
  • Debido a la forma en que se almacenan los personajes en el árbol, los códigos para cada personaje tienen un Propiedad Prefix, para que la codificación binaria de ningún personaje pueda ocurrir al comienzo de la codificación de otro personaje. La codificación para cada personaje es totalmente única. Esto hace que la decodificación sea mucho más fácil.
  • Imagen titulada Comprimir datos usando Huffman codificación Paso 10
    3. Repita hasta que llegues al EOF. Felicidades! Has decodificado el archivo.
  • Consejos

    Artículos Relacionados