SlideShare una empresa de Scribd logo
1 de 15
Universidad de Cuenca
Programación 3 G#2
Algoritmos de Compresión
Jonnathan Cuvi, Vanessa Romero, Belen Toledo
jinnathan.cuvi@ucuenca.ec - vanessa.romero@ucuenca.ec - belen.toledo@ucuenca.ec
28 de junio de 2017
Resumen
El presente documento tiene como objetivo dar a conocer los algoritmos de
compresión: Huffman y Burrow-Wheeler, en el mismo se encontrará los materiales,
métodos y código implementado para poner en práctica dichos algoritmos, así como
un ejemplo del funcionamiento de cada uno de ellos. El algoritmo de compresión
Huffman consiste en comprimir un archivo de entrada utilizando el menor número
posible de bits para lo cual se utiliza un árbol binario y al seguir un camino desde la
raíz a cada una de las hojas se tenga un código Huffman asociado a él. El algoritmo
de compresión de Burrow-Wheeler también se lo conoce como compresión por
ordenación de bloques este algoritmo transforma cadenas de caracteres cambiando
la posición de estos, pero nunca los modifica y si en la cadena de entrada existen
caracteres iguales, se obtiene una nueva cadena con varias secuencias de
caracteres repetidos, lo que facilita la compresión.
Introducción
La compresión consiste en el procedimiento de obtener una expresión de menor
tamaño a partir de su expresión original algunos de los algoritmos que nos permiten
realizar compresión son Huffman y Burrow-Wheeler los cuales no solo nos permiten
realizar la compresión de datos, sino que también permiten realizar compresión de
texto. El algoritmo de Huffman realiza la compresión a través de un árbol binario que
contendrá símbolos o caracteres en sus hojas, el árbol se construirá de forma que
desde la raíz a cada una de sus hojas se generara un código en bits (0, 1) teniendo
en cuenta que las aristas a la izquierda van contener ceros y las aristas a la derecha
unos. Mientras que el algoritmo de Burrow-Wheeler en sí no comprime si no realiza
una serie de rotaciones y ordenamientos que permite organizar al texto de manera
que agrupa a los caracteres que sean iguales, para así implementar el algoritmo de
compresión RLE o Run Lenght Encoding (Codificación de Longitud de Compresión)
el cual utiliza una mezcla de números y caracteres para representar una cadena de
texto, es decir, codifica un primer elemento al dar el número de repeticiones del
valor que se va a repetir y después el valor que se va a repetir, de esta manera la
longitud del texto original será de un tamaño mucha más pequeño. La eficiencia de
un algoritmo de compresión radica en su forma de implementar dicha compresión
así como el tiempo empleado para realizar el codificado de los datos.
Materiales y Métodos
IDE NetBeans 8.1
Code Blocks 16.01
Código fuente de Algoritmo de Huffman
Código fuente de Algoritmo Compresión Burrow-Wheeler
Algoritmo de Huffman
El algoritmo de Huffman es un algoritmo desarrollado por David A. Huffman en el
año 1952 mientras desarrollaba un doctorado en el MIT (Instituto de Tecnológico de
Massachusetts), y la descripción del método fue publicado en una revista bajo el
título de “ A Method for the Construction of Minimum-Redundancy Codes ” el cual
trata sobre el desarrollo de un método óptimo de codificación de un conjunto de
mensajes que consta de un número finito de miembros, y que un código de
redundancia mínima es uno construido de tal manera que se minimiza el número
medio de dígitos de codificación por mensaje.
Este algoritmo toma un alfabeto de n símbolos, junto con sus frecuencias de
aparición asociadas, y produce un código de Huffman para ese alfabeto y esas
frecuencias.
para utilizar el algoritmo de Huffman se debe de conocer la frecuencia con la que
aparece cada símbolo.
La eficiencia de la codificación de Huffman también depende del balance que exista
entre los hijos de cada nodo del árbol, siendo más eficiente conforme menor sea la
diferencia de frecuencias entre los dos hijos de cada nodo.
Funcionamiento
El problema consiste en comprimir un archivo de entrada utilizando el menor
número posible de bits. Existe un algoritmo que resuelve el problema, y que es
conocido como el algoritmo de Huffman
El algoritmo de Huffman consiste en crear un árbol binario que tendrá símbolos
como hojas y el árbol será construido de manera que si seguimos desde la raíz a
cada una de las hojas se tenga un código Huffman asociado a él.
1. Crear varios árboles, uno por cada uno de los símbolos del alfabeto,
basándose cada uno de los árboles en un nodo sin hijos, y etiquetado cada
uno con su símbolo asociado y su frecuencia de aparición.
2. Se toman los dos árboles de menor frecuencia, y se unen creando un nuevo
árbol. La etiqueta de la raíz será la suma de las frecuencias de las raíces de
los dos árboles que se unen, y cada uno de estos árboles será un hijo del
nuevo árbol. También se etiquetan las dos ramas del nuevo árbol: con un 0 la
de la izquierda, y con un 1 la de la derecha.
3. Se repite el paso 2 hasta que sólo quede un árbol.
Con este árbol se puede conocer el código asociado a un símbolo, así como obtener
el símbolo asociado a un determinado código.
Para obtener el código asociado a un símbolo se debe proceder del siguiente
modo:
1. Comenzar con un código vacío.
2. Iniciar el recorrido del árbol en la hoja asociada al símbolo.
3. Comenzar un recorrido del árbol hacia arriba.
4. Cada vez que se suba un nivel, añadir al código la etiqueta de la rama que se
ha recorrido.
5. Tras llegar a la raíz, invertir el código.
6. El resultado es el código Huffman deseado.
Para obtener un símbolo a partir de un código se debe hacer así:
1. Comenzar el recorrido del árbol en la raíz de éste.
2. Extraer el primer símbolo del código a descodificar.
3. Descender por la rama etiquetada con ese símbolo.
4. Volver al paso 2 hasta que se llegue a una hoja, que será el símbolo
asociado al código.
Casi siempre se utiliza el árbol para obtener todos los códigos de una sola vez;
luego se guardan en tablas y se descarta el árbol.
Ejemplo funcionamiento:
1. Elegiremos una palabra para codificar.
2. Separar por caracteres.
3. Contabilizar el número de repeticiones de cada carácter si hay repeticiones
eliminamos la repetida. (ver Imagen 1)
4. Ordenar los caracteres (menor a mayor) de acuerdo al número de
repeticiones. (ver Imagen 2)
5. En una lista enlazada de árboles insertamos los caracteres con su respectivo
número de repeticiones cada carácter con su número representa la raíz de un
árbol nuevo.
6. Creamos el nodo que tendrá por carácter la letra y el número de repeticiones
que la letra tiene. (Se realiza esto con todas las letras). (ver Imagen 3)
7. Se toman los dos primeros nodos de las listas y se crea un nuevo nodo árbol
que por raíz tendrá un carácter nulo y la suma de las repeticiones de los dos
nodos tomados. (ver Imagen 4)
8. El primer nodo tomado se lo enlazada del lado izquierdo del árbol y el
segundo nodo del lado derecho. (ver Imagen 4)
9. Insertamos ordenadamente el nodo nuevo en función del número que tiene
la raíz. (ver Imagen 5)
10.Se repite el proceso desde el paso 7 si ya existe un nodo con el mismo
número el nodo se inserta después del nodo que ya estaba registrado.
11.Al tener un solo nodo árbol denotamos los caminos que vayan a la izquierda
con un cero (0) y los de la derecha con un uno (1). (ver Imagen 6)
12.Se elabora una lista con los caminos que van de la raíz a cada carácter.
13.Se vuelve a descomponer en caracteres la palabra que se deseaba codificar.
14.Compondremos la palabra por el camino que representa cada carácter que
esta palabra contiene. (ver Imagen 7)
15.Finalmente obtenemos el código Huffman juntando toda la cadena de ceros y
unos obtenida. (ver Imagen 7)
Análisis código Huffman
El algoritmo de compresión Huffman ha sido implementado en el IDE Code blocks
utilizando el lenguaje de programación C en el cual se ha implementado un File
denominado Huffman.c el cual contendrá varios métodos que serán los encargados
de realizar el debido proceso para la compresión de un archivo.
Para iniciar se define una estructura llamada nodo que contendrá los valores cuenta
que será el encargado de contabilizar las apariciones de un carácter en el texto, bit
valor que variará entre cero y uno, Karacter almacenará los caracteres al momento
de la descompresión, el puntero código el cual almacenará una cadena de ceros y
unos con la codificación, nbits nos indicará el número de bites de cada carácter.
El método preparar_hojas tiene como parámetro un char *archivo, este método
como su nombre lo indica es el encargado de preparar las hojas es decir recorre el
documento.
El método tejer es el encargado de formar el árbol mientras va recorriendo los
nodos buscando los nodos con menor valor es decir sigue tejiendo hasta que solo
nos quede un nodo.
La función codificar una vez construido el árbol, se puede codificar cada carácter.
Para eso se recorre desde la hoja a la raíz, apunta 0 o 1 en una pila y luego se pasa
la pila a una cadena. Cuando el puntero w tenga un valor de 2 esto determinara el
fin de la cadena.
La función debug es la encargada de imprimir información sobre cada carácter
como el número de apariciones del carácter y la cadena en la se codifica ese
carácter.
La función escribe_cabecera es la encargada de escribir la cabecera del archivo, la
cabecera contiene el número de bytes del archivo original, el número de caracteres
distintos en el archivo y una lista de parejas de caracteres, información necesaria
para la descompresión.
La función comprimir Una vez construido el árbol y codificado cada carácter se
puede proceder a la compresión: se tomará carácter a carácter del archivo origen y
se usará la cadena de codificación para ir escribiendo bits en un buffer de un
carácter, que cada vez que quede lleno se pasará al archivo de destino.
La función descomprimir es la encargada de descomprimir el archivo, el primer
paso que realiza es leer la cabecera para obtener la información necesaria para este
proceso.
El método mostrar_contenido es la cual nos permitirá visualizar el contenido del
archivo.
Algoritmo de transformación Burrows – Wheeler
El algoritmo de transformación de Burrows-Wheeler (BWT) es un algoritmo usado
en técnicas de compresión de datos al cual también se lo conoce como compresión
por ordenación de bloques. En 1994 Michael Burrows y David Wheeler crearon este
algoritmo basándose en un trabajo, nunca publicado, realizado por Wheeler en
1983.
Este algoritmo transforma cadenas de caracteres cambiando la posición de estos,
pero nunca modificándolos. Si en la cadena de entrada existen caracteres iguales,
con esta transformación se obtiene una nueva cadena con varias secuencias de
caracteres repetidos, lo que facilita la compresión. Esto no quiere decir que todos
los caracteres repetidos se agrupen, pero si algunos de ellos. (Tabla 1)
Funcionamiento
A continuación, se pueden ver los pasos que se deben seguir para realizar la
transformación Burrows-Wheeler. Para que se entienda de una mejor manera el
funcionamiento se va a realizar un ejemplo donde se utiliza la palabra esperanza
como cadena de entrada.
1. Lo primero que se debe realizar son las rotaciones, para esto hay que ir
rotando un carácter de la cadena hacia un lado hasta que el primero se convierta
en el último o al revés.
Para realizar este proceso puede servir de ayuda utilizar una matriz de tamaño
nxn, donde n es el número de caracteres que tiene la cadena que queremos
transformar.
En el ejemplo se puede observar cómo se empieza en la primera fila con la
cadena de entrada que en este caso es esperanza y en cada fila se van
moviendo las letras una posición hacia la derecha hasta que la primera letra
(letra marcada de color rojo) llega a estar en la última fila y última columna,
posición (9,9). (Tabla 2)
2. En segundo lugar, se debe ordenar todas las cadenas que se han obtenido al
hacer las rotaciones. El número de cadenas obtenidas debe ser igual al número
de caracteres que contiene la cadena original.
En la Tabla 3 se pueden ver todas las filas del ejemplo que se está realizando
ordenadas alfabéticamente, empezando por la primera fila hasta la novena.
3. Por último, formamos la cadena transformada uniendo el último carácter de
cada cadena resultante de la rotación. Debemos de realizar esta unión
respetando el orden de las cadenas ordenadas alfabéticamente.
La cadena resultante del ejemplo es zrpaaseen, la cual se ha obtenido al unir
todas las letras de la última columna empezando desde la primera fila hasta la
novena, para respetar el orden alfabético realizado en el paso anterior. (Tabla 4)
Este algoritmo de compresión también nos permite realizar el proceso inverso para
el cual la cadena de entrada es la que se obtuvo al realizar la transformación. Para
explicar la transformación inversa se va a seguir con el ejemplo anterior. A
continuación, se presentan los pasos que se deben seguir.
1. Se coloca la cadena de entrada en forma de columna para así obtener todas
las cadenas que se formaron con las rotaciones.
Para el ejemplo que se está revisando, en este paso se puede observar en la
Tabla 5 como se ha colocado la cadena zrpaaseen en la novena columna.
2. Se debe ordenar alfabéticamente la columna que se obtuvo en el paso
anterior. (Tabla 6)
3. Se coloca la cadena transformada en la columna anterior.
En el ejemplo se coloca la cadena transformada en la columna ocho. (Tabla 7)
4. Se ordenan las cadenas que se han obtenido en el paso 3. (Tabla 8)
5. Se repiten los dos últimos pasos (3 y 4) hasta que se obtenga una cadena de
longitud igual a la original.
6. Se escoge la cadena que contiene en el inicio el carácter que se señaló como
inicial, si este fue el caso, o de lo contrario la que contiene en el final el carácter
que se señaló como final del archivo.
Para el ejemplo que se ha realizado debemos de escoger la cadena de la
cuarta fila ya que tiene el carácter inicial (Tabla 3). Podemos ver que
efectivamente esta cadena es la cadena inicial: esperanza.
Algoritmo de compresión Run-length encoding
Uno de los algoritmos que se puede utilizar para comprimir un archivo después de
aplicar la transformación de Burrows-Wheeler es la compresión Run-length
encoding (RLE) ya que este algoritmo se utiliza cuando en un archivo existen
bastantes caracteres repetidos y juntos.
Este algoritmo es de compresión de datos sin pérdidas y consiste en colocar solo un
carácter de la secuencia de caracteres junto con el recuento de estos, en caso que
haya un carácter solo igualmente se lo coloca junto con el número uno.
Un ejemplo sencillo de este algoritmo de compresión es el siguiente:
Si se tiene como cadena de entrada aaaaafuuuddppp y se aplica RLE se obtiene la
cadena de salida: 5a1f3u2d3p.
En este ejemplo se puede observar cómo se ha pasado de tener catorce caracteres
(aaaaafuuuddppp) a diez (5a1f3u2d3p).
Análisis código Burrows-Wheeler
Tanto el algoritmo de transformación de Burrows-Wheeler como el algoritmo de
compresión Run-length Enconding fueron implementados en el IDE Netbeans 8.1,
en el lenguaje de programación Java.
Estos dos algoritmos se implementaron juntos y para ello se creó una clase a la que
se llamó burrowswheelertransform. Dentro de esta clase se encuentran varias
funciones que están descritas a continuación.
La función main donde se tiene un pequeño menú que permite procesar el archivo
para realizar la compresión, mostrar el archivo que se va a comprimir y salir del
programa.
Función procesar, aquí se realiza la llamada a todas las funciones que se necesitan
para realizar la transformación y compresión.
Función invertBWT en la que se realiza el proceso inverso de la transformación de
Burrows-Wheeler para poder obtener nuevamente la cadena original después de
aplicar la transformación.
La función runLengthEncode es la que se utiliza para realizar la compresión Run-
length encoding. Dentro de esta función se recibe la cadena que se desea
comprimir, se la va recorriendo y contando el número de caracteres repetidos, en
una secuencia, para formar la cadena comprimida uniendo el carácter con el
número.
La función generateRotations genera todas las rotaciones de la cadena de entrada,
esto lo hace recorriendo la cadena una posición cada vez y colocándola en una
matriz.
La función lastChars nos devuelve los caracteres que se encuentran en la última
fila de la matriz.
La función printStringArray es la que nos muestra cada fila de la matriz después
de ver sido ordenada.
Función sortStrings ordena la matriz obtenida al hacer las rotaciones.
Función swap intercambia dos posiciones dadas en una matriz ya que se necesita a
la hora de ordenar la matriz.
Conclusión
Como pudimos observar los algoritmos de compresión permite representar una
cadena de texto, en una expresión más pequeña a través de la cadena original
haciendo más fácil el manejo de dicha cadena debido su tamaño reducido. Pero hay
que tener en cuenta algunos algoritmos de compresión en ciertas ocasiones no son
muy eficientes al momento de comprimir, como es el caso del algoritmo RLE ya que
cuando una cadena de texto no contiene símbolos o caracteres repetido en lugar de
reducir su tamaño incrementa el tamaño de la cadena ya que además de tener la
cadena original se introduce el número de repeticiones de cada carácter que en el
caso de no tener símbolos repetidos sería uno.
Referencias
● Jiménez, A., 2006. Algoritmo de Huffman [WWW Document]. Xataka Ciencia.
URL: https://www.xatakaciencia.com/matematicas/algoritmo-de-huffman
(accessed 6.23.17).
● René Mtz, 2012. Algoritmo de Huffman.
● Algoritmo de Huffman, 2017. . Wikipedia, la enciclopedia libre.
● Algoritmo de Huffman - YouTube [WWW Document], n.d. URL
https://www.youtube.com/watch?v=8Gf8wutvS1w (accessed 6.23.17).
● Compresión de Burrows-Wheeler. (2017, enero 26). En Wikipedia, la
enciclopedia libre. Recuperado a partir de
https://es.wikipedia.org/w/index.php?title=Compresi%C3%B3n_de_Burrows-
Wheeler&oldid=96453773
● Giménez, R. (2004). Algoritmos de Compresión Sin Pérdida de Datos.
Obtenido de http://jeuazarru.com/wp-
content/uploads/2014/10/Compresion.pdf
ANEXOS
ENLACES:
Codificación: https://github.com/JonnathanCuvi/Huffman-y-Burrow-Wheeler
Informe:
Diapositivas:
IMAGENES:
Imagen1: Separación y contabilización de caracteres
Imagen 2: Ordenación de caracteres.
Imagen 3: Creación de nodos.
imagen 4: Creación de nuevo nodo
Imagen 5: Insertando el nuevo nodo
Imagen 6: Obtención de un solo nodo árbol.
Imagen 7: Obtención del Código Huffman
TABLAS
Cadena de entrada esperanza
Cadena de salida zrpaaseen
Tabla 1. Ejemplo de compresión Burrows-Wheeler.
E S P E R A N Z A
A E S P E R A N Z
Z A E S P E R A N
N Z A E S P E R A
A N Z A E S P E R
R A N Z A E S P E
E R A N Z A E S P
P E R A N Z A E S
S P E R A N Z A E
Tabla 2. Rotación de la cadena de entrada.
A E S P E R A N Z
A N Z A E S P E R
E R A N Z A E S P
E S P E R A N Z A
N Z A E S P E R A
P E R A N Z A E S
R A N Z A E S P E
S P E R A N Z A E
Z A E S P E R A N
Tabla 3. Ordenación alfabética de las cadenas obtenidas en las rotaciones.
Tabla 4. Obtención de la cadena transformada.
Z
R
P
A
A
S
E
E
N
Tabla 5. Colocación de la cadena transformada en la última columna.
Última columna de las cadenas
ordenadas
Cadena resultante de la
transformación.
Z
R
P
A
A
S
E
E
N
ZRPAASEEN
Tabla 6. Ordenación alfabéticamente de la cadena de entrada.
Z A
R A
P E
A E
A N
S P
E R
E S
N Z
Tabla 7. Colocación de la cadena transformada en la columna anterior.
A
A
E
E
N
P
R
S
Z
A E
A N
E R
E S
N Z
P E
R A
S P
Z A
Tabla 8. Ordenación alfabética de las cadenas formadas

Más contenido relacionado

La actualidad más candente

Fundamentos de programación librería string C++
Fundamentos de programación librería string C++Fundamentos de programación librería string C++
Fundamentos de programación librería string C++Milton Nicolay
 
Cadenas y funciones de cadena
Cadenas y funciones de cadenaCadenas y funciones de cadena
Cadenas y funciones de cadenaTensor
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de stringyimfer1
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de stringcyberleon95
 
Examen De Estructura De Datos
Examen De Estructura De DatosExamen De Estructura De Datos
Examen De Estructura De Datosvanessa peñafiel
 
Curso MPLAB pic 3 empezando con el programa 9p
Curso MPLAB pic 3 empezando con el programa  9pCurso MPLAB pic 3 empezando con el programa  9p
Curso MPLAB pic 3 empezando con el programa 9pRuderocker Billy
 
Archivos en c clase unsam
Archivos en c clase unsamArchivos en c clase unsam
Archivos en c clase unsamdevxon9
 
Procesamiento de archivos
Procesamiento de archivosProcesamiento de archivos
Procesamiento de archivosTensor
 
Manejo archivos en-python ejm program
Manejo archivos en-python ejm programManejo archivos en-python ejm program
Manejo archivos en-python ejm programDaniel Arevalo
 

La actualidad más candente (19)

