You are on page 1of 12

Escuela Politécnica Nacional

Facultad De Ingeniería Eléctrica Y Electrónica

TCI

Nombre: Danilo Calvachi, Luis Félix

Curso: Gr-1

Fecha: 4 de mayo de 2018

4. Consultar y explicar el proceso de descompresión de Huffman, para el ejercicio 1, escribir


una cadena de ejemplo y explicar el proceso de descompresión

Para la decodificación de Huffman se realiza el siguiente procedimiento:

1. Cargar el diccionario a la memoria


2. Empezar a leer bits del archivo binario (saltarse el primer 1).
3. Leer bits de uno en uno, y checar si la cadena de bits está en el diccionario
4. Si encontramos la cadena de bits en el diccionario, escribir al archivo de salida
5. Si es el final, terminar. Si no, ir al paso 3.

Ejemplo:
Cadena de bits:"10000101010111111110"
Diccionario = {'a':0, 'b':10, 'c':111, Fin:110}
1. Cargamos el diccionario: dic = {'a':0, 'b':10, 'c':111, Fin:110}
2. Nos saltamos el primer bit. Entrada: "0000101010111111110"
3. Leemos un bit, y checamos en el diccionario. Bits leídos: "0". Entrada: "000101010111111110"
4. ¿Está ‘bits leídos’ disponible en el diccionario? Sí: 'a':0. Salida: a.
5. Los siguientes tres bits son "000", o tres a. Salida: aaaa. Entrada: "101010111111110"
6. Leemos un bit. Bits leídos: "1". Entrada: "01010111111110". No está en el diccionario.
7. Leemos otro bit. Bits leídos "10". Entrada: "1010111111110". Diccionario: 'b':10.
Salida: aaaab.
8. Los siguientes cuatro bits son "1010", o dos b. Salida: aaaabbb. Entrada: "111111110"
Y de continuar así, es posible ver que los bits que quedan en la entrada "111111110"corresponden a cc
Fin.

Descompresión ejercicio 1

Cadena= “11101001100100000011010011000”

a. Diccionario = {'a':1, 'b':010, 'c':011,’d’:000, ‘e’:0010, ’f’:0011}


b. Nos saltamos el primer bit. Entrada: "1101001100100000011010011000"
c. Descompresión = aabceddaabfd

1
5. Consultar y explicar la codificación de Huffman no binaria (códigos ternarios) y adaptiva.
a. La codificación Huffman r-aria:

Alfabeto código de r elementos, X={x1, x2, …, xr}.

La codificación Huffman r-aria tiene 2 pasos:

 Ordenamiento y reducción

 Codificación expansiva r-aria

i. Ordenamiento y reducción

Ordenar los símbolos Si en orden decreciente de probabilidades.

Formar un grupo de r símbolos, los símbolos restantes se agrupan en r-1 símbolos.

Si faltan símbolos al último grupo, se agregan asignando probabilidad 0.

Se reduce la fuente sustituyendo el último conjunto de r símbolos por uno solo símbolo, con
probabilidad igual a la suma de las probabilidades de los símbolos sustituidos.

Ordenar tomando en cuenta el nuevo símbolo.

Repetir hasta la última reducción que va a tener r símbolos.

ii. Codificación expansiva r-aria

Codificar la última fuente reducida asignando una palabra código de longitud 1 /r símbolos).

Expandir la palabra que fue reducida de 1 a r.

 Repetir r veces la palabra reducida.

 Añadir a cada repetición los r símbolos disponibles.

Repetir la expansión hasta llegar a la fuente original.

EJEMPLO

Para la fuente S={S1,S2,…,S11} codificar con Huffman utilizando un código cuaternario X={0,1,2,3} .

2
b. Huffman Adaptativo

