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ón1. 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.
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.
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.
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í.
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.
6. En el archivo de salida, incluya el mapa de codificación como un encabezado. Esto permitirá que el archivo sea decodificado.
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.
Parte 2 de 2:
Descodificación1. 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.
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.
3. Repita hasta que llegues al EOF. Felicidades! Has decodificado el archivo.