Teoría de códigos saira isaac
Teoría de códigos   saira isaacTeoría de códigos   saira isaac
Teoría de códigos saira isaac
 
Pcasm book-spanish
Pcasm book-spanishPcasm book-spanish
Pcasm book-spanish
 
Uso de apis en java
Uso de apis en javaUso de apis en java
Uso de apis en java
 
Uso de apis en java
Uso de apis en javaUso de apis en java
Uso de apis en java
 
Fundamentos de programación librería string C++
Fundamentos de programación librería string C++Fundamentos de programación librería string C++
Fundamentos de programación librería string C++
 
Strings
StringsStrings
Strings
 
Cadenas y funciones de cadena
Cadenas y funciones de cadenaCadenas y funciones de cadena
Cadenas y funciones de cadena
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de string
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de string
 
Examen De Estructura De Datos
Examen De Estructura De DatosExamen De Estructura De Datos
Examen De Estructura De Datos
 
Diego alexis 8
Diego alexis 8Diego alexis 8
Diego alexis 8
 
Curso MPLAB pic 3 empezando con el programa 9p
Curso MPLAB pic 3 empezando con el programa  9pCurso MPLAB pic 3 empezando con el programa  9p
Curso MPLAB pic 3 empezando con el programa 9p
 
Investigacion 1
Investigacion 1Investigacion 1
Investigacion 1
 
