fbpx
Wikipedia

Algoritmo de Huffman

El algoritmo de Huffman es un algoritmo para la construcción de códigos de Huffman, desarrollado por David A. Huffman en 1952 y descrito en A Method for the Construction of Minimum-Redundancy Codes.[1]

Este algoritmo toma un alfabeto de n símbolos, junto con sus frecuencias de aparición asociadas, y produce un código de Huffman para ese alfabeto y esas frecuencias.

Descripción

El algoritmo consiste en la creación de un árbol binario que tiene cada uno de los símbolos por hoja, y construido de tal forma que siguiéndolo desde la raíz a cada una de sus hojas se obtiene el código Huffman asociado a él.

  1. Se crean varios árboles, uno por cada uno de los símbolos del alfabeto, consistiendo cada uno de los árboles en un nodo sin hijos, y etiquetado cada uno con su símbolo asociado y su frecuencia de aparición.
  2. Se toman los dos árboles de menor frecuencia, y se unen creando un nuevo árbol. La etiqueta de la raíz será la suma de las frecuencias de las raíces de los dos árboles que se unen, y cada uno de estos árboles será un hijo del nuevo árbol. También se etiquetan las dos ramas del nuevo árbol: con un 0 la de la izquierda, y con un 1 la de la derecha.
  3. Se repite el paso 2 hasta que solo quede un árbol.

Con este árbol se puede conocer el código asociado a un símbolo, así como obtener el símbolo asociado a un determinado código.

Para obtener el código asociado a un símbolo se debe proceder del siguiente modo:

  1. Comenzar con un código vacío
  2. Iniciar el recorrido del árbol en la hoja asociada al símbolo
  3. Comenzar un recorrido del árbol hacia arriba
  4. Cada vez que se suba un nivel, añadir al código la etiqueta de la rama que se ha recorrido
  5. Tras llegar a la raíz, invertir el código
  6. El resultado es el código Huffman deseado

Para obtener un símbolo a partir de un código se debe hacer así:

  1. Comenzar el recorrido del árbol en la raíz de éste
  2. Extraer el primer símbolo del código a descodificar
  3. Descender por la rama etiquetada con ese símbolo
  4. Volver al paso 2 hasta que se llegue a una hoja, que será el símbolo asociado al código

En la práctica, casi siempre se utiliza el árbol para obtener todos los códigos de una sola vez; luego se guardan en tablas y se descarta el árbol.

Ejemplo de uso

La tabla describe el alfabeto a codificar, junto con las frecuencias de sus símbolos. En el gráfico se muestra el árbol construido a partir de este alfabeto siguiendo el algoritmo descrito.

 
Árbol para construir el código Huffman del ejemplo.
Símbolo Frecuencia
A 0,15
B 0,30
C 0,20
D 0,05
E 0,15
F 0,05
G 0,10

Se puede ver con facilidad cuál es el código del símbolo E: subiendo por el árbol se recorren ramas etiquetadas con 1, 1 y 0; por lo tanto, el código es 011. Para obtener el código de D se recorren las ramas 0, 1, 1 y 1, por lo que el código es 1110.

La operación inversa también es fácil de realizar: dado el código 10 se recorren desde la raíz las ramas 1 y 0, obteniéndose el símbolo C. Para descodificar 010 se recorren las ramas 0, 1 y 0, obteniéndose el símbolo A.

Limitaciones

Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de aparición de cada símbolo, y su eficiencia depende de lo próximas a las frecuencias reales que sean las estimadas. Algunas implementaciones del algoritmo de Huffman son adaptativas, actualizando las frecuencias de cada símbolo conforme recorre el texto.

La eficiencia de la codificación de Huffman también depende del balance que exista entre los hijos de cada nodo del árbol, siendo más eficiente conforme menor sea la diferencia de frecuencias entre los dos hijos de cada nodo.

Ejemplos:

  • La codificación binaria es un caso particular de la codificación de Huffman que ocurre cuando todos los símbolos del alfabeto tienen la misma frecuencia. Se tiene pues que la codificación binaria es la más eficiente para cualquier número de símbolos equiprobables.
  • El algoritmo de Huffman aplicado sobre un alfabeto de dos símbolos asignará siempre un 1 al primero y un 0 al segundo, independientemente de la frecuencia de aparición de dichos símbolos. En este caso nunca se realiza compresión de los datos, mientras que otros algoritmos sí podrían conseguirlo.

