Explique la idea detrás de los Códigos de Huffman
La idea de los Códigos de Huffman es asignar códigos de bits más cortos a símbolos que ocurren con mayor frecuencia, y códigos de bits más largos a símbolos que ocurren con menor frecuencia.
Esto aprovecha el hecho de que, en muchos conjuntos de datos, algunos símbolos son más probables que otros, lo que permite comprimir los datos reduciendo la cantidad total de bits necesarios para representar la información.
¿Qué es la comprensión de datos?
La comprensión de datos es la reducción del volumen de datos que se usan para representar una determinada información, empleando una menor cantidad de espacio.
¿Qué es una fuente?
Se llama ‘fuente’ a todo aquello que emita ‘mensajes’. Existe un conjunto finito de posibles mensajes.
¿Cómo se representan los emnsajes?
Los mensajes se representan mediante códigos (el objetivo es elegir códigos de tal forma de reducir al mínimo el tamaño de lo emitido por la fuente).
¿Qué son los códigos?
Explique qué son los códigos decodificables.
Los códigos decodificables son aquellos que para cualquier sucesión de códigos, sólo existe un único conjunto de mensajes válidos.
Los códigos de longitud fija son siempre decodificables.
Ejemplo:
10 00 11
Explique cuándo un código es prefijo
Un código es prefijo si no existe ningún código que tenga un prefijo igual a otro código completo.
Los códigos prefijos son siempre decodificables.
Ejemplo:
0 10 110 111
¿Qué son los Códigos de Huffman? ¿Es óptimo?
Son códigos de longitud variable y prefijos.
La longitud de cada código está basada en la frecuencia de cada mensaje en el emisor (fuente).
Es óptimo: no existen otros códigos prefijos para la misma fuente que la codifique en menor longitud.
Explique el problema de los Códigos de Huffman. ¿A qué se le llama Longitud de C(W)? ¿Qué cumple la longitud de los códigos de Hoffman?
Sea el alfabeto A = (a1, a2, ..., an), llamaremos W=(w1, w2, ..., wn) al peso (o frecuencia) de cada ai.
Construiremos un C(W) = (c1, c2, ..., cn) con códigos prefijos y binarios.
Llamamos Longitud(C(W)) a la suma de todos los pesos multiplicados por el tamaño de su código asociado.
De esta forma, se cumple que la longitud de C(W) es menor o igual a la longitud de cualquier otro código prefijo T(W).
Código prefijo: Árbol Binario
¿Cómo puede representarse un código prefijo mediante un árbol binario?
Podemos representar un código prefijo mediante un árbol binario: las hojas serán loscódigos y cada nodo tendrá 2 o ningún descendiente.
Explique el Algoritmo Greedy para Códigos de Hoffman con Árboles Binarios.
Se genera un árbol de Huffman para armal el optimal prefix code.
ci es un nodo hoja con wi.x,y de menor peso que no tengan padre.z con wz= wx+ wy.z como padre de x e yIndique una posible implementación de Códigos de Huffman. ¿Qué complejidad tiene?
La complejidad algorítmica es O(n logn), por tener n inserciones en el heap.
Explique el pseudocógio para la implementación de Códigos de Huffman con árboles binarios.
Códigos de Huffman con árboles binarios: ¿Es óptimo? ¿Se puede probar?
Es óptimo, y se puede probar por dos caminos:
Explique la prueba de Selección Greedy
A = (a1, ..., an) el alfabeto con peso W=(w1,...,wn)a y b los dos mensajes de A con menor frecuencia=> Existe un código prefijo óptimo tal que
1. El tamaño de (Ca) es igual al tamaño de C(b), y difieren en el último bit.
2. Además, el tamaño de ambos C es mayor o igual al tamaño de cualquier otro elemento de A.
Explique la prueba de los subproblemas
A = (a1, ..., an) el alfabeto con peso W=(w1,...,wn)a y b los dos mensajes de A con menor frecuencia=> A' = A - {a,b} + {z}, tal que wz = wa + wb y el resto de los pesos iguales. Tengo entonces C y C'.
T' árbol que representa un código prefijo óptimo para C'.T árbol que representa un código prefijo óptimo para C.Entonces se puede ver que:T se puede obtener de T', reemplazando el nodo hoja z' por un nodo con hijos a y b.
Resuelva:
Arme el árbol binario para el siguiente código de Huffman:
A = 0000
B = 0001
C = 010
D = 011
E = 1
Fuente: ABEEE CCEEE DDEEEE
Sea la notación (x,y, v) -> z, tal que x, y son los nodos hijos de la raíz z, y v es el código asociado a la raiz.
El árbol resultante es:
└── 16
├── (0) - 6
│ ├── (0) - 2
│ │ ├── (0) - A
│ │ └── (1) - B
│ │
│ └── (1) - 4
│ ├── (0) - C
│ └── (1) - D
└── (1) - E