codigos de huffman - LDC - Universidad Simón Bolívar

Anuncio
Universidad Simón Bolívar
Departamento de Computación y Tecnología de la Información
Organización del Computador
CI-3815
Proyecto 1
•
Objetivos Generales: realizar un programa en lenguaje de bajo nivel del
simulador de la máquina MIPS, SPIM.
•
Objetivos Específicos:
o Adquirir destrezas en el lenguaje de bajo nivel del simulador SPIM
o Aprender a realizar la traducción de alto nivel a bajo nivel de
instrucciones comunes
o Aprender a utilizar distintas estructuras de datos a bajo nivel.
o Adquirir destrezas en el manejo de subrutinas y la aplicación de las
convenciones de responsabilidad compartida
Introducción
La codificación de Huffman es una técnica para la compresión de datos ampliamente
usada y muy efectiva. Este algoritmo le asigna secuencias binarias (códigos) a los
símbolos de un alfabeto de forma tal de utilizar la menor cantidad de bits posibles.
La idea del algoritmo de Huffman es que los datos a ser comprimidos contienen
símbolos que aparecen con mayor frecuencia y otros que aparecen muy poco,
asignándole un código más corto a los que más aparecen.
Supongamos que en un cierto texto aparecen 6 caracteres diferentes y la frecuencia de
aparición de cada uno de ellos es la siguiente:
Frecuencia
a
b
c
d
e
f
45
13
12
16
9
5
¿ Cómo podemos codificar los caracteres para comprimir el espacio ocupado utilizando
un código binario ?
Solución 1 : Código de longitud fija. Para 6 caracteres se necesitan 3 bits
Fija
a
b
c
d
e
f
000
001
010
011
100
101
Solución 2 : Código de longitud variable en el que los más frecuentes tienen el código
más corto. Restricción: ningún código es prefijo de otro.
1
Variable
a
b
c
d
e
f
0
101
100
111
1101
1100
Esta técnica de codificación se denomina código prefijo. Para la codificación de un
texto, basta con concatenar el código de cada uno de los caracteres que conforman dicho
texto
aabacd ≡ 0⋅0⋅101⋅0⋅100⋅111≡ 001010100111
La decodificación de un texto cifrado es fácil pues ningún código es prefijo de otro
código y por lo tanto NO hay ambigüedad.
101011101111011100 ≡ badadcf
Para la aplicación de la codificación Huffman es necesario representar el código prefijo
mediante un árbol binario, en donde:
•
•
Las hojas representan los símbolos o los caracteres, y
El camino de la raíz a las hojas con la interpretación 0 a la izquierda y 1 a la
derecha nos da el código prefijo
Para el ejemplo anterior, la codificación de longitud variable sería
0
100
1
a:45
55
0
25
0
c:12
1
14
b:13
f:5
30
0
1
bb:
1
0
d:16
1
e:9
2
Note que los caracteres que presentan mayor frecuencia obtienen un código con menor
longitud y los menos frecuentes tienen códigos de mayor longitud.
A continuación se muestra como, a partir de una lista de frecuencias, se genera el árbol
binario usado para generar los códigos Huffman.
Ejemplo de funcionamiento
Fase 1. : Caracteres colocados en orden creciente de frecuencia.
f:5
e:9
c:12
b:13
d:16
a:45
Fase 2. y posteriores: Fusionar hasta obtener un sólo árbol manteniendo el
ordenamiento creciente.
Se fusionan el nodo f y e que son los menores en frecuencia. Al fusionarlos se obtiene
una frecuencia conjunta de 14 ( 5 + 9 ). Este nuevo nodo es colocado en la lista
respetando el ordenamiento de menor a mayor. Para el desarrollo de nuestro proyecto,
en caso de tener nodos con la misma frecuencia, vamos a colocar el nuevo nodo de
primero entre los que tengan igual frecuencia.
c:12
14
b:13
0
f:5
d:16
a:45
1
e:9
A continuación se fusionan los dos nodos con menor frecuencia ( c y b ), obteniéndose
una frecuencia conjunta de 25. Este nuevo nodo es colocado en la posición que le
corresponda por su frecuencia
d:16
14
0
f:5
1
e:9
a:45
25
0
c:12
1
b:13
3
Se fusionan los nodos fe y d con una frecuencia conjunta de 30 y se coloca en la
posición apropiada.
25
1
0
b:13
14
0
c:12
a:45
30
1
d:16
1
0
f:5
e:9
Se fusionan los nodos cb y fed y se obtiene una frecuencia conjunta de 55.
a:45
0
55
1
25
0
c:12
30
1
0
b:13
14
0
f:5
1
d:16
1
e:9
Finalmente se fusionan los nodos a y cbfed, y se obtiene el árbol de códigos prefijos
4
Arbol de códigos prefijos
0
100
1
a:45
55
0
1
25
30
0
1
c:12
b:13
1
0
d:16
14
1
0
f:5
e:9
Obteniéndose asi la siguiente tabla de codificación
Variable
a
b
c
d
e
f
0
101
100
111
1101
1100
5
Enunciado del Proyecto
Se desea que Ud. implemente el algoritmo de Huffman para la compresión y
descompresión de textos o archivos. Para ello deberá implementar un menú con las
siguientes opciones:
1.
Análisis de Texto: Se introduce el texto a analizar por medio de una etiqueta
TEXTO colocada en el área de datos en el archivo exception.s que se instala
junto con el simulador. Este texto será analizado para obtener la frecuencia
de cada carácter que aparece en el texto. Tenga en cuenta que el carácter
<espacio> debe ser incluido si éste aparece en el texto. Asuman que el texto
sólo puede contener letras minúsculas y el carácter <espacio>
.data
TEXTO: .asciiz “Esto es un ejemplo de posible texto a comprimir”
Nota: deben respetar el nombre de la etiqueta, pues para la revisión de su
proyecto, usaremos nuestra versión de exception.s con dicha etiqueta y con
el texto que se usará como caso de prueba
2.
Impresión de las frecuencias. Esta opción permite visualizar qué
caracteres aparecen en el texto con su respectiva frecuencia. Sólo interesan
los caracteres que aparecieron en el texto.
3.
Construcción del árbol. Esta opción lleva a cabo la generación del árbol de
códigos prefijos basado en la frecuencia obtenida en la opción 1. Debe
verificar que se disponga de dichas frecuencias.
4.
Impresión de los códigos prefijos. Con esta opción es posible obtener los
códigos prefijos para cada carácter que aparece en el texto con el cual se está
trabajando. Deben mostrar el carácter, el código asignado y la longitud en
bits del código. Recuerden que con la codificación Huffman los caracteres
son representados por códigos de longitud variable. Para facilidad, muestren
el código de Huffman en decimal
5.
Carácter
Código
Huffman
Longitud
a
b
c
d
e
f
0
5
4
7
13
12
1
3
3
3
4
4
Compresión del texto. Basado en los códigos prefijos obtenidos en la
opción 3, convierte el texto original representado con códigos ASCII a una
representación usando los códigos Huffman. El texto estará conformado por
una secuencia de 0 y 1. Recuerden que la nueva codificación es de tamaño
6
variable y no necesariamente ocupa los 8 bits que ocupa la representación
ASCII. Ejemplo
aabacd ≡ 0⋅0⋅101⋅0⋅100⋅111≡ 001010100111
Para facilitar la corrección, la codificación obtenida será impresa como
enteros de 8 bits. Es decir
aabacd ≡ 00101010 0111 ≡ 42 – 7
El resultado de la compresión deberán colocarlo en el área de datos en el
excpetion.s bajo la etiqueta COMPR
6.
Descompresión del texto. Esta opción toma la secuencia de 1 y 0 y obtiene
el texto en ASCII, es decir obtiene el texto en su representación original.
Para la descompresión tomará la cadena de 0 y 1 que se encuentra
almacenada bajo la etiqueta COMPR en el área de datos dentro del
exception.s
Detalles de Implementación
Para el desarrollo del proyecto deben implementar las distintas funciones siguiendo las
convenciones compartidas de SPIM. Es importante que estas convenciones se cumplan
pues de lo contrario será penalizado su código. Para cada función que se implemente
debe especificar los argumentos que recibe y el valor de retorno de la función.
Lleve a cabo el desarrollo de su proyecto de forma modular. Puede desarrollar
funciones adicionales que le permitan mantener su código más estructurado y fácil de
leer.
Entrega
El proyecto debe ser entregado antes de la medianoche del lunes de la semana 9 (15 de
junio). Será entregado a través de Aula Virtual. Deben formar sus grupos a través de
Aula Virtual y la entrega se hará a través de la sección de Documentos del grupo
correspondiente.
El día martes 16 de junio durante la clase de Teoría deberán entregar en un sobre
manila cerrado el listado de su código documentado, incluyendo la planificación de
registros por función y las especificaciones de los argumentos de las funciones
implementadas asi como los de los valores de retorno. También deberá incluir un
informe corto en dónde especifiquen las estructuras de datos utilizadas para la
implementación de su proyecto.
7
Descargar