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