Linux 3
Linux 3Linux 3
Linux 3
 
Archivos en c clase unsam
Archivos en c clase unsamArchivos en c clase unsam
Archivos en c clase unsam
 
Tipos de datos Java
Tipos de datos JavaTipos de datos Java
Tipos de datos Java
 
Procesamiento de archivos
Procesamiento de archivosProcesamiento de archivos
Procesamiento de archivos
 
Manejo archivos en-python ejm program
Manejo archivos en-python ejm programManejo archivos en-python ejm program
Manejo archivos en-python ejm program
 
TALLER FLEX Y BISON
TALLER FLEX Y BISONTALLER FLEX Y BISON
TALLER FLEX Y BISON
 

Similar a Algoritmos de Compresión Huffman y Burrow-Wheeler

Similar a Algoritmos de Compresión Huffman y Burrow-Wheeler (20)

CODIGO HUFFMAN-1.pptx
CODIGO HUFFMAN-1.pptxCODIGO HUFFMAN-1.pptx
CODIGO HUFFMAN-1.pptx
 
Algoritmos de compresión
Algoritmos de compresiónAlgoritmos de compresión
Algoritmos de compresión
 
Codificacion HUFFMAN en matlab
Codificacion HUFFMAN en matlabCodificacion HUFFMAN en matlab
Codificacion HUFFMAN en matlab
 
Hpcs conf poster
Hpcs conf posterHpcs conf poster
Hpcs conf poster
 
Presentación 2014 profe gabriel
Presentación 2014 profe gabrielPresentación 2014 profe gabriel
Presentación 2014 profe gabriel
 
Codigos binarios
Codigos binariosCodigos binarios
Codigos binarios
 
Compresion de archivos
Compresion de archivosCompresion de archivos
Compresion de archivos
 
Algoritmo de compresión de huffman
Algoritmo de compresión de huffmanAlgoritmo de compresión de huffman
Algoritmo de compresión de huffman
 
A1 python 3
A1 python 3A1 python 3
A1 python 3
 
Código Huffman
Código HuffmanCódigo Huffman
Código Huffman
 
