?? alf.htm
字號(hào):
<ol><li>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貿(mào)n.</li><li>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.</li><li>Se repite el paso 2 hasta que s貿(mào)lo quede un 謾rbol.</li></ol><p>Con este 謾rbol se puede conocer el c貿(mào)digo asociado a un s鉚mbolo, as鉚 como obtener el s鉚mbolo asociado a un determinado c貿(mào)digo.</p><p>Para obtener el c貿(mào)digo asociado a un s鉚mbolo se debe proceder del siguiente modo:</p><ol><li>Comenzar con un c貿(mào)digo vac鉚o</li><li>Iniciar el recorrido del 謾rbol en la hoja asociada al s鉚mbolo</li><li>Comenzar un recorrido del 謾rbol hacia arriba</li><li>Cada vez que se suba un nivel, a帽adir al c貿(mào)digo la etiqueta de la rama que se ha recorrido</li><li>Tras llegar a la ra鉚z, invertir el c貿(mào)digo</li><li>El resultado es el c貿(mào)digo Huffman deseado</li></ol><p>Para obtener un s鉚mbolo a partir de un c貿(mào)digo se debe hacer as鉚:</p><ol><li>Comenzar el recorrido del 謾rbol en la ra鉚z de 茅ste</li><li>Extraer el primer s鉚mbolo del c貿(mào)digo a descodificar</li><li>Descender por la rama etiquetada con ese s鉚mbolo</li><li>Volver al paso 2 hasta que se llegue a una hoja, que ser謾 el s鉚mbolo asociado al c貿(mào)digo</li></ol><p>En la pr謾ctica, casi siempre se utiliza el 謾rbol para obtener todos los c貿(mào)digos de una sola vez; luego se guardan en tablas y se descarta el 謾rbol.</p><p><a name="Ejemplo_de_uso" id="Ejemplo_de_uso"></a></p><h3><span class="editsection">[<a href="/w/index.php?title=Algoritmo_de_Huffman&action=edit&section=2" title="Editar secci貿(mào)n: Ejemplo de uso">editar</a>]</span> <span class="mw-headline">Ejemplo de uso</span></h3><p>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.</p><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Imagen:ArbolCodigoHuffman.png" class="image" title="脕rbol para construir el c貿(mào)digo Huffman del ejemplo"><img alt="脕rbol para construir el c貿(mào)digo Huffman del ejemplo" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/ArbolCodigoHuffman.png/180px-ArbolCodigoHuffman.png" width="180" height="157" border="0" class="thumbimage" /></a><div class="thumbcaption"><div class="magnify"><a href="/wiki/Imagen:ArbolCodigoHuffman.png" class="internal" title="Aumentar"><img src="/skins-1.5/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>脕rbol para construir el c貿(mào)digo Huffman del ejemplo</div></div></div><table class="prettytable"><tr><th>S鉚mbolo</th><th>Frecuencia</th></tr><tr><td>A</td><td>0,15</td></tr><tr><td>B</td><td>0,30</td></tr><tr><td>C</td><td>0,20</td></tr><tr><td>D</td><td>0,05</td></tr><tr><td>E</td><td>0,15</td></tr><tr><td>F</td><td>0,05</td></tr><tr><td>G</td><td>0,10</td></tr></table><p>Se puede ver con facilidad cu謾l es el c貿(mào)digo del s鉚mbolo <b>E</b>: subiendo por el 謾rbol se recorren ramas etiquetadas con <b>1</b>, <b>1</b> y <b>0</b>; por lo tanto, el c貿(mào)digo es <b>011</b>. Para obtener el c貿(mào)digo de <b>D</b> se recorren las ramas <b>0</b>, <b>1</b>, <b>1</b> y <b>1</b>, por lo que el c貿(mào)digo es <b>1110</b>.</p><p>La operaci貿(mào)n inversa tambi茅n es f謾cil de realizar: dado el c貿(mào)digo <b>10</b> se recorren desde la ra鉚z las ramas <b>1</b> y <b>0</b>, obteni茅ndose el s鉚mbolo <b>C</b>. Para descodificar <b>010</b> se recorren las ramas <b>0</b>, <b>1</b> y <b>0</b>, obteni茅ndose el s鉚mbolo <b>A</b>.</p><div class="visualClear"></div><p><a name="Limitaciones" id="Limitaciones"></a></p><h2><span class="editsection">[<a href="/w/index.php?title=Algoritmo_de_Huffman&action=edit&section=3" title="Editar secci貿(mào)n: Limitaciones">editar</a>]</span> <span class="mw-headline">Limitaciones</span></h2><p>Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de aparici貿(mào)n de cada s鉚mbolo, y su eficiencia depende de lo pr貿(mào)ximas a las frecuencias reales que sean las estimadas. Algunas implementaciones del algoritmo de Huffman son <a href="/wiki/Algoritmos_Adaptativos" title="Algoritmos Adaptativos" class="mw-redirect">adaptativas</a>, actualizando las frecuencias de cada s鉚mbolo conforme recorre el texto.</p><p>La eficiencia de la codificaci貿(mào)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.</p><p><b>Ejemplos:</b></p><ul><li>La <a href="/wiki/Sistema_binario" title="Sistema binario">codificaci貿(mào)n binaria</a> es un caso particular de la codificaci貿(mào)n de Huffman que ocurre cuando todos los s鉚mbolos del alfabeto tienen la misma frecuencia. Se tiene pues que la codificaci貿(mào)n binaria es la m謾s eficiente para cualquier n煤mero de s鉚mbolos equiprobables.</li><li>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貿(mào)n de dichos s鉚mbolos. En este caso nunca se realiza compresi貿(mào)n de los datos, mientras que otros algoritmos s鉚 podr鉚an conseguirlo.</li></ul><p>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</p><pre> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB</pre><p>El algoritmo de Huffman aplicado 煤nicamente a los s鉚mbolos devuelve el c貿(mào)digo:</p><pre> 1111111111111111111111111111111111111111111111111111111111111110</pre><p>Tambi茅n de longitud 64. Sin embargo, si antes de utilizar el algoritmo, se agrupan los s鉚mbolos en las palabras <b>"AA"</b>, <b>"AB"</b> y <b>"B"</b> (que se codifican como 1, 01 y 00), el algoritmo devuelve la siguiente cadena:</p><pre> 111111111111111111111111111111101</pre><p>que tiene longitud 32, 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.</p><p><a name="Variaciones_del_algoritmo" id="Variaciones_del_algoritmo"></a></p><h2><span class="editsection">[<a href="/w/index.php?title=Algoritmo_de_Huffman&action=edit&section=4" title="Editar secci貿(mào)n: Variaciones del algoritmo">editar</a>]</span> <span class="mw-headline">Variaciones del algoritmo</span></h2><p><a name="C.C3.B3digos_Huffman_n-arios" id="C.C3.B3digos_Huffman_n-arios"></a></p><h3><span class="editsection">[<a href="/w/index.php?title=Algoritmo_de_Huffman&action=edit&section=5" title="Editar secci貿(mào)n: C貿(mào)digos Huffman n-arios">editar</a>]</span> <span class="mw-headline">C貿(mào)digos Huffman <i>n</i>-arios</span></h3><p>Es posible crear c貿(mào)digos de Huffman ternarios, cuaternarios, y, en general, <i>n</i>-arios. Para ello s貿(mào)lo es necesario realizar dos modificaciones al algoritmo:</p><ol><li>Los 謾rboles a crear tendr謾n tantos hijos como s鉚mbolos posibles puedan aparecer en los c貿(mào)digos Huffman. Por ejemplo, si es ternario se crear謾n 謾rboles con tres hijos; si es cuaternario, con cuatro.</li><li>Si se expresa como <i>s</i> el n煤mero de s鉚mbolos en el alfabeto a codificar, y <i>n</i> el n煤mero de s鉚mbolos que aparecen en el c貿(mào)digo Huffman, entonces <i>s</i>-1 debe ser m煤ltiplo de <i>n</i>-1. Es decir, para un c貿(mào)digo ternario, <i>s</i> debe valer 3, 5, 7, etc. Si esta condici貿(mào)n no se cumple, entonces se deben a帽adir s鉚mbolos "nulos" con frecuencia 0, que servir謾n s貿(mào)lo como relleno a la hora de construir el 謾rbol.</li></ol><p><a name="V.C3.A9ase_tambi.C3.A9n" id="V.C3.A9ase_tambi.C3.A9n"></a></p><h2><span class="editsection">[<a href="/w/index.php?title=Algoritmo_de_Huffman&action=edit&section=6" title="Editar secci貿(mào)n: V茅ase tambi茅n">editar</a>]</span> <span class="mw-headline">V茅ase tambi茅n</span></h2><ul><li><a href="/wiki/Codificaci%C3%B3n_Huffman" title="Codificaci貿(mào)n Huffman">Codificaci貿(mào)n Huffman</a></li><li><a href="http://mmengineer.blogspot.com/2007/11/algoritmo-de-compresion-huffman-php.html" class="external text" title="http://mmengineer.blogspot.com/2007/11/algoritmo-de-compresion-huffman-php.html" rel="nofollow">Huffman en PHP.</a></li></ul><p><a name="Referencias" id="Referencias"></a></p><h2><span class="editsection">[<a href="/w/index.php?title=Algoritmo_de_Huffman&action=edit&section=7" title="Editar secci貿(mào)n: Referencias">editar</a>]</span> <span class="mw-headline">Referencias</span></h2><div class="listaref references-small"><ol class="references"><li id="cite_note-0"><a href="#cite_ref-0" title="">鈫
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -