Este documento describe dos algoritmos de compresión de datos: Codificación Huffman y Codificación Aritmética. La Codificación Huffman asigna códigos binarios de longitud variable a símbolos basados en su frecuencia, resultando en una representación más compacta. La Codificación Aritmética representa símbolos con números fraccionarios entre 0 y 1 basados en sus probabilidades. El documento explica la implementación, codificación y decodificación de ambos métodos así como conclusiones y referencias.
Joseph juran aportaciones al control de la calidad
Algoritmos de compresion
1. Compresión de Datos:
Huffman y Código Aritmético
Programación 3: Estructura de Archivos
Facultad de Ingeniería
Universidad de Cuenca
Realizado por:
Jorge Encalada, Jhon Flores, Edisson Reinozo
Autoría de Implementación:
José Alberto Benítez Andrades, Juan Antonio Valbuena López -
Universidad de León
Prof. F. Javier Gil Chica. - Universidad de Alicante
4. Codificación Huffman
Representar un conjunto de símbolos, usando el menor
número de bits posibles.
Mapea cada símbolo de un alfabeto con un código de
longitud óptima. Para comprimir cada símbolo de la cadena.
Para conseguir una asignación óptima, los símbolos se
representan con códigos cuya longitud es inversamente
proporcional a la probabilidad del símbolo.
6. Se utiliza un método específico para elegir la representación de
cada símbolo, que da lugar a un código prefijo un símbolo en
particular nunca es prefijo de la cadena de bits de un símbolo
distinto).
Se puede realizar el proceso de manera lineal si las
probabilidades de los símbolos de entrada están ordenados.
7. Implementación
El algoritmo de Huffman consiste en la construcción de un
árbol.
La idea original de Huffman consiste en construir este arbol
desde las hojas hacia la raíz, en lugar
9. Cuenta : Número de veces que aparece cada
símbolo,
Vector Hojas[256], Hojas[j] .cuenta es el
número de apariciones del carácter j
bit (0, 1) Determinar el código
karacter contiene el valor del carácter j
codigo cadena, secuencia de 0’s y 1’s.
nbits número de bits que codifica el carácter
10. Estructura Hojas, Telar
1. Recorremos Tejar y localizamos los 2 elementos que menos se repiten
2. Creamos un nuevo Nodo, izq y der apuntan a estos nodos. (izq al
menor) nodo menor recibe bit = 0, la cuenta del nuevo nodo es la suma
de las cuentas de los nodos hijos.
3. Un puntero de Telar se hace NULL, y el otro apunta al nuevo nodo.
NSIMB - - ;
4. Repetimos recursivamente hasta que quede un solo puntero en Telar,
Este puntero apuntará a la raíz del árbol.
11.
12. Codificación
Una vez construido el árbol, el proceso de compresión es
sencillo, y consta esencialmente de dos pasos:
● Escritura de la cabecera
● Compresión
Cabecera:
Número de apariciones de cada carácter. y numero de
carácter.
13. En el proceso de descompresión, esta información es
necesaria para poder abrir el archivo
Para cada carácter j de la cadena. Se recorre la lista y según se
encuentre un 0 o un 1 se establece 0 o 1 en el bit buffer. Cada
vez que se llena (nbit = 8) se escribe en el archivo destino
14. Descompresión
Una vez leída la cabecera, es posible reconstruir el árbol.
Se procede leyendo la corriente de bits del archivo origen.
Originalmente el puntero apunta a la raíz del árbol y se mueve
siguiendo los punteros de izq o der hasta alcanzar una hoja.
(node->izq== null || node->der == null).
Esta hoja se identifica mediante el campo karacter, este
proceso se realiza nuevamente, tantas como indica NBYTES
17. Codificación Aritmética
● La codificación aritmética es una técnica o método estadístico, que da a conocer
a priori las probabilidades de símbolo/caracter.
● Esta codificación no se trata de obtener un código sencillo para cada tipo de
símbolo. Este produce un código para un mensaje completo.
● Permite representar símbolos con un número de bits fraccionario.
19. Codificación Aritmética
Simbolo Probabilidad Rango
A 0.50 [ 0.0 , 0.50 )
C 0.25 [ 0.50 , 0.75 )
S 0.25 [ 0.75 , 1.00 )
Cadena de Ejemplo: CASA Longitud Cadena: 4
Suma de las probabilidades siempre debe ser 1.00
20. Codificación Aritmética
Ahora se obtendrán los límites inferiores y superiores
INFERIOR = AI + ( AS - AI ) * NI
SUPERIOR = AI + ( AS - AI ) * NS
AI: Antiguo Inferior AS: Antiguo Superior
NI: Nuevo Inferior NS: Nuevo Superior
21. Codificación Aritmética
INFERIOR = AI + ( AS - AI ) * NI SUPERIOR = AI + ( AS - AI ) * NS
C Inf = 0.0 + ( 1.0 - 0.0 ) * 0.5 = 0.50 Viejo = [ 0.0 , 1.0 )
Sup = 0.0 + ( 1.0 - 0.0 ) * 0.75 = 0.75 Nuevo = [ 0.50 , 0.75 )
A Inf = 0.5 + ( 0.75 - 0.5 ) * 0.0 = 0.50 Viejo = [ 0.5 , 0.75 )
Sup = 0.5 + ( 0.75 - 0.5 ) * 0.50 = 0.625 Nuevo = [ 0.0 , 0.5 )
22. Codificación Aritmética
S Inf = 0.5 + ( 0.625 - 0.5 ) * 0.75 = 0.59375 Viejo = [ 0.50 , 0.625 )
Sup = 0.5 + ( 0.625 - 0.5 ) * 1.0 = 0.62205 Nuevo = [ 0.75 , 1.0 )
A Inf = 0.59375 + ( 0.62205 - 0.59375 ) * 0.0 = 0.59375
Sup = 0.59375 + ( 0.62205 - 0.59375 ) * 0.50 = 0,609375
Viejo = [ 0.59375 , 0.62205 )
Nuevo = [ 0.0 , 0.5 )
INFERIOR = AI + ( AS - AI ) * NI SUPERIOR = AI + ( AS - AI ) * NSINFERIOR = AI + ( AS - AI ) * NI SUPERIOR = AI + ( AS - AI ) * NS
23. Codificación Aritmética
Ahora usando el subintervalo Final:
[ 0.59375 , 0.609375 )
Al final se convierten estos números punto flotante en binario, para obtener el
valor binario que se encuentra entre los dos:
0.59375 = 0.10011 0.609375 = 0.1001101111
Se tomará en cuenta el valor: 0.10011
24. Decodificación Aritmética
Requisitos para la decodificación:
● El número del intervalo final en punto flotante(obtenido al codificar)
● Los niveles de codificación asociados
● La tabla de probabilidad
● Los intervalos
● Alfabeto de caracteres
25. Decodificación Aritmética
Primero identificamos el intervalo al pertenece el número flotante:
N=0.10011 -> 0.59375
Pertenece al intervalo
[ 0.50 , 0.75 ) C
Simbolo Probabilidad Rango
A 0.25 [ 0.0 , 0.50 )
C 0.50 [ 0.50 , 0.75 )
S 0.25 [ 0.75 , 1.00 )
26. Decodificación Aritmética
Después se debe obtener un nuevo número flotante con la siguiente
fórmula:
NUEVO NUMERO=(NUMERO- L)/K
[L, H) -> intervalo al que pertenece el número flotante
k -> probabilidad o longitud del intervalo
27. Decodificación Aritmética
N=0.10011 -> 0.59375
Pertenece al intervalo
[ 0.50 , 0.75 ) C
NUEVO=(0.59375 - 0.5)/0.25= 0.375
[ 0.00 , 0.50 ) A
NUEVO=(0.375- 0.0)/0.5= 0.75
[ 0.75 , 1.00 ) S
NUEVO=(0.75- 0.75)/0.25= 0.0
[ 0.00 , 0.50 ) A
NUEVO=(0.0- 0.0)/0.5= 0.0
C-A-S-A
28. Conclusiones
Podemos utilizar el algoritmo de huffman para representar un conjunto de símbolos con la menor cantidad de bits
posibles y además nos permite mapear cada símbolo de un alfabeto con un código de longitud óptima.
La codificación aritmética es ideal para pocos caracteres ya que al momento de decodificar se debe recorrer
tantas veces como el número de caracteres que tiene el archivo original y en cada recorrido hay que comparar la
lista de probabilidades y de intervalos con los datos que se van calculando en al algoritmo de decodificación, lo
cual hace que se demore demasiado.
29. Referencias
[1]"Codificación Aritmética". [Online]. Available:
http://arantxa.ii.uam.es/~jms/tdatos/2006-2007/p2/Guion_2_Codificacion_Aritmetica.pdf.
[2]"Compresión de mensajes: Huffman y Codificación Aritmética", Jose Alberto Benítez Andrades, 2014. [Online]. Available:
http://www.jabenitez.com/portfolio/compresion-de-mensajes-huffman-y-codificacion-aritmetica/
[3]"JPG y la Codificación Aritmética", Grupo Universitario de Informática | Foro, 2015. [Online]. Available:
http://foro.gui.uva.es/t/jpeg-y-la-codificacion-aritmetica/585.
[4]"Codificación aritmética", Es.wikipedia.org, 2016. [Online]. Available:
https://es.wikipedia.org/wiki/Codificaci%C3%B3n_aritm%C3%A9tica.
[5]"Introducción a la compresión de archivos", Archive.cnx.org. [Online]. Available:
http://archive.cnx.org/contents/6e755212-cda0-4db9-9d6b-88b776fb57e7@1.html.
[6]"Profesor F. Javier Gil Chica. Libros y otros trabajos", Dfists.ua.es. [Online]. Available: http://dfists.ua.es/~gil/libros.html.
30. Anexos
Repositorio Github (JAVA y C): https://github.com/edzzn/Algoritmos_Compresion
Generador de arboles binarios: http://huffman.ooz.ie
Programa para Usar Codificacion Aritmetica a JPG: http://jpegclub.org/jpegtran/
Huffman en C: http://dfists.ua.es/~gil/huffman.c