Una de las técnicas para la generación de huffman adaptativo es la de reconstruir el árbol por cada N
caracteres comprimidos. Esta técnica incrementa la velocidad de compresión (y descompresión) a
costa de un detrimento en el nivel de compresión, puesto que el árbol no se ajusta rápidamente a los
cambios en las frecuencias de los símbolos. Por suerte existe un método basado en las propiedades de
un árbol huffman que permite actualizarlo rápidamente sin que para ello debamos construir el árbol
en forma completa. Un árbol huffman, además de ser un árbol binario completo (cada nodo del árbol
tiene cero o dos hijos) cumple dos propiedades. La primera es sencilla y dice que todo nodo no hoja
tiene por frecuencia la suma de las frecuencias de sus dos hijos. La segunda es la propiedad del sibbling.
Para explicar esta última propiedad debemos numerar los nodos del árbol de la siguiente manera:
comenzamos por el nivel 0 (la raíz) y etiquetamos dicho nodo con el número 0, luego pasamos al
siguiente nivel y etiquemos a los dos nodos de izquierda a derecha con 1 y 2. Así continuamos hasta
completar todos los niveles. Sea #(A) el número asignado (etiquetado) al nodo A, esta segunda
propiedad nos dice que si A y B son dos nodos del árbol y se cumple qué #(A) < #(B) entonces la
frecuencia de A es mayor o igual a la de B.

6. Desarrollar ejemplos de su propia autoría (enunciado y datos), y aplicar las técnicas


consultadas en el punto 4 (compresión y descompresión) y punto 5

Ejemplo "abracadabra"

El siguiente ejemplo demuestra el desarrollo del árbol de Huffman en el curso de la codificación de un


texto con 11 símbolos ("abracadabra"). Para describir las estructuras de datos relevantes, el desarrollo
de la tabla de códigos se muestra utilizando el formato como se introdujo anteriormente.

Inicialmente, se supondrá que un árbol de códigos solo está formado por el carácter de control NYA
(No disponible aún). En paralelo, se establecerá una tabla con todos los símbolos que aún no forman
parte del árbol. En este ejemplo, estos son todos los 256 caracteres que pertenecen a un código ASCII
o ANSI.

1. Símbolo: 'a'

El número máximo de nodos (2n-1) es 11 para los 5 símbolos más el carácter de control NYA. Por lo
tanto, el índice comienza con el identificador de nodo 11 utilizado para el nodo raíz inicial. A
continuación, todas las modificaciones dentro de la tabla de códigos están marcadas en rojo, el nodo
actual está subrayado. Para proporcionar una mejor encuesta, el diagrama de flujo que contiene el
procedimiento de actualización está disponible en una ventana separada en el siguiente enlace: [ ].

Árbol de código actual antes de comenzar el procedimiento de actualización:

Sucesor

3
No. Pred. Cont. "0" "1" Peso

11. Root NYA - - 0

No hay ningún nodo de hoja disponible para el símbolo 'a'. Por lo tanto, se deben formar nuevos nodos
para 'a' y el nuevo NYA. Ambos están subordinados al nodo actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

9. 11 NYA - - 0

10. 11 "a" - - 1

11. Raíz 9 10 0

El peso del nodo actual debe ser incrementado:

Sucesor

No. Pred. Cont. "0" "1" Peso

9. 11 NYA - - 0

10. 11 "a" - - 1

11. Root 9 10 1

Como el nodo actual es el nodo raíz, el procedimiento de actualización finalizará.

2. Símbolo: 'b'

Árbol de código actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

9. 11 NYA - - 0

10. 11 "a" - - 1

11. Root 9 10 1

4
No hay ningún nodo hoja disponible para el símbolo 'b'; se requieren nuevos nodos para 'b' y NYA:

Sucesor

No. Pred. Cont. "0" "1" Peso

7. 9 NYA - - 0

8. 9 "b" - - 1

9. 11 -78 0

10. 11 "a" - - 1

11. Root 9 10 1

El peso del nodo actual debe ser incrementado:

Sucesor

No. Pred. Cont. "0" "1" Peso

7. 9 NYA - - 0

8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 1

Continuar con el predecesor del nodo actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

7. 9 NYA - - 0

8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 1

5
El nodo actual ya es el nodo más significativo del bloque. Por lo tanto, su peso puede incrementarse
sin intercambio:

Sucesor

No. Pred. Cont. "0" "1" Peso