Una manera de resolver este problema consiste en agrupar los símbolos en palabras antes de ejecutar el algoritmo. Por ejemplo, si se tiene la cadena de longitud 64

 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB 

El algoritmo de Huffman aplicado únicamente a los símbolos devuelve el código:

 1111111111111111111111111111111111111111111111111111111111111110 

También de longitud 64. Sin embargo, si antes de utilizar el algoritmo, se agrupan los símbolos en las palabras "AA", "AB" y "B" (que se codifican como 1, 01 y 00), el algoritmo devuelve la siguiente cadena:

 111111111111111111111111111111101 

que tiene longitud 33, la mitad que si no se hubiera agrupado. Si observa el árbol de Huffman, se puede comprobar que la diferencia de frecuencias entre las ramas del árbol es menor que en el caso anterior.

Variaciones del algoritmo

Códigos Huffman n-arios

Es posible crear códigos de Huffman ternarios, cuaternarios, y, en general, n-arios. Para ello solo es necesario realizar dos modificaciones al algoritmo:

  1. Los árboles a crear tendrán tantos hijos como símbolos posibles puedan aparecer en los códigos Huffman. Por ejemplo, si es ternario se crearán árboles con tres hijos; si es cuaternario, con cuatro.
  2. Si se expresa como s el número de símbolos en el alfabeto a codificar, y n el número de símbolos que aparecen en el código Huffman, entonces s-1 debe ser múltiplo de n-1. Es decir, para un código ternario, s debe valer 3, 5, 7, etc. Si esta condición no se cumple, entonces se deben añadir símbolos "nulos" con frecuencia 0, que servirán solo como relleno a la hora de construir el árbol.

Véase también

Referencias

  1. A Method for the Construction of Minimum-Redundancy Codes el 30 de mayo de 2005 en Wayback Machine.

Enlaces externos

  • Huffman en PHP.
  •   Datos: Q105492278

