Sie sind auf Seite 1von 8

Los cdigos de Huffman son posiblemente la variante ms conocida de los compresores estadsticos, que aprovechan las caractersticas estadsticas

de los datos de entrada asignando cdigos ms cortos a los datos que mas se repiten, logrando as un efecto compresor. Para lograrlo, el compresor debe recorrer una vez el vector con la informacin entrante para crear una tabla con la frecuencia de cada carcter, y luego otra vez para traducir la fuente en los cdigos adecuados. Esta doble pasada no siempre es posible, y aqu es donde entran las variantes adaptativas, que son capaces de generar la compresin en una sola pasada, al ir modificando los cdigos de salida conforme van llegando nuevos cdigos a la entrada.

El algoritmo
Como ya mencion anteriormente, la compresin Huffman adaptativa se diferencia de la normal en que los datos estadsticos se generan en la misma pasada que se envan los cdigos de salida, y esto tiene un problema evidente: cmo se enva un dato que an no ha sido registrado en la tabla de smbolos? Reconstruir la tabla con cada carcter nuevo requerira muchsimo tiempo de CPU! Por ello, lo que se hace es modificar el rbol binario del algoritmo Huffman aadiendo un valor especial llamado NYT, not yet transmitted, que servir como marcador de nuevo carcter, es decir, si tenemos la entrada araar, la salida seria NYT a NYT r CODIGO(a) NYT CODIGO(a) CODIGO(r). Otro problema que surge es el de la optimalidad de los cdigos, ya que si simplemente vamos aadiendo caracteres al rbol estadstico conforme aparecen en la entrada, se perderan las ventajas de la compresin Huffman. Por ello, cada vez que se lee un carcter hay que actualizar el rbol, que pasa a ser bastante mas complejo que el algoritmo no adaptativo, de una manera determinada, dependiendo de si es un nuevo carcter o si ya estaba en el rbol.

Fig. 1. rbol de ejemplo, conteniendo la palabra abra Los nuevos elementos que podemos advertir en el rbol binario del algoritmo adaptativo frente al clsico son la presencia del cdigo NYT, la numeracin de los nodos y un contador de cada carcter. Con este contador llevamos la cuenta de cuantas veces ha aparecido el valor, y es lo que definir en que posicin del rbol pondremos al carcter en caso de reorganizacin, mientras que la numeracin nos servir para decidir que nodos deben intercambiar su posicin.

Un ejemplo paso a paso


Veamos con un ejemplo como funciona el algoritmo, usando la palabra abracadabra.

Fig. 2. rbol vaco Comenzamos con un rbol vaco, al que le llega el primer carcter, a.

Fig. 3. rbol para a Con la llegada del primer dato, el algoritmo enva el dato tal cual, a y despus genera los primeros nodos del rbol, es decir, el nodo para el NYT, con el contador a cero, y el del propio dato, con el contador a uno, y el nodo padre, el raz en este caso, con la suma de los contadores de sus hijos.

Fig. 4. rbol para ab Tenemos un nuevo dato, as que enviamos el NYT para comunicrselo al destino, seguido del propio dato, por lo que el mensaje enviado completo por el momento es a 0b. Este mensaje realmente se compone de los ocho bits del smbolo a, seguido del bit 0 y de los ocho de b, por lo que es importante que tanto compresor como receptor estn de acuerdo en el tamao del dato base, que en el programa que nos ocupa es de ocho bits. Una vez enviados los nuevos cdigos, se reestructura el rbol aadiendo el nuevo carcter b como hijo derecho del NYT, y creando un nuevo NYT como hijo izquierdo, y actualizando los contadores en cascada hacia la raz, efectivamente creando un rbol balanceado.

Fig. 5a. rbol para abr no actualizado Con el nuevo carcter r llegamos a un punto crucial del algoritmo: la actualizacin del rbol. Primero, se manda el NYT y el dato r, con lo que el mensaje comprimido es ahora a 0b 00r (recordemos que siempre se mandan los NYT de antes de meter el nuevo carcter en el rbol). Lo introducimos en el lugar del NYT y llegamos a una posicin en la que no se cumple la posicin de balanceo del rbol, ya que el nodo 49 tiene el valor 2, suma de los valores de sus dos hijos, mientras que su hermano 50 tiene el valor 1, ya que el carcter a solo ha aparecido una vez hasta ahora. Por lo tanto, los intercambiamos, en un ajuste de balanceo que en este algoritmo es llamado simplemente proceso de ajuste del rbol.

Fig. 5b. rbol para abr actualizado Otro carcter a, que como ya est en el rbol es enviado comprimido, con lo que tenemos a 0b 00r 0.

Fig. 6. rbol para abra Ahora es el turno del dato c, que como no est en el rbol, mandamos el NYT y el dato en claro: a 0b 00r 0 100c. Despus lo aadimos al rbol.

Fig. 7a. rbol para abrac no actualizado De nuevo el rbol necesita ser actualizado, ya que los nodos 47 y 48 han dejado de cumplir la condicin de balanceo.

Fig. 7b. rbol para abrac actualizado Otra a, con lo que el mensaje completo es ahora a 0b 00r 0 100c 0.

Fig. 8. rbol para abraca El dato d es nuevo, as que lo enviamos ( a 0b 00r 0 100c 0 1100d )y expandimos el nodo de NYT para acomodarlo. Adems, va a desequilibrar el rbol, que necesitar un ajuste.

Fig. 9a. rbol para abracad antes de actualizar

Fig. 9b. rbol para abracad balanceado La tercera a, con lo que el mensaje comprimido es ahora a 0b 00r 0 100c 0 1100d 0.

Fig. 10. rbol para abracada El siguiente carcter b, aunque ya est en el rbol y podra parecer que simplemente bastara con aumentar su contador y enviar su cdigo, en realidad va a generar un proceso interesante que podra cambiar el rbol casi por completo: una actualizacin en cascada.

Fig. 11a. rbol para abracadab sin actualizar Primero, los nodos 45 y 46 deben ser intercambiados, ya al aumentar el contador de b, su nodo tiene mas peso que su hermano derecho.

Fig. 11b. rbol para abracadab actualizndose Intercambiados los nodos, aumentamos el valor de b y de los padres hasta la raz, verificando en cada nodo si es necesaria una nueva actualizacin, aunque en este ejemplo no se da el caso.

Fig. 11c. rbol para abracadab actualizado Los dos caracteres que faltan, r y a, no tienen mucha historia, simplemente enviamos el cdigo y actualizamos los contadores correspondientes, con lo que el cdigo final es a 0b 00r 0 100c 0 1100d 0 110 110 0, es decir, 60 bits, frente a los 88 que haran falta para mandar el mensaje sin comprimir.

Fig. 12. rbol para abracadabr

Fig. 13. rbol para abracadabra

La descompresin
Ahora veamos un ejemplo de descompresin. Tenemos la cadena a 0b 00r 0 100c 0 1100d 0 110 110 0 (de nuevo, imaginemos que en vez de los caracteres tenemos grupos de 8 bits con la representacin ascii de dichos caracteres). Leemos los primeros ocho bits, ya que forzosamente el primer carcter debe estar sin codificar, con lo que ya tenemos la a, y la introducimos en el rbol. El siguiente dato, o bien es un uno si es otra vez la a, o es un cero para indicar el valor NYT. En nuestro caso, es un cero, as que lo leemos y los siguientes ocho bits, con lo que ya tenemos ab. Ahora el descompresor tendra en su memoria un rbol anlogo al de la figura 4, por lo que al leer un cero sabemos que debemos leer al menos un bit ms. Efectivamente, nos llega otro cero, con lo que tenemos un NYT. Leemos otros ocho bits y ya tenemos abr. Actualizamos el rbol, igual que hacamos en la compresin, y leemos un cero, lo que nos indica que tenemos otra a. Leemos un bit y tenemos un uno, que no es ningn cdigo conocido, leemos otro y tenemos uno-cero, que sigue siendo desconocido. Volvemos a leer y tenemos uno-cerocero, que en la disposicin actual del rbol ( fig 6 ) es un NYT. Leemos ocho bits ms, tenemos abrac. Sacamos un cero de la cadena, y como sabemos por el rbol que es una a, tenemos abraca. Se lee bit a bit hasta que tenemos una combinacin con significado, y en este caso, se trata de nuevo de un NYT, acompaado de los ocho bits de la d, con lo que el cdigo hasta ahora es abracad. Hasta el final, tenemos caracteres sueltos que completan el mensaje, que es, claro esta, abracadabra.

Otras entradas de la web que podrian interesarte: (364)Mar 28 ARTICULO Mldonkey como servicio en windows (495) Nov 30 DELPHI Procedimiento que ordena una lista de cadenas (los lines de los richedit, meno, listbox, ...) usando el algoritmo de la burbuja (856) Dec 30 PROCESSING JAVA APPLET GRAFICOS PROGRAMACION Convertir imagen en circulitos en Processing (759) Apr 29 PRINCIPAL PHP PROGRAMACION FOTOS Pings XMLRPC con PHP super sencillos (871) Apr 06 JAVA PROGRAMACION Pasar un numero variable de parametros en Jav

Das könnte Ihnen auch gefallen