Capitulo 3 paul carrera,dego balcazar
Capitulo 3 paul carrera,dego balcazarCapitulo 3 paul carrera,dego balcazar
Capitulo 3 paul carrera,dego balcazar
 
Codificación de huffman
Codificación de huffmanCodificación de huffman
Codificación de huffman
 
Trabajo maxi unidad i
Trabajo maxi unidad iTrabajo maxi unidad i
Trabajo maxi unidad i
 
6 Codificación de fuente.ppsx
6 Codificación de fuente.ppsx6 Codificación de fuente.ppsx
6 Codificación de fuente.ppsx
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Uso de las clases iostream
Uso de las clases iostreamUso de las clases iostream
Uso de las clases iostream
 
Comenzando a programar
Comenzando a programarComenzando a programar
Comenzando a programar
 
conceptos basicos lenguajes de programacion.pdf
conceptos basicos lenguajes de programacion.pdfconceptos basicos lenguajes de programacion.pdf
conceptos basicos lenguajes de programacion.pdf
 
Huffman
HuffmanHuffman
Huffman
 
Ingeneria De Software
Ingeneria De SoftwareIngeneria De Software
Ingeneria De Software
 

Más de Belen Toledo

TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)
TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)
TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)Belen Toledo
 
Programacion3 presentacion proyecto final SGBD_LC
Programacion3  presentacion proyecto final SGBD_LCProgramacion3  presentacion proyecto final SGBD_LC
Programacion3 presentacion proyecto final SGBD_LCBelen Toledo
 
Algoritmos compresión Cubi-Romero-Toledo
Algoritmos compresión Cubi-Romero-ToledoAlgoritmos compresión Cubi-Romero-Toledo
Algoritmos compresión Cubi-Romero-ToledoBelen Toledo
 
Cifrados belentoledo
Cifrados belentoledoCifrados belentoledo
Cifrados belentoledoBelen Toledo
 
Ordenamientos externo
Ordenamientos externoOrdenamientos externo
Ordenamientos externoBelen Toledo
 
Ordenamientos Externo
Ordenamientos ExternoOrdenamientos Externo
Ordenamientos ExternoBelen Toledo
 

Más de Belen Toledo (9)

TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)
TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)
TCP (Transmission Control Protocol) Y UDP (User Datagram Protocol)
 
MPLS Y DWDM
MPLS Y DWDMMPLS Y DWDM
MPLS Y DWDM
 
Eigrp
EigrpEigrp
Eigrp
 
Eigrp
Eigrp Eigrp
Eigrp
 
Programacion3 presentacion proyecto final SGBD_LC
Programacion3  presentacion proyecto final SGBD_LCProgramacion3  presentacion proyecto final SGBD_LC
Programacion3 presentacion proyecto final SGBD_LC
 
Algoritmos compresión Cubi-Romero-Toledo
Algoritmos compresión Cubi-Romero-ToledoAlgoritmos compresión Cubi-Romero-Toledo
Algoritmos compresión Cubi-Romero-Toledo
 
Cifrados belentoledo
Cifrados belentoledoCifrados belentoledo
Cifrados belentoledo
 
Ordenamientos externo
Ordenamientos externoOrdenamientos externo
Ordenamientos externo
 
Ordenamientos Externo
Ordenamientos ExternoOrdenamientos Externo
Ordenamientos Externo
 

Último

Presentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.pptPresentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.pptCARLOSAXELVENTURAVID
 
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdfTALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdfMiguelGomez900779
 
linea de tiempo television y su avance en los años
linea de tiempo television y su avance en los añoslinea de tiempo television y su avance en los años
linea de tiempo television y su avance en los añosMaraPazCrdenas
 
Home Assistant - Un Hub para controlarlos a todos
Home Assistant - Un Hub para controlarlos a todosHome Assistant - Un Hub para controlarlos a todos
Home Assistant - Un Hub para controlarlos a todosDebora Gomez Bertoli
 
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVOPERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVOAdrianaBernal82
 
644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx
644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx
644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptxRosiClaros
 
PLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primariaPLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primariajosevilla696981
 
9-Sociales-Colombia siglo XX.pdf sociales
9-Sociales-Colombia siglo XX.pdf sociales9-Sociales-Colombia siglo XX.pdf sociales
9-Sociales-Colombia siglo XX.pdf socialesJhonathanRodriguez10
 

Último (8)

Presentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.pptPresentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.ppt
 
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdfTALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
 
linea de tiempo television y su avance en los años
linea de tiempo television y su avance en los añoslinea de tiempo television y su avance en los años
linea de tiempo television y su avance en los años
 
Home Assistant - Un Hub para controlarlos a todos
Home Assistant - Un Hub para controlarlos a todosHome Assistant - Un Hub para controlarlos a todos
Home Assistant - Un Hub para controlarlos a todos
 
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVOPERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
 
644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx
644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx
644400074-LA-CONSOLIDACION-DE-LA-REPUBLICA-OLIGARQUICA-pdf.pptx
 
PLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primariaPLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primaria
 
9-Sociales-Colombia siglo XX.pdf sociales
9-Sociales-Colombia siglo XX.pdf sociales9-Sociales-Colombia siglo XX.pdf sociales
9-Sociales-Colombia siglo XX.pdf sociales
 

Algoritmos de Compresión Huffman y Burrow-Wheeler

  • 1. Universidad de Cuenca Programación 3 G#2 Algoritmos de Compresión Jonnathan Cuvi, Vanessa Romero, Belen Toledo jinnathan.cuvi@ucuenca.ec - vanessa.romero@ucuenca.ec - belen.toledo@ucuenca.ec 28 de junio de 2017 Resumen El presente documento tiene como objetivo dar a conocer los algoritmos de compresión: Huffman y Burrow-Wheeler, en el mismo se encontrará los materiales, métodos y código implementado para poner en práctica dichos algoritmos, así como un ejemplo del funcionamiento de cada uno de ellos. El algoritmo de compresión Huffman consiste en comprimir un archivo de entrada utilizando el menor número posible de bits para lo cual se utiliza un árbol binario y al seguir un camino desde la raíz a cada una de las hojas se tenga un código Huffman asociado a él. El algoritmo de compresión de Burrow-Wheeler también se lo conoce como compresión por ordenación de bloques este algoritmo transforma cadenas de caracteres cambiando la posición de estos, pero nunca los modifica y si en la cadena de entrada existen caracteres iguales, se obtiene una nueva cadena con varias secuencias de caracteres repetidos, lo que facilita la compresión. Introducción La compresión consiste en el procedimiento de obtener una expresión de menor tamaño a partir de su expresión original algunos de los algoritmos que nos permiten realizar compresión son Huffman y Burrow-Wheeler los cuales no solo nos permiten realizar la compresión de datos, sino que también permiten realizar compresión de texto. El algoritmo de Huffman realiza la compresión a través de un árbol binario que contendrá símbolos o caracteres en sus hojas, el árbol se construirá de forma que desde la raíz a cada una de sus hojas se generara un código en bits (0, 1) teniendo en cuenta que las aristas a la izquierda van contener ceros y las aristas a la derecha unos. Mientras que el algoritmo de Burrow-Wheeler en sí no comprime si no realiza una serie de rotaciones y ordenamientos que permite organizar al texto de manera que agrupa a los caracteres que sean iguales, para así implementar el algoritmo de compresión RLE o Run Lenght Encoding (Codificación de Longitud de Compresión) el cual utiliza una mezcla de números y caracteres para representar una cadena de texto, es decir, codifica un primer elemento al dar el número de repeticiones del valor que se va a repetir y después el valor que se va a repetir, de esta manera la longitud del texto original será de un tamaño mucha más pequeño. La eficiencia de
  • 2. un algoritmo de compresión radica en su forma de implementar dicha compresión así como el tiempo empleado para realizar el codificado de los datos. Materiales y Métodos IDE NetBeans 8.1 Code Blocks 16.01 Código fuente de Algoritmo de Huffman Código fuente de Algoritmo Compresión Burrow-Wheeler Algoritmo de Huffman El algoritmo de Huffman es un algoritmo desarrollado por David A. Huffman en el año 1952 mientras desarrollaba un doctorado en el MIT (Instituto de Tecnológico de Massachusetts), y la descripción del método fue publicado en una revista bajo el título de “ A Method for the Construction of Minimum-Redundancy Codes ” el cual trata sobre el desarrollo de un método óptimo de codificación de un conjunto de mensajes que consta de un número finito de miembros, y que un código de redundancia mínima es uno construido de tal manera que se minimiza el número medio de dígitos de codificación por mensaje. Este algoritmo toma un alfabeto de n símbolos, junto con sus frecuencias de aparición asociadas, y produce un código de Huffman para ese alfabeto y esas frecuencias. para utilizar el algoritmo de Huffman se debe de conocer la frecuencia con la que aparece cada símbolo. La eficiencia de la codificación de Huffman también depende del balance que exista entre los hijos de cada nodo del árbol, siendo más eficiente conforme menor sea la diferencia de frecuencias entre los dos hijos de cada nodo. Funcionamiento El problema consiste en comprimir un archivo de entrada utilizando el menor número posible de bits. Existe un algoritmo que resuelve el problema, y que es conocido como el algoritmo de Huffman El algoritmo de Huffman consiste en crear un árbol binario que tendrá símbolos como hojas y el árbol será construido de manera que si seguimos desde la raíz a cada una de las hojas se tenga un código Huffman asociado a él. 1. Crear varios árboles, uno por cada uno de los símbolos del alfabeto, basándose cada uno de los árboles en un nodo sin hijos, y etiquetado cada uno con su símbolo asociado y su frecuencia de aparición.
  • 3. 2. Se toman los dos árboles de menor frecuencia, y se unen creando un nuevo árbol. La etiqueta de la raíz será la suma de las frecuencias de las raíces de los dos árboles que se unen, y cada uno de estos árboles será un hijo del nuevo árbol. También se etiquetan las dos ramas del nuevo árbol: con un 0 la de la izquierda, y con un 1 la de la derecha. 3. Se repite el paso 2 hasta que sólo quede un árbol. Con este árbol se puede conocer el código asociado a un símbolo, así como obtener el símbolo asociado a un determinado código. Para obtener el código asociado a un símbolo se debe proceder del siguiente modo: 1. Comenzar con un código vacío. 2. Iniciar el recorrido del árbol en la hoja asociada al símbolo. 3. Comenzar un recorrido del árbol hacia arriba. 4. Cada vez que se suba un nivel, añadir al código la etiqueta de la rama que se ha recorrido. 5. Tras llegar a la raíz, invertir el código. 6. El resultado es el código Huffman deseado. Para obtener un símbolo a partir de un código se debe hacer así: 1. Comenzar el recorrido del árbol en la raíz de éste. 2. Extraer el primer símbolo del código a descodificar. 3. Descender por la rama etiquetada con ese símbolo. 4. Volver al paso 2 hasta que se llegue a una hoja, que será el símbolo asociado al código. Casi siempre se utiliza el árbol para obtener todos los códigos de una sola vez; luego se guardan en tablas y se descarta el árbol. Ejemplo funcionamiento: 1. Elegiremos una palabra para codificar. 2. Separar por caracteres. 3. Contabilizar el número de repeticiones de cada carácter si hay repeticiones eliminamos la repetida. (ver Imagen 1) 4. Ordenar los caracteres (menor a mayor) de acuerdo al número de repeticiones. (ver Imagen 2) 5. En una lista enlazada de árboles insertamos los caracteres con su respectivo número de repeticiones cada carácter con su número representa la raíz de un árbol nuevo.
  • 4. 6. Creamos el nodo que tendrá por carácter la letra y el número de repeticiones que la letra tiene. (Se realiza esto con todas las letras). (ver Imagen 3) 7. Se toman los dos primeros nodos de las listas y se crea un nuevo nodo árbol que por raíz tendrá un carácter nulo y la suma de las repeticiones de los dos nodos tomados. (ver Imagen 4) 8. El primer nodo tomado se lo enlazada del lado izquierdo del árbol y el segundo nodo del lado derecho. (ver Imagen 4) 9. Insertamos ordenadamente el nodo nuevo en función del número que tiene la raíz. (ver Imagen 5) 10.Se repite el proceso desde el paso 7 si ya existe un nodo con el mismo número el nodo se inserta después del nodo que ya estaba registrado. 11.Al tener un solo nodo árbol denotamos los caminos que vayan a la izquierda con un cero (0) y los de la derecha con un uno (1). (ver Imagen 6) 12.Se elabora una lista con los caminos que van de la raíz a cada carácter. 13.Se vuelve a descomponer en caracteres la palabra que se deseaba codificar. 14.Compondremos la palabra por el camino que representa cada carácter que esta palabra contiene. (ver Imagen 7) 15.Finalmente obtenemos el código Huffman juntando toda la cadena de ceros y unos obtenida. (ver Imagen 7) Análisis código Huffman El algoritmo de compresión Huffman ha sido implementado en el IDE Code blocks utilizando el lenguaje de programación C en el cual se ha implementado un File denominado Huffman.c el cual contendrá varios métodos que serán los encargados de realizar el debido proceso para la compresión de un archivo. Para iniciar se define una estructura llamada nodo que contendrá los valores cuenta que será el encargado de contabilizar las apariciones de un carácter en el texto, bit valor que variará entre cero y uno, Karacter almacenará los caracteres al momento de la descompresión, el puntero código el cual almacenará una cadena de ceros y unos con la codificación, nbits nos indicará el número de bites de cada carácter. El método preparar_hojas tiene como parámetro un char *archivo, este método como su nombre lo indica es el encargado de preparar las hojas es decir recorre el documento. El método tejer es el encargado de formar el árbol mientras va recorriendo los nodos buscando los nodos con menor valor es decir sigue tejiendo hasta que solo nos quede un nodo. La función codificar una vez construido el árbol, se puede codificar cada carácter. Para eso se recorre desde la hoja a la raíz, apunta 0 o 1 en una pila y luego se pasa
  • 5. la pila a una cadena. Cuando el puntero w tenga un valor de 2 esto determinara el fin de la cadena. La función debug es la encargada de imprimir información sobre cada carácter como el número de apariciones del carácter y la cadena en la se codifica ese carácter. La función escribe_cabecera es la encargada de escribir la cabecera del archivo, la cabecera contiene el número de bytes del archivo original, el número de caracteres distintos en el archivo y una lista de parejas de caracteres, información necesaria para la descompresión. La función comprimir Una vez construido el árbol y codificado cada carácter se puede proceder a la compresión: se tomará carácter a carácter del archivo origen y se usará la cadena de codificación para ir escribiendo bits en un buffer de un carácter, que cada vez que quede lleno se pasará al archivo de destino. La función descomprimir es la encargada de descomprimir el archivo, el primer paso que realiza es leer la cabecera para obtener la información necesaria para este proceso. El método mostrar_contenido es la cual nos permitirá visualizar el contenido del archivo. Algoritmo de transformación Burrows – Wheeler El algoritmo de transformación de Burrows-Wheeler (BWT) es un algoritmo usado en técnicas de compresión de datos al cual también se lo conoce como compresión por ordenación de bloques. En 1994 Michael Burrows y David Wheeler crearon este algoritmo basándose en un trabajo, nunca publicado, realizado por Wheeler en 1983. Este algoritmo transforma cadenas de caracteres cambiando la posición de estos, pero nunca modificándolos. Si en la cadena de entrada existen caracteres iguales, con esta transformación se obtiene una nueva cadena con varias secuencias de caracteres repetidos, lo que facilita la compresión. Esto no quiere decir que todos los caracteres repetidos se agrupen, pero si algunos de ellos. (Tabla 1) Funcionamiento A continuación, se pueden ver los pasos que se deben seguir para realizar la transformación Burrows-Wheeler. Para que se entienda de una mejor manera el
  • 6. funcionamiento se va a realizar un ejemplo donde se utiliza la palabra esperanza como cadena de entrada. 1. Lo primero que se debe realizar son las rotaciones, para esto hay que ir rotando un carácter de la cadena hacia un lado hasta que el primero se convierta en el último o al revés. Para realizar este proceso puede servir de ayuda utilizar una matriz de tamaño nxn, donde n es el número de caracteres que tiene la cadena que queremos transformar. En el ejemplo se puede observar cómo se empieza en la primera fila con la cadena de entrada que en este caso es esperanza y en cada fila se van moviendo las letras una posición hacia la derecha hasta que la primera letra (letra marcada de color rojo) llega a estar en la última fila y última columna, posición (9,9). (Tabla 2) 2. En segundo lugar, se debe ordenar todas las cadenas que se han obtenido al hacer las rotaciones. El número de cadenas obtenidas debe ser igual al número de caracteres que contiene la cadena original. En la Tabla 3 se pueden ver todas las filas del ejemplo que se está realizando ordenadas alfabéticamente, empezando por la primera fila hasta la novena. 3. Por último, formamos la cadena transformada uniendo el último carácter de cada cadena resultante de la rotación. Debemos de realizar esta unión respetando el orden de las cadenas ordenadas alfabéticamente. La cadena resultante del ejemplo es zrpaaseen, la cual se ha obtenido al unir todas las letras de la última columna empezando desde la primera fila hasta la novena, para respetar el orden alfabético realizado en el paso anterior. (Tabla 4) Este algoritmo de compresión también nos permite realizar el proceso inverso para el cual la cadena de entrada es la que se obtuvo al realizar la transformación. Para explicar la transformación inversa se va a seguir con el ejemplo anterior. A continuación, se presentan los pasos que se deben seguir. 1. Se coloca la cadena de entrada en forma de columna para así obtener todas las cadenas que se formaron con las rotaciones. Para el ejemplo que se está revisando, en este paso se puede observar en la Tabla 5 como se ha colocado la cadena zrpaaseen en la novena columna. 2. Se debe ordenar alfabéticamente la columna que se obtuvo en el paso anterior. (Tabla 6) 3. Se coloca la cadena transformada en la columna anterior. En el ejemplo se coloca la cadena transformada en la columna ocho. (Tabla 7)
  • 7. 4. Se ordenan las cadenas que se han obtenido en el paso 3. (Tabla 8) 5. Se repiten los dos últimos pasos (3 y 4) hasta que se obtenga una cadena de longitud igual a la original. 6. Se escoge la cadena que contiene en el inicio el carácter que se señaló como inicial, si este fue el caso, o de lo contrario la que contiene en el final el carácter que se señaló como final del archivo. Para el ejemplo que se ha realizado debemos de escoger la cadena de la cuarta fila ya que tiene el carácter inicial (Tabla 3). Podemos ver que efectivamente esta cadena es la cadena inicial: esperanza. Algoritmo de compresión Run-length encoding Uno de los algoritmos que se puede utilizar para comprimir un archivo después de aplicar la transformación de Burrows-Wheeler es la compresión Run-length encoding (RLE) ya que este algoritmo se utiliza cuando en un archivo existen bastantes caracteres repetidos y juntos. Este algoritmo es de compresión de datos sin pérdidas y consiste en colocar solo un carácter de la secuencia de caracteres junto con el recuento de estos, en caso que haya un carácter solo igualmente se lo coloca junto con el número uno. Un ejemplo sencillo de este algoritmo de compresión es el siguiente: Si se tiene como cadena de entrada aaaaafuuuddppp y se aplica RLE se obtiene la cadena de salida: 5a1f3u2d3p. En este ejemplo se puede observar cómo se ha pasado de tener catorce caracteres (aaaaafuuuddppp) a diez (5a1f3u2d3p). Análisis código Burrows-Wheeler Tanto el algoritmo de transformación de Burrows-Wheeler como el algoritmo de compresión Run-length Enconding fueron implementados en el IDE Netbeans 8.1, en el lenguaje de programación Java. Estos dos algoritmos se implementaron juntos y para ello se creó una clase a la que se llamó burrowswheelertransform. Dentro de esta clase se encuentran varias funciones que están descritas a continuación.
  • 8. La función main donde se tiene un pequeño menú que permite procesar el archivo para realizar la compresión, mostrar el archivo que se va a comprimir y salir del programa. Función procesar, aquí se realiza la llamada a todas las funciones que se necesitan para realizar la transformación y compresión. Función invertBWT en la que se realiza el proceso inverso de la transformación de Burrows-Wheeler para poder obtener nuevamente la cadena original después de aplicar la transformación. La función runLengthEncode es la que se utiliza para realizar la compresión Run- length encoding. Dentro de esta función se recibe la cadena que se desea comprimir, se la va recorriendo y contando el número de caracteres repetidos, en una secuencia, para formar la cadena comprimida uniendo el carácter con el número. La función generateRotations genera todas las rotaciones de la cadena de entrada, esto lo hace recorriendo la cadena una posición cada vez y colocándola en una matriz. La función lastChars nos devuelve los caracteres que se encuentran en la última fila de la matriz. La función printStringArray es la que nos muestra cada fila de la matriz después de ver sido ordenada. Función sortStrings ordena la matriz obtenida al hacer las rotaciones. Función swap intercambia dos posiciones dadas en una matriz ya que se necesita a la hora de ordenar la matriz. Conclusión Como pudimos observar los algoritmos de compresión permite representar una cadena de texto, en una expresión más pequeña a través de la cadena original haciendo más fácil el manejo de dicha cadena debido su tamaño reducido. Pero hay que tener en cuenta algunos algoritmos de compresión en ciertas ocasiones no son muy eficientes al momento de comprimir, como es el caso del algoritmo RLE ya que cuando una cadena de texto no contiene símbolos o caracteres repetido en lugar de reducir su tamaño incrementa el tamaño de la cadena ya que además de tener la
  • 9. cadena original se introduce el número de repeticiones de cada carácter que en el caso de no tener símbolos repetidos sería uno. Referencias ● Jiménez, A., 2006. Algoritmo de Huffman [WWW Document]. Xataka Ciencia. URL: https://www.xatakaciencia.com/matematicas/algoritmo-de-huffman (accessed 6.23.17). ● René Mtz, 2012. Algoritmo de Huffman. ● Algoritmo de Huffman, 2017. . Wikipedia, la enciclopedia libre. ● Algoritmo de Huffman - YouTube [WWW Document], n.d. URL https://www.youtube.com/watch?v=8Gf8wutvS1w (accessed 6.23.17). ● Compresión de Burrows-Wheeler. (2017, enero 26). En Wikipedia, la enciclopedia libre. Recuperado a partir de https://es.wikipedia.org/w/index.php?title=Compresi%C3%B3n_de_Burrows- Wheeler&oldid=96453773 ● Giménez, R. (2004). Algoritmos de Compresión Sin Pérdida de Datos. Obtenido de http://jeuazarru.com/wp- content/uploads/2014/10/Compresion.pdf ANEXOS ENLACES: Codificación: https://github.com/JonnathanCuvi/Huffman-y-Burrow-Wheeler Informe: Diapositivas:
  • 10. IMAGENES: Imagen1: Separación y contabilización de caracteres Imagen 2: Ordenación de caracteres. Imagen 3: Creación de nodos. imagen 4: Creación de nuevo nodo
  • 11. Imagen 5: Insertando el nuevo nodo Imagen 6: Obtención de un solo nodo árbol. Imagen 7: Obtención del Código Huffman
  • 12. TABLAS Cadena de entrada esperanza Cadena de salida zrpaaseen Tabla 1. Ejemplo de compresión Burrows-Wheeler. E S P E R A N Z A A E S P E R A N Z Z A E S P E R A N N Z A E S P E R A A N Z A E S P E R R A N Z A E S P E E R A N Z A E S P P E R A N Z A E S S P E R A N Z A E Tabla 2. Rotación de la cadena de entrada. A E S P E R A N Z A N Z A E S P E R E R A N Z A E S P E S P E R A N Z A N Z A E S P E R A P E R A N Z A E S R A N Z A E S P E S P E R A N Z A E Z A E S P E R A N Tabla 3. Ordenación alfabética de las cadenas obtenidas en las rotaciones.
  • 13. Tabla 4. Obtención de la cadena transformada. Z R P A A S E E N Tabla 5. Colocación de la cadena transformada en la última columna. Última columna de las cadenas ordenadas Cadena resultante de la transformación. Z R P A A S E E N ZRPAASEEN
  • 14. Tabla 6. Ordenación alfabéticamente de la cadena de entrada. Z A R A P E A E A N S P E R E S N Z Tabla 7. Colocación de la cadena transformada en la columna anterior. A A E E N P R S Z
  • 15. A E A N E R E S N Z P E R A S P Z A Tabla 8. Ordenación alfabética de las cadenas formadas