Cómo comprimir datos con la codificación Huffman: 10 pasos

Tabla de contenido:

Cómo comprimir datos con la codificación Huffman: 10 pasos
Cómo comprimir datos con la codificación Huffman: 10 pasos

Video: Cómo comprimir datos con la codificación Huffman: 10 pasos

Video: Cómo comprimir datos con la codificación Huffman: 10 pasos
Video: Siete pasos para ayudar a tu hijo a entender sus emociones. Rafa Guerrero, psicólogo 2024, Abril
Anonim

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, 0 o 1) que se asignan a ese carácter mediante una codificación llamada ASCII. Un archivo codificado con Huffman descompone la estructura rígida de 8 bits para que los caracteres más utilizados se almacenen en solo unos pocos bits ('a' podría ser "10" o "1000" en lugar del ASCII, que es "01100001"). Los caracteres menos comunes, entonces, a menudo ocupan mucho más de 8 bits ('z' podría ser "00100011010"), pero debido a que ocurren con poca frecuencia, 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

Comprimir datos mediante la codificación Huffman Paso 1
Comprimir datos mediante la codificación Huffman Paso 1

Paso 1. Cuente la frecuencia de cada carácter 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 EOF (final del archivo) y márquelo con una frecuencia de 1.

Por ejemplo, si desea codificar un archivo de texto que lea "ab ab cab", tendría 'a' con frecuencia 3, 'b' con frecuencia 3, '' (espacio) con frecuencia 2, 'c' con frecuencia 1 y EOF con frecuencia 1

Comprimir datos con la codificación Huffman Paso 2
Comprimir datos con la codificación Huffman Paso 2

Paso 2. Almacene los personajes como nodos de árbol y colóquelos en una cola de prioridad

Construirá un gran árbol binario con cada carácter como una hoja, por lo que debe almacenar los caracteres en un formato tal que puedan convertirse en nodos del árbol. Coloque estos nodos en una cola de prioridad con la frecuencia de cada personaje como prioridad de su nodo.

  • Un árbol binario es un formato de datos en el que cada dato es un nodo que puede tener hasta un padre y dos hijos. A menudo se dibuja como un árbol ramificado, de ahí el nombre.
  • Una cola es una colección de datos con un nombre adecuado en la que lo primero que entra en la cola es también lo primero que sale (como esperar en la fila). En una cola de prioridad, los datos se almacenan en orden de prioridad, de modo que lo primero que salga es lo más urgente, lo que tiene la menor prioridad, en lugar de lo primero en la cola.
  • En el ejemplo "ab ab cab", su cola de prioridad se vería así: {'c': 1, EOF: 1, '': 2, 'a': 3, 'b': 3}
Comprimir datos con la codificación Huffman Paso 3
Comprimir datos con la codificación Huffman Paso 3

Paso 3. Comience a construir su árbol

Elimine (o retire de la cola) las dos cosas más urgentes de la cola de prioridad. Cree un nuevo nodo de árbol para que sea el padre de estos dos nodos, almacenando el primer nodo como hijo izquierdo y el segundo como hijo derecho. La prioridad del nuevo nodo debe ser la suma de las prioridades de su hijo. Luego, coloque este nuevo nodo en la cola de prioridad.

La cola de prioridad ahora se ve así: {'': 2, nuevo nodo: 2, 'a': 3, 'b': 3}

Comprimir datos con la codificación Huffman Paso 4
Comprimir datos con la codificación Huffman Paso 4

Paso 4. Termina de construir tu árbol:

repita el paso anterior hasta que solo haya un nodo en la cola. Tenga en cuenta que, además de los nodos que creó para los personajes y sus frecuencias, también eliminará de la cola, se convertirá en árboles y volverá a poner en cola los nodos principales, nodos que ya son árboles.

  • Cuando haya terminado, el último nodo de la cola será la raíz del árbol de codificación, y todos los demás nodos se derivarán de él.
  • Los caracteres más utilizados serán las hojas más cercanas a la parte superior del árbol, mientras que los caracteres poco utilizados se colocarán en la parte inferior del árbol, más lejos de la raíz.
Comprimir datos mediante la codificación Huffman Paso 5
Comprimir datos mediante la codificación Huffman Paso 5

Paso 5. Cree un mapa de codificación. Camina por el árbol para llegar a cada personaje. Cada vez que visita al hijo izquierdo de un nodo, es un '0'. Cada vez que visita al hijo derecho de un nodo, es un '1'. Cuando llegue a un carácter, almacénelo con la secuencia de 0 y 1 que se necesitó para llegar allí. Esta secuencia es la que se codificará el carácter en el archivo comprimido. Guarda los personajes y sus secuencias en un mapa.

  • Por ejemplo, comience en la raíz. Visite el hijo izquierdo de la raíz y luego visite el hijo izquierdo de ese nodo. Dado que el nodo en el que estás ahora no tiene hijos, has llegado a un personaje. Este es ' '. Como caminó hacia la izquierda dos veces para llegar aquí, la codificación de '' es "00".
  • Para este árbol, el mapa se verá así: {'': "00", 'a': "10", 'b': "11", 'c': "010", EOF: "011"}.
Comprimir datos mediante la codificación Huffman Paso 6
Comprimir datos mediante la codificación Huffman Paso 6

Paso 6. En el archivo de salida, incluya el mapa de codificación como encabezado

Esto permitirá decodificar el archivo.

Comprimir datos mediante la codificación Huffman Paso 7
Comprimir datos mediante la codificación Huffman Paso 7

Paso 7. Codifique el archivo

Para cada carácter del archivo que desee codificar, 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 cab", 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 de Huffman no utiliza el formato de 8 bits, los archivos codificados a menudo no tendrán longitudes que sean múltiplos de 8. Los dígitos restantes se completarán con ceros. En este caso, se agregarían dos ceros al final del archivo, que parece 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 carácter de final de archivo, el decodificador llegará a esto y luego se detendrá, ignorando cualquier otra cosa que se haya agregado después.

Parte 2 de 2: Decodificación

Comprimir datos con la codificación Huffman Paso 8
Comprimir datos con la codificación Huffman Paso 8

Paso 1. Leer en un archivo codificado en Huffman

Primero, lea el encabezado, que debería 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.

Comprimir datos con la codificación Huffman Paso 9
Comprimir datos con la codificación Huffman Paso 9

Paso 2. Lea el binario un dígito a la vez

Atraviese el árbol mientras lee: si lee en un '0', vaya al hijo izquierdo del nodo en el que se encuentra, y si lee en un '1', vaya al hijo de la derecha. Cuando llegas a una hoja (un nodo sin hijos), has llegado a un personaje. Escriba el carácter en el archivo decodificado.

Debido a la forma en que se almacenan los caracteres en el árbol, los códigos para cada carácter tienen una propiedad de prefijo, por lo que la codificación binaria de ningún carácter puede ocurrir al comienzo de la codificación de otro carácter. La codificación de cada carácter es totalmente única. Esto hace que la decodificación sea mucho más sencilla

Comprimir datos mediante la codificación Huffman Paso 10
Comprimir datos mediante la codificación Huffman Paso 10

Paso 3. Repita hasta llegar al EOF

¡Felicidades! Has decodificado el archivo.

Recomendado: