CODIGOS DE HUFFMAN ESTRUCTURAS DE DATOS
CODIFICACION La palabra código ya nos indica algo “secreto” Codificar un texto  Reemplazarlo con códigos que solo nosotros conozcamos Para obtener el texto original Se debe decodificar En el envío de información es muy popular Para ocular la información y volver el envio mas seguro
UNA FORMA Códigos binarios  Que represente cada letra del alfabeto. Si el alfabeto esta conformado por A, B, C, y D Podemos codificar cada letra con 010, 100, 000, 111 La cadena ABACCDA quedaria 010100010000000111010
ANALIZANDO Ventajas Es muy fácil codificar y decodificar Solo reemplazar Cada código tiene la misma longitud Desventajas La cadena resultante es muy larga comparada con el mensaje Como se podrá reducir la cadena codificada?
MEJORAR LA CODIFICACION A  es la letra que mas se repite en el mensaje, Debería tener un código pequeño(menos espacio) La letra que menos aparece Puede tener un codigo mas grande El codigo de cada letra Puede depender de la frecuencia de la letra en la cadena O del idioma
UN EJEMPLO A, B, C, D Se le puede asignar 0, 110, 10, 111 Entonces ABACCDA es 0110010101110 Ya!, mas pequeña Codificar es super facil Y Decodificar???
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
CONCLUSION Para decodificar Escoger primer bit Determinar código entre ABCD A B C D Si es 0, es la letra A Si no, la letra podria ser BCD A(0) B C D(1) 0 1 1 0 0 1 0 1 0 1 1 1 Si es 0: C Si no, Determinar codigo entre BD C(0) B D(1) Si es 0: B Si no, es D Escoger siguiente bit Determinar codigo entre BCD Escoger siguiente bit Determinar codigo entre BD 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
CONSTRUIR EL ARBOL Necesitamos la frecuencia de cada letra en la cadena Ej:  ABACCDA  Empecemos con las dos letras de menor frecuencia Se unen y crean un nuevo simbolo La frecuencia del nuevo es la suma de los dos ant. Se desechan los dos anteriores El grupo de letras se vuelve mas pequeño Todo se repite hasta que no queden mas letras ind. Notemos que c/letra es una hoja 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
CONSEGUIR LOS CODIGOS Es una busqueda binaria Los codigos se van acumulando a medida que se busca la letra Las letras siempre son hojas Si letra buscada esta En el subarbol izquierdo, se acumula un 0 o En el subarbol derecho, se acumula un 1 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
EJERCICIO EN CLASE Construya el arbol de Huffman con la siguientes frecuencias A 15 B 6 C 7 D 12 E 25 F 4 G 6 H 3 I 15
DECIDIENDO QUE USAR Los nodos con menor frecuencia Salen primero Se unen, se crea un nuevo nodo Este se vuelve a ubicar en el listado de letras Cola de Prioridad , prioridad: la frecuencia Primero, se construyen hojas para c/letra Para facilitar la ubicación de un nodo hoja al crear codigos Estos son alamacenados a una cola de Prioridad A 3 B 1 C 2 D 1 A 3 B 1 C 2 D 1
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:
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;
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; }
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; }

Codigos De Huffman

  • 1.
    CODIGOS DE HUFFMANESTRUCTURAS DE DATOS
  • 2.
    CODIFICACION La palabracódigo ya nos indica algo “secreto” Codificar un texto Reemplazarlo con códigos que solo nosotros conozcamos Para obtener el texto original Se debe decodificar En el envío de información es muy popular Para ocular la información y volver el envio mas seguro
  • 3.
    UNA FORMA Códigosbinarios Que represente cada letra del alfabeto. Si el alfabeto esta conformado por A, B, C, y D Podemos codificar cada letra con 010, 100, 000, 111 La cadena ABACCDA quedaria 010100010000000111010
  • 4.
    ANALIZANDO Ventajas Esmuy fácil codificar y decodificar Solo reemplazar Cada código tiene la misma longitud Desventajas La cadena resultante es muy larga comparada con el mensaje Como se podrá reducir la cadena codificada?
  • 5.
    MEJORAR LA CODIFICACIONA es la letra que mas se repite en el mensaje, Debería tener un código pequeño(menos espacio) La letra que menos aparece Puede tener un codigo mas grande El codigo de cada letra Puede depender de la frecuencia de la letra en la cadena O del idioma
  • 6.
    UN EJEMPLO A,B, C, D Se le puede asignar 0, 110, 10, 111 Entonces ABACCDA es 0110010101110 Ya!, mas pequeña Codificar es super facil Y Decodificar???
  • 7.
    DECODIFICANDO 0 11 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.
    CONCLUSION Para decodificarEscoger primer bit Determinar código entre ABCD A B C D Si es 0, es la letra A Si no, la letra podria ser BCD A(0) B C D(1) 0 1 1 0 0 1 0 1 0 1 1 1 Si es 0: C Si no, Determinar codigo entre BD C(0) B D(1) Si es 0: B Si no, es D Escoger siguiente bit Determinar codigo entre BCD Escoger siguiente bit Determinar codigo entre BD 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.
    CONSTRUIR EL ARBOLNecesitamos la frecuencia de cada letra en la cadena Ej: ABACCDA Empecemos con las dos letras de menor frecuencia Se unen y crean un nuevo simbolo La frecuencia del nuevo es la suma de los dos ant. Se desechan los dos anteriores El grupo de letras se vuelve mas pequeño Todo se repite hasta que no queden mas letras ind. Notemos que c/letra es una hoja 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.
    CONSEGUIR LOS CODIGOSEs una busqueda binaria Los codigos se van acumulando a medida que se busca la letra Las letras siempre son hojas Si letra buscada esta En el subarbol izquierdo, se acumula un 0 o En el subarbol derecho, se acumula un 1 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.
    EJERCICIO EN CLASEConstruya el arbol de Huffman con la siguientes frecuencias A 15 B 6 C 7 D 12 E 25 F 4 G 6 H 3 I 15
  • 12.
    DECIDIENDO QUE USARLos nodos con menor frecuencia Salen primero Se unen, se crea un nuevo nodo Este se vuelve a ubicar en el listado de letras Cola de Prioridad , prioridad: la frecuencia Primero, se construyen hojas para c/letra Para facilitar la ubicación de un nodo hoja al crear codigos Estos son alamacenados a una cola de Prioridad A 3 B 1 C 2 D 1 A 3 B 1 C 2 D 1
  • 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.
    LA COLA DEPRIORIDAD 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.
    IMPLENTACION: CONSTRUIR ARBOLArbol 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.
    IMPLEMENTACION: ASIGNAR CODIGOSstring 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; }