Greedy: Códigos de Huffman Flashcards
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?
- Son una convención que establece cómo representar cada mensaje utilizando una combinación de símbolos: ASCII, Morse, etc.
- Puede tener longitud fija o variable
- No deben ser ambiguos
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
.
- Inicialmente, cada código
ci
es un nodo hoja con
pesowi
. - Mientras quede más de un nodo sin padre:
2.a. Toma los dos nodosx,y
de menor peso que no tengan padre.
2.b. Crea un nuevo nodoz
conwz= wx+ wy
.
2.c. Define az
como padre dex
ey
- El último nodo sin padre será la raíz del árbolI
Indique una posible implementación de Códigos de Huffman. ¿Qué complejidad tiene?
- Se puede usar un heap de mínimos, donde el nodo del árbol será el elemento y la frecuencia será la clave.
- En cada iteración, se obtienen los 2 nodos de menor peso, y se ingresa uno nuevo creado.
- El último elemento en el heap es la raíz.
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.
- Para todos los nodos, crear una tupla con (clave, peso) e insertarlos al Heap.
- Ir obteniendo los dos mínimos, y unirlos para crear un nuevo nodo. Se guarda cuál es el izquierdo, cuál el derecho, y el peso total es la suma de ambos. Se agrega luego este nuevo nodo al heap.
- Se repite el paso 2 por todos los nodos menos el úlimo.
- Se devuelve el heap (el árbol).
Códigos de Huffman con árboles binarios: ¿Es óptimo? ¿Se puede probar?
Es óptimo, y se puede probar por dos caminos:
- Prueba de selección greedy: mostrar que la heurística de elegir dos mensajes de menor peso nos acerca a la solución óptima global.
- Prueba de los subproblemas: mostrar que el subproblema derivado de nuestra elección se puede solucionar mediante la misma selección greedy.
Explique la prueba de Selección Greedy
- Sea
A = (a1, ..., an)
el alfabeto con pesoW=(w1,...,wn)
- Sean
a
yb
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.