7. 9 NYA - - 0

8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 2

Se llega al nodo raíz, el procedimiento de actualización finalizará.

3. Símbolo: 'r'

Árbol de código actual

Sucesor

No. Pred. Cont. "0" "1" Peso

7. 9 NYA - - 0

8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 2

No hay ningún nodo hoja disponible para el símbolo 'r'; se requieren nuevos nodos para 'r' y NYA:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 9 -56 0

6
8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 2

El peso del nodo actual debe ser incrementado:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 9 - 5 6 1

8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 2

Continuar con el predecesor del nodo actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 9 - 5 6 1

8. 9 "b" - - 1

9. 11 - 7 8 1

10. 11 "a" - - 1

11. Root 9 10 2

Hay un nodo de orden superior (10) en el bloque actual y no es predecesor del nodo actual. El nodo
actual (9) y el nodo más significativo (10) deben intercambiarse entre sí:

7
Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 -561

8. 10 "b" - - 1

9. 11 "a" - - 1

10. 11 -78 1

11. Root 9 10 2

El peso del nodo actual debe ser incrementado:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

9. 11 "a" - - 1

10. 11 - 7 8 2

11. Root 9 10 2

Continuar con el predecesor del nodo actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

8
9. 11 "a" - - 1

10. 11 - 7 8 2

11. Root 9 10 2

El nodo actual ya es el nodo más significativo del bloque. Por lo tanto, su peso puede incrementarse
sin intercambio:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

9. 11 "a" - - 1

10. 11 - 7 8 2

11. Root 9 10 3

Se llega al nodo raíz, el procedimiento de actualización finalizará.

4. Símbolo: 'a'

Árbol de código actual

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

9. 11 "a" - - 1

10. 11 - 7 8 2

11. Root 9 10 3

9
El nodo actual ya es el nodo más significativo del bloque. Por lo tanto, su peso puede incrementarse
sin intercambio:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

9. 11 "a" - - 2

10. 11 - 7 8 2

11. Root 9 10 3

Continuar con el predecesor del nodo actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

9. 11 "a" - - 2

10. 11 - 7 8 2

11. Root 9 10 3

El nodo actual ya es el nodo más significativo del bloque. Por lo tanto, su peso puede incrementarse
sin intercambio:

Sucesor

No. Pred. Cont. "0" "1" Peso

5. 7 NYA - - 0

10
6. 7 "r" - - 1

7. 10 - 5 6 1

8. 10 "b" - - 1

9. 11 "a" - - 2

10. 11 - 7 8 2

11. Root 9 10 4

Se llega al nodo raíz, el procedimiento de actualización finalizará.

0-342

8. 10 - 5 6 4

9. 11 "a" - - 5

10. 11 - 7 8 6

11. Root 9 10 10

Continuar con el predecesor del nodo actual:

Sucesor

No. Pred. Cont. "0" "1" Peso

1. 3 NYA - - 0

2. 3 "d" - - 1

3. 7 - 1 2 1

4. 7 "c" - - 1

5. 8 "r" - - 2

6. 8 "b" - - 2

7. 10 - 3 4 2

8. 10 - 5 6 4

9. 11 "a" - - 5

10. 11 - 7 8 6

11. Root 9 10 10

11
El nodo actual ya es el nodo más significativo del bloque. Por lo tanto, su peso puede incrementarse
sin intercambio:

Sucesor

No. Pred. Cont. "0" "1" Peso

1. 3 NYA - - 0

2. 3 "d" - - 1

3. 7 - 1 2 1

4. 7 "c" - - 1

5. 8 "r" - - 2

6. 8 "b" - - 2

7. 10 - 3 4 2

8. 10 - 5 6 4

9. 11 "a" - - 5

10. 11 - 7 8 6

11. Root 9 10 11

Se llega al nodo raíz, el procedimiento de actualización finalizará.

Bibliografía

[1] P. Estrada, «Decodificando el algoritmo de Huffman,» [En línea]. Available:


http://bitybyte.github.io/Descomprimiendo-datos-Huffman/. [Último acceso: 3 mayo 2018].

12