CODIGO DE HUFFMAN

18,374 views

Published on

CODIGO DE HUFFMAN

Published in: Education
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total views
18,374
On SlideShare
0
From Embeds
0
Number of Embeds
94
Actions
Shares
0
Downloads
0
Comments
1
Likes
11
Embeds 0
No embeds

No notes for slide

CODIGO DE HUFFMAN

  1. 1. CODIGOS DE HUFFMAN ESTRUCTURAS DE DATOS
  2. 2. CODIFICACION <ul><li>La palabra codigo ya nos indica algo “secreto” </li></ul><ul><li>Codificar un texto </li></ul><ul><ul><li>Reemplazarlo con códigos que solo nosotros conozcamos </li></ul></ul><ul><li>Para obtener el texto original </li></ul><ul><ul><li>Se debe decodificar </li></ul></ul><ul><li>En el envío de información es muy popular </li></ul><ul><ul><li>Para ocular la información y volver el envio mas seguro </li></ul></ul>
  3. 3. UNA FORMA <ul><li>Codigos binarios </li></ul><ul><ul><li>Que represente cada letra del alfabeto. </li></ul></ul><ul><li>Si el alfabeto esta conformado por </li></ul><ul><ul><li>A, B, C, y D </li></ul></ul><ul><li>Podemos codificar cada letra con </li></ul><ul><ul><li>010, 100, 000, 111 </li></ul></ul><ul><li>La cadena ABACCDA quedaria </li></ul><ul><ul><li>010100010000000111010 </li></ul></ul>
  4. 4. ANALIZANDO <ul><li>Ventajas </li></ul><ul><ul><li>Es muy facil codificar y decodificar </li></ul></ul><ul><ul><li>Solo reemplazar </li></ul></ul><ul><ul><li>Cada código tiene la misma longitud </li></ul></ul><ul><li>Desventajas </li></ul><ul><ul><li>La cadena resultante es muy larga comparada con el mensaje </li></ul></ul><ul><li>Como se podra reducir la cadena codificada? </li></ul>
  5. 5. MEJORAR LA CODIFICACION <ul><li>A es la letra que mas se repite en el mensaje, </li></ul><ul><ul><li>Debería tener un código pequeño(menos espacio) </li></ul></ul><ul><li>La letra que menos aparece </li></ul><ul><ul><li>Puede tener un codigo mas grande </li></ul></ul><ul><li>El codigo de cada letra </li></ul><ul><ul><li>Puede depender de la frecuencia de la letra en la cadena </li></ul></ul><ul><ul><li>O del idioma </li></ul></ul>
  6. 6. UN EJEMPLO <ul><li>A, B, C, D </li></ul><ul><li>Se le puede asignar 0, 110, 10, 111 </li></ul><ul><li>Entonces ABACCDA es 011001010111 </li></ul><ul><ul><li>Ya!, mas pequeña </li></ul></ul><ul><li>Codificar es super facil </li></ul><ul><li>Y Decodificar??? </li></ul>
  7. 7. DECODIFICANDO 0 1 1 0 0 1 0 1 0 1 1 1 A Puede ser B, C o D ? Puede ser B o D ? B A Puede ser B, C o D ? C Puede ser B, C o D C Puede ser B, C o D ? Puede ser B o C ? D Para decodificar hay que elegir. El valor del codigo depende del valor siguiente: 1 o 0, binario A 0 B 110 C 10 D 111
  8. 8. CONCLUSION <ul><li>Para decodificar </li></ul><ul><ul><li>Escoger primer bit </li></ul></ul><ul><ul><li>Determinar código entre ABCD </li></ul></ul>A B C D <ul><ul><ul><li>Si es 0, es la letra A </li></ul></ul></ul><ul><ul><ul><li>Si no, la letra podria ser BCD </li></ul></ul></ul>A(0) B C D(1) 0 1 1 0 0 1 0 1 0 1 1 1 <ul><ul><ul><li>Si es 0: C </li></ul></ul></ul><ul><ul><ul><li>Si no, Determinar codigo entre BD </li></ul></ul></ul>C(0) B D(1) <ul><ul><ul><li>Si es 0: B </li></ul></ul></ul><ul><ul><ul><li>Si no, es D </li></ul></ul></ul><ul><ul><li>Escoger siguiente bit </li></ul></ul><ul><ul><li>Determinar codigo entre BCD </li></ul></ul><ul><ul><li>Escoger siguiente bit </li></ul></ul><ul><ul><li>Determinar codigo entre BD </li></ul></ul>B(0) D(1) Arbol de Huffman Si logro generar un arbol asi, podre obtener los codigos: codificar Y luego podre volver a la informacion inicial: decodificar A 0 B 110 C 10 D 111
  9. 9. CONSTRUIR EL ARBOL <ul><li>Necesitamos la frecuencia de cada letra en la cadena </li></ul>Ej: ABACCDA <ul><li>Empecemos con las dos letras de menor frecuencia </li></ul><ul><ul><li>Se unen y crean un nuevo simbolo </li></ul></ul><ul><ul><li>La frecuencia del nuevo es la suma de los dos ant. </li></ul></ul><ul><ul><li>Se desechan los dos anteriores </li></ul></ul><ul><ul><li>El grupo de letras se vuelve mas pequeño </li></ul></ul><ul><ul><li>Todo se repite hasta que no queden mas letras ind. </li></ul></ul><ul><li>Notemos que c/letra es una hoja </li></ul>BD Una vez construido el arbol, obtendremos los codigos de c/letra A 3 B 1 C 2 D 1 A 3 B 1 C 2 D 1 B(0) 1 D(1) 1 A 3 C 2 B D 2 C(0) 2 BD(1) 2 CBD 4 C B D 4 A(0) 3 CBD(1) 4 ACBD 7 ABCD 7
  10. 10. CONSEGUIR LOS CODIGOS <ul><li>Es una busqueda binaria </li></ul><ul><li>Los codigos se van acumulando a medida que se busca la letra </li></ul><ul><li>Las letras siempre son hojas </li></ul><ul><li>Si letra buscada esta </li></ul><ul><ul><li>En el subarbol izquierdo, se acumula un 0 o </li></ul></ul><ul><ul><li>En el subarbol derecho, se acumula un 1 </li></ul></ul>0 1 11 110 1 10 1 11 111 CBD 4 B(0) 1 D(1) 1 C(0) 2 BD(1) 2 A(0) 3 CBD(1) 4 ACBD 7 A B C D
  11. 11. EJERCICIO EN CLASE <ul><li>Construya el arbol de Huffman con la siguientes frecuencias </li></ul>A 15 B 6 C 7 D 12 E 25 F 4 G 6 H 3 I 15
  12. 12. DECIDIENDO QUE USAR <ul><li>Los nodos con menor frecuencia </li></ul><ul><ul><li>Salen primero </li></ul></ul><ul><ul><li>Se unen, se crea un nuevo nodo </li></ul></ul><ul><ul><li>Este se vuelve a ubicar en el listado de letras </li></ul></ul><ul><ul><li>Cola de Prioridad , prioridad: la frecuencia </li></ul></ul><ul><li>Primero, se construyen hojas para c/letra </li></ul><ul><li>Para facilitar la ubicación de un nodo hoja al crear codigos </li></ul><ul><ul><li>Estos son alamacenados a una cola de Prioridad </li></ul></ul>A 3 B 1 C 2 D 1 A 3 B 1 C 2 D 1
  13. 13. DECLARACION DE TDA: ARBOL E INFO typedef struct { string Cadena; int frecuencia; char bit; }Info; Cada elemento del nodo tiene: una cadena, frecuencia y un bit Es ideal agrupar toda esta informacion en un nuevo tipo de dato typedef struct { Generico G; NodoArbol *izq, *der; }NodoAB; Cada Nodo tendra Info, sub. Iza. Y subarbol der:
  14. 14. LA COLA DE PRIORIDAD La cola de Prioridad almacenará nodos de Arbol. Se la puede implementar como una lista ordenada o un arreglo Si fuese lista, cada nodo seria y la cola: typedef LSE Cola; typedef struct { Generico G; //La informacion que almacena es NodoAB * NodoCola *sig; }Nodo_LSE;
  15. 15. IMPLENTACION: CONSTRUIR ARBOL Arbol ConstruirHuffman(Info_Nodo Frecuencias[], int n){ Cola Q; Info_Arbol I; Arbol nuevo, aizq, ader; VaciarCola(Q); //Construir nodos hojas for(i = 0; i < n; i++){ nuevo = NuevaHoja(Frecuencias[i]); EnCola(Q, nuevo); } //Construir arbol while(TRUE){ aizq = Desencola(Q); ader = Desencola(Q); aizq->I.bit = ‘0’; ader->I.bit = ‘1’; tmp.frec = aizq->I.frec + ader->I.frec; tmp.cadena = StringConcat(aizq->I.cadena, ader->I.cadena); nuevo = NuevaHoja(tmp); nuevo->izq = aizq; nuevo->der = ader; if(QEstaVacia(Q)) break; EnCola(C, nuevo); } return nuevo; }
  16. 16. IMPLEMENTACION: ASIGNAR CODIGOS string CodificarLetra(char L, Arbol H){ Arbol p; string strcodigo=“”; p = A; while(!EsHoja(p) && !EstaVacio(p)){ if(FindChar(p->izq->I.cadena, L) >= 0){ strcodigo = Concat(strcodigo, “0”); p = p->izq; } else if (FindChar(p->der->I.cadena, L) >= 0){ strcodigo = Concat(strcodigo, “1”); p = p->der; } else { strcodigo = CopyString(“”); break; } } return strcodigo; }

×