algoritmo, huffman, sugerido, este, artículo, sección, fusionado, codificación, huffman, véase, discusión, hayas, realizado, fusión, contenidos, pide, fusión, historiales, aquí, este, aviso, puesto, febrero, 2021, algoritmo, huffman, algoritmo, para, construcc. Se ha sugerido que este articulo o seccion sea fusionado en Codificacion Huffman vease discusion Una vez que hayas realizado la fusion de contenidos pide la fusion de historiales aqui Este aviso fue puesto el 14 de febrero de 2021 El algoritmo de Huffman es un algoritmo para la construccion de codigos de Huffman desarrollado por David A Huffman en 1952 y descrito en A Method for the Construction of Minimum Redundancy Codes 1 Este algoritmo toma un alfabeto de n simbolos junto con sus frecuencias de aparicion asociadas y produce un codigo de Huffman para ese alfabeto y esas frecuencias Indice 1 Descripcion 1 1 Ejemplo de uso 2 Limitaciones 3 Variaciones del algoritmo 3 1 Codigos Huffman n arios 4 Vease tambien 5 Referencias 6 Enlaces externosDescripcion EditarEl algoritmo consiste en la creacion de un arbol binario que tiene cada uno de los simbolos por hoja y construido de tal forma que siguiendolo desde la raiz a cada una de sus hojas se obtiene el codigo Huffman asociado a el Se crean varios arboles uno por cada uno de los simbolos del alfabeto consistiendo cada uno de los arboles en un nodo sin hijos y etiquetado cada uno con su simbolo asociado y su frecuencia de aparicion Se toman los dos arboles de menor frecuencia y se unen creando un nuevo arbol La etiqueta de la raiz sera la suma de las frecuencias de las raices de los dos arboles que se unen y cada uno de estos arboles sera un hijo del nuevo arbol Tambien se etiquetan las dos ramas del nuevo arbol con un 0 la de la izquierda y con un 1 la de la derecha Se repite el paso 2 hasta que solo quede un arbol Con este arbol se puede conocer el codigo asociado a un simbolo asi como obtener el simbolo asociado a un determinado codigo Para obtener el codigo asociado a un simbolo se debe proceder del siguiente modo Comenzar con un codigo vacio Iniciar el recorrido del arbol en la hoja asociada al simbolo Comenzar un recorrido del arbol hacia arriba Cada vez que se suba un nivel anadir al codigo la etiqueta de la rama que se ha recorrido Tras llegar a la raiz invertir el codigo El resultado es el codigo Huffman deseadoPara obtener un simbolo a partir de un codigo se debe hacer asi Comenzar el recorrido del arbol en la raiz de este Extraer el primer simbolo del codigo a descodificar Descender por la rama etiquetada con ese simbolo Volver al paso 2 hasta que se llegue a una hoja que sera el simbolo asociado al codigoEn la practica casi siempre se utiliza el arbol para obtener todos los codigos de una sola vez luego se guardan en tablas y se descarta el arbol Ejemplo de uso Editar La tabla describe el alfabeto a codificar junto con las frecuencias de sus simbolos En el grafico se muestra el arbol construido a partir de este alfabeto siguiendo el algoritmo descrito Arbol para construir el codigo Huffman del ejemplo Simbolo FrecuenciaA 0 15B 0 30C 0 20D 0 05E 0 15F 0 05G 0 10Se puede ver con facilidad cual es el codigo del simbolo E subiendo por el arbol se recorren ramas etiquetadas con 1 1 y 0 por lo tanto el codigo es 011 Para obtener el codigo de D se recorren las ramas 0 1 1 y 1 por lo que el codigo es 1110 La operacion inversa tambien es facil de realizar dado el codigo 10 se recorren desde la raiz las ramas 1 y 0 obteniendose el simbolo C Para descodificar 010 se recorren las ramas 0 1 y 0 obteniendose el simbolo A Limitaciones EditarPara poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de aparicion de cada simbolo y su eficiencia depende de lo proximas a las frecuencias reales que sean las estimadas Algunas implementaciones del algoritmo de Huffman son adaptativas actualizando las frecuencias de cada simbolo conforme recorre el texto La eficiencia de la codificacion de Huffman tambien depende del balance que exista entre los hijos de cada nodo del arbol siendo mas eficiente conforme menor sea la diferencia de frecuencias entre los dos hijos de cada nodo Ejemplos La codificacion binaria es un caso particular de la codificacion de Huffman que ocurre cuando todos los simbolos del alfabeto tienen la misma frecuencia Se tiene pues que la codificacion binaria es la mas eficiente para cualquier numero de simbolos equiprobables El algoritmo de Huffman aplicado sobre un alfabeto de dos simbolos asignara siempre un 1 al primero y un 0 al segundo independientemente de la frecuencia de aparicion de dichos simbolos En este caso nunca se realiza compresion de los datos mientras que otros algoritmos si podrian conseguirlo Una manera de resolver este problema consiste en agrupar los simbolos en palabras antes de ejecutar el algoritmo Por ejemplo si se tiene la cadena de longitud 64 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB El algoritmo de Huffman aplicado unicamente a los simbolos devuelve el codigo 1111111111111111111111111111111111111111111111111111111111111110 Tambien de longitud 64 Sin embargo si antes de utilizar el algoritmo se agrupan los simbolos en las palabras AA AB y B que se codifican como 1 01 y 00 el algoritmo devuelve la siguiente cadena 111111111111111111111111111111101 que tiene longitud 33 la mitad que si no se hubiera agrupado Si observa el arbol de Huffman se puede comprobar que la diferencia de frecuencias entre las ramas del arbol es menor que en el caso anterior Variaciones del algoritmo EditarCodigos Huffman n arios Editar Es posible crear codigos de Huffman ternarios cuaternarios y en general n arios Para ello solo es necesario realizar dos modificaciones al algoritmo Los arboles a crear tendran tantos hijos como simbolos posibles puedan aparecer en los codigos Huffman Por ejemplo si es ternario se crearan arboles con tres hijos si es cuaternario con cuatro Si se expresa como s el numero de simbolos en el alfabeto a codificar y n el numero de simbolos que aparecen en el codigo Huffman entonces s 1 debe ser multiplo de n 1 Es decir para un codigo ternario s debe valer 3 5 7 etc Si esta condicion no se cumple entonces se deben anadir simbolos nulos con frecuencia 0 que serviran solo como relleno a la hora de construir el arbol Vease tambien EditarCodificacion HuffmanReferencias Editar A Method for the Construction of Minimum Redundancy Codes Archivado el 30 de mayo de 2005 en Wayback Machine Enlaces externos EditarHuffman en PHP Datos Q105492278 Obtenido de https es wikipedia org w index php title Algoritmo de Huffman amp oldid 133221777, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos