fórmula de cayley

50
Fórmula de Cayley De Wikipedia, la enciclopedia libre Saltar a: navegación , búsqueda Lista completa de todos los árboles con 2,3 y 4 vértices etiquetados: árboles con 2 vértices, árboles con 3 vértices y árboles con 4 vértices. En teoría de grafos , la fórmula de Cayley es un resultado llamado así en honor a Arthur Cayley , que establece que para cualquier entero positivo n, el número de árboles en n vértices etiquetados es . Equivalentemente, la fórmula cuenta el número de árboles de expansión de un grafo completo con vértices etiquetados. [editar ] Demostración Se conocen muchas demostraciones para esta fórmula. Una demostración clásica utiliza el teorema de Kirchhoff . Las secuencias de Prüfer otorgan una demostración biyectiva de la fórmula de Cayley. Otra demostración biyectiva, de André Joyal , encuentra una demostración uno-a-uno entre árboles de n vértices con dos nodos distinguibles y [pseudobosque]]s dirigidos. [editar ] Historia

Upload: jovanina-iveth-rivera-morales

Post on 30-Jul-2015

393 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Fórmula de Cayley

Fórmula de CayleyDe Wikipedia, la enciclopedia libreSaltar a: navegación, búsqueda

Lista completa de todos los árboles con 2,3 y 4 vértices etiquetados: árboles

con 2 vértices, árboles con 3 vértices y árboles con 4 vértices.

En teoría de grafos, la fórmula de Cayley es un resultado llamado así en honor a Arthur Cayley, que establece que para cualquier entero positivo n, el número de árboles en n vértices etiquetados es .

Equivalentemente, la fórmula cuenta el número de árboles de expansión de un grafo completo con vértices etiquetados.

[editar] Demostración

Se conocen muchas demostraciones para esta fórmula. Una demostración clásica utiliza el teorema de Kirchhoff. Las secuencias de Prüfer otorgan una demostración biyectiva de la fórmula de Cayley. Otra demostración biyectiva, de André Joyal, encuentra una demostración uno-a-uno entre árboles de n vértices con dos nodos distinguibles y [pseudobosque]]s dirigidos.

[editar] Historia

La fórmula fue descubierta por Carl Wilhelm Borchardt en 1860, y demostrada a través de un determinante. En una pequeña nota de 1889, Cayley extendió la fórmula en muchas direcciones, tomando en cuenta el grado de los vértices. Aunque Cayley referenció el artículo original de Borchardt, es el nombre de "fórmula de Cayley" el que se convirtió en estándar dentro del campo.

Page 2: Fórmula de Cayley

Árbol de expansiónDe Wikipedia, la enciclopedia libreSaltar a: navegación, búsqueda

Un árbol de expansión (aristas azules gruesas) de un grafo de rejilla.

En el campo matemático de la teoría de grafos, un árbol de expansión T de un grafo conexo, no dirigido G es un árbol compuesto por todos los vértices y algunas (quizá todas) de las aristas de G. Informalmente, un árbol de expansión de G es una selección de aristas de G que forman un árbol que cubre todos los vértices. Esto es, cada vértice está en el árbol, pero no hay ciclos. Por otro lado, todos los puentes de G deben estar contenidos en T.

Un árbol de expansión o árbol recubridor de un grafo conexo G puede ser también definido como el mayor conjunto de aristas de G que no contiene ciclos, o como el mínimo conjunto de aristas que conecta todos los vértices.

En ciertos campos de la teoría de grafos es útil encontrar el mínimo árbol de expansión de un grafo ponderado. También se han abordado otros problemas de optimización relacionados con los árboles de expansión, como el máximo árbol de expansión, el máximo árbol que cubre al menos k vértices, el mínimo árbol de expansión con k aristas por vértice como máximo (árbol de expansión de mínimo grado, MDST por sus siglas en inglés), el árbol de expansión con el máximo número de hojas (estrechamente relacionado con el problema del menos conjunto dominante y conexo), el árbol de expansión con el menor número de hojas (relacionado con el problema del camino hamiltoniano), el árbol de expansión de mínimo diámetro o el árbol de expansión de la mínima dilación.

Contenido

[ocultar]

1 Ciclos fundamentales y cortes fundamentales

Page 3: Fórmula de Cayley

2 Bosques de expansión 3 Conteo de árboles de expansión 4 Árboles de expansión uniforme 5 Algoritmos

[editar] Ciclos fundamentales y cortes fundamentales

Si se añade una sola arista a un árbol de expansión, se crea un ciclo: los ciclos de ese tipo se denominan ciclos fundamentales. Hay un ciclo fundamental distinto para cada arista; es decir, hay una correspondencia biyectiva (uno a uno) entre ciclos fundamentales y aristas ausentes del árbol de expansión. Para un grafo conexo con V vértices, cualquier árbol de expansión tiene V-1 aristas, y así, un grafo con E aristas tiene E-V+1 ciclos fundamentales. En cualquier árbol de expansión dado, esos ciclos forman una base del espacio de ciclos.

De manera dual a la noción de ciclo fundamental, existe el concepto de corte fundamental. Al eliminar una arista del árbol de expansión, los vértices se dividen en dos conjuntos disjuntos (desconectados). El corte fundamental se define como el conjunto de aristas que deben ser eliminados de un grafo G para llegar a la misma división. Por tanto, hay exactamente V-1 cortes fundamentales en un grafo, uno por cada arista del árbol de expansión.

La dualidad entre cortes y ciclos fundamentales se manifiesta al observar que las aristas de un ciclo que no pertenece al árbol de expansión sólo pueden aparecer en los cortes de otras aristas del ciclo, y viceversa: las aristas en un corte sólo pueden aparecer en aquellos ciclos no contenidos en la arista correspondiente al corte.

[editar] Bosques de expansión

Un bosque de expansión es un tipo de subgrafo que generaliza el concepto de árbol de expansión. Hay dos definiciones de uso común:

Según la primera, un bosque de expansión es un subgrafo que consiste en un árbol de expansión en cada componente conexo del grafo (equivalentemente, es un subgrafo libre de ciclos maximal). Esta definición es frecuente en informática y optimización, así como la que se emplea habitualmente al tratar los bosques mínimos de expansión, la generalización a subgrafos disconexos de árboles de expansión minimales.

Otra definición, empleada en teoría de grafos, es la de un bosque de expansión es un subgrafo que es a la vez bosque (es decir, no contiene ciclos) y de expansión (es decir, incluye a todos los vértices).

[editar] Conteo de árboles de expansión

Page 4: Fórmula de Cayley

El número t(G) de árboles de expansión de un grafo conexo es un invariante importante. En algunos casos, es fácil calcular t(G) directamente, y es un elemento de uso frecuente en estructuras de datos en distintos lenguajes de programación.

Trivialmente, si G es un árbol, entonces t(G)=1. Si G es un ciclo con n vértices, entonces t(G)=n.

Para un grafo genérico G, el número t(G) puede obtenerse a través del teorema de matriz-árbol de Kirchhoff.

La fórmula de Cayley es una fórmula para obtener el número de árboles de expansión en

un grafo completo con n vértices. La fórmula establece que . Otra prueba de la fórmula de Cayley es la existencia de exactamente árboles etiquetados con n vértices. La fórmula de Cayley puede ser demostrada mediante el teorema de matriz-árbol de Kirchhoff o mediante el código de Prüfer.

Si G es un grafo completo bipartido , entonces se cumple . Si G es el grafo hipercúbico n-dimensions , entonces se verifica que

. Estas fórmulas son también corolarios del teorema matriz-árbol.

Si G es un multigrafo y e es una arista de G, entonces el número t(G) satisface la recurrencia de supresión-contracción:

donde G-e es el multigrafo que se obtiene al eliminar la arista e, y G/e es la contracción de G sobre e, en la que las múltiples aristas de esta contracción no son eliminadas.

[editar] Árboles de expansión uniforme

Un árbol de expansión escogido aleatoriamente, con igual probabilidad, entre todos los árboles de expansión se denomina árbol de expansión uniforme (AEU). Este modelo ha sido ampliamente investigado en los ámbitos de la Probabilidad y la Física matemática.

[editar] Algoritmos

El algoritmo clásico para los árboles de expansión, Depth-First Search (DFS, búsqueda priorizando la profundidad en español), fue diseñado por Robert Tarjan. Otro algoritmo relevante está basado en la búsqueda priorizando la amplitud (Breadth-First Search, BFS).

Obtenido de «http://es.wikipedia.org/w/index.php?title=%C3%81rbol_de_expansi%C3%B3n&oldid=53626144»

Ver las calificaciones de la página

Page 5: Fórmula de Cayley

Evalúa este artículo¿Qué es esto?

Árbol binario de búsquedaDe Wikipedia, la enciclopedia libreSaltar a: navegación, búsqueda

Un árbol binario de búsqueda también llamados BST (acrónimo del inglés Binary Search Tree) es un tipo particular de árbol binario que presenta una estructura de datos en forma de árbol usada en informática.

Contenido

[ocultar]

1 Descripción 2 Operaciones

o 2.1 Búsqueda o 2.2 Inserción o 2.3 Borrado o 2.4 Otras Operaciones o 2.5 Recorridos

3 Tipos de árboles binarios de búsqueda 4 Comparación de rendimiento 5 Buscando el Árbol binario de búsqueda óptimo 6 Véase también 7 Referencias 8 Enlaces externos

[editar] Descripción

Un árbol binario de búsqueda (ABB) es un árbol binario definido de la siguiente forma:

Todo árbol vacío es un árbol binario de búsqueda.

Un árbol binario no vacío, de raíz R, es un árbol binario de búsqueda si:• En caso de tener subárbol izquierdo, la raíz R debe ser mayor que el valor máximo almacenado en el subárbol izquierdo, y que el subárbol izquierdo sea un árbol binario de búsqueda.

Page 6: Fórmula de Cayley

• En caso de tener subárbol derecho, la raíz R debe ser menor que el valor mínimo almacenado en el subárbol derecho, y que el subárbol derecho sea un árbol binario de búsqueda.

Un árbol binario de búsqueda de tamaño 9 y profundidad 3, con raíz 8 y hojas 1, 4, 7 y 13

Para una fácil comprensión queda resumido en que es un árbol binario que cumple que el subárbol izquierdo de cualquier nodo (si no está vacío) contiene valores menores que el que contiene dicho nodo, y el subárbol derecho (si no está vacío) contiene valores mayores.

Para estas definiciones se considera que hay una relación de orden establecida entre los elementos de los nodos. Que cierta relación esté definida, o no, depende de cada lenguaje de programación. De aquí se deduce que puede haber distintos árboles binarios de búsqueda para un mismo conjunto de elementos.

La altura h en el peor de los casos siempre el mismo tamaño que el número de elementos disponibles. Y en el mejor de los casos viene dada por la expresión

, donde ceil indica redondeo por exceso.

El interés de los árboles binarios de búsqueda (ABB) radica en que su recorrido en inorden proporciona los elementos ordenados de forma ascendente y en que la búsqueda de algún elemento suele ser muy eficiente.

Dependiendo de las necesidades del usuario que trate con una estructura de este tipo se podrá permitir la igualdad estricta en alguno, en ninguno o en ambos de los subárboles que penden de la raíz. Permitir el uso de la igualdad provoca la aparición de valores dobles y hace la búsqueda más compleja.

Un árbol binario de búsqueda no deja de ser un caso particular de árbol binario, así usando la siguiente especificación de árbol binario en maude:

fmod ARBOL-BINARIO {X :: TRIV}is sorts ArbolBinNV{X} ArbolBin{X} . subsort ArbolBinNV{X} < ArbolBin{X} .

Page 7: Fórmula de Cayley

*** generadores op crear : -> ArbolBin{X} [ctor] . op arbolBin : X$Elt ArbolBin{X} ArbolBin{X} -> ArbolBinNV{X} [ctor] . endfm

podemos hacer la siguiente definición para un árbol binario de búsqueda (también en maude):

fmod ARBOL-BINARIO-BUSQUEDA {X :: ORDEN} is protecting ARBOL-BINARIO{VOrden}{X} . sorts ABB{X} ABBNV{X} . subsort ABBNV{X} < ABB{X} . subsort ABB{X} < ArbolBin{VOrden}{X} . subsort ABBNV{X} < ArbolBinNV{VOrden}{X} . *** generadores op crear : -> ArbolBin{X} [ctor] . op arbolBin : X$Elt ArbolBin{X} ArbolBin{X} -> ArbolBinNV{X} [ctor] . endfm

con la siguiente teoría de orden:

fth ORDEN is protecting BOOL . sort Elt . *** operaciones op _<_ : Elt Elt -> Bool . endfth

para que un árbol binario pertenezca al tipo árbol binario de búsqueda debe cumplir la condición de ordenación siguiente que iría junto al módulo ARBOL-BINARIO-BUSQUEDA:

var R : X$Elt . vars INV DNV : ABBNV{X} . vars I D : ABB{X} . mb crear : ABB{X} . mb arbolBin(R, crear, crear) : ABBNV{X} . cmb arbolBin(R, INV, crear) : ABBNV{X} if R > max(INV) . cmb arbolBin(R, crear, DNV) : ABBNV{X} if R < min(DNV) . cmb arbolBin(R, INV, DNV) : ABBNV{X} if (R > max(INV)) and (R < min(DNV)) . ops min max : ABBNV{X} -> X$Elt . eq min(arbolBin(R, crear, D)) = R . eq min(arbolBin(R, INV, D)) = min(INV) . eq max(arbolBin(R, I, crear)) = R . eq max(arbolBin(R, I, DNV)) = max(DNV) .

[editar] Operaciones

Todas las operaciones realizadas sobre árboles binarios de búsqueda están basadas en la comparación de los elementos o clave de los mismos, por lo que es necesaria una subrutina, que puede estar predefinida en el lenguaje de programación, que los compare y pueda establecer una relación de orden entre ellos, es decir, que dados dos elementos sea capaz de reconocer cual es mayor y cual menor. Se habla de clave de un elemento

Page 8: Fórmula de Cayley

porque en la mayoría de los casos el contenido de los nodos será otro tipo de estructura y es necesario que la comparación se haga sobre algún campo al que se denomina clave.

[editar] Búsqueda

La búsqueda consiste acceder a la raíz del árbol, si el elemento a localizar coincide con éste la búsqueda ha concluido con éxito, si el elemento es menor se busca en el subárbol izquierdo y si es mayor en el derecho. Si se alcanza un nodo hoja y el elemento no ha sido encontrado se supone que no existe en el árbol. Cabe destacar que la búsqueda en este tipo de árboles es muy eficiente, representa una función logarítmica. El maximo número de comparaciones que necesitaríamos para saber si un elemento se encuentra en un árbol binario de búsqueda estaría entre [log2(N+1)] y N, siendo N el número de nodos. La búsqueda de un elemento en un ABB (Árbol Binario de Búsqueda) se puede realizar de dos formas, iterativa o recursiva.

Ejemplo de versión iterativa en el lenguaje de programación C, suponiendo que estamos buscando una clave alojada en un nodo donde está el correspondiente "dato" que precisamos encontrar:

data Buscar_ABB(abb t,clave k) { abb p; dato e; e=NULL; p=t; if (!estaVacio(p)) { while (!estaVacio(p) && (p->k!=k) ) { if (k < p->k) { p=p->l; } if (p->k < k) { p=p->r; } } if (!estaVacio(p) &&(p->d!=NULL) ) { e=copiaDato(p->d); } } return e;}

Véase ahora la versión recursiva en ese mismo lenguaje:

int buscar(tArbol *a, int elem){ if (a == NULL) return 0; else if (a->clave < elem) return buscar(a->hDerecho, elem); else if (a->clave > elem) return buscar(a->hIzquierdo, elem);

Page 9: Fórmula de Cayley

else return 1;}

Otro ejemplo en Python:

def search_binary_tree(node, key): if node is None: return None # not found if key < node.key: return search_binary_tree(node.left, key) else if key > node.key: return search_binary_tree(node.right, key) else: return node.value

En Pascal:

Function busqueda(T:ABR, y: integer):ABRbegin if (T=nil) or (^T.raiz=y) then busqueda:=T; else if (^T.raiz<y) then busqueda:=busqueda(^T.dch,y); else busqueda:=busqueda(^T.izq,y);end;

Una especificación en maude para la operación de búsqueda quedaría de la siguiente forma:

op esta? : X$Elt ABB{X} -> Bool . var R R1 R2 : X$Elt . vars I D : ABB{X} . eq esta?(R, crear) = false . eq esta?(R1, arbolBin(R2, I, D)) = if R1 == R2 then true else if R1 < R2 then esta?(R1, I) else esta?(R1, D) fi fi .

[editar] Inserción

La inserción es similar a la búsqueda y se puede dar una solución tanto iterativa como recursiva. Si tenemos inicialmente como parámetro un árbol vacío se crea un nuevo nodo como único contenido el elemento a insertar. Si no lo está, se comprueba si el elemento dado es menor que la raíz del árbol inicial con lo que se inserta en el subárbol izquierdo y si es mayor se inserta en el subárbol derecho. De esta forma las inserciones se hacen en las hojas.

Page 10: Fórmula de Cayley

Evolución de la inserción del elemento "5" en un ABB.

Como en el caso de la búsqueda puede haber varias variantes a la hora de implementar la inserción en el TAD (Tipo Abstracto de Datos), y es la decisión a tomar cuando el elemento (o clave del elemento) a insertar ya se encuentra en el árbol, puede que éste sea modificado o que sea ignorada la inserción. Es obvio que esta operación modifica el ABB perdiendo la versión anterior del mismo.

A continuación se muestran las dos versiones del algoritmo en pseudolenguaje, iterativa y recursiva, respectivamente.

PROC InsertarABB(árbol:TABB; dato:TElemento)VARIABLES nuevonodo,pav,pret:TABB clavenueva:Tclave ele:TElementoINICIO nuevonodo <- NUEVO(TNodoABB) nuevonodo^.izq <- NULO nuevonodo^.der <- NULO nuevonodo^.elem <- dato SI ABBVacío (árbol) ENTONCES árbol <- nuevonodo ENOTROCASO clavenueva <- dato.clave pav <- árbol // Puntero Avanzado pret <- NULO // Puntero Retrasado MIENTRAS (pav <- NULO) HACER pret <- pav ele = pav^.elem SI (clavenueva < ele.clave ) ENTONCES pav <- pav^.izq EN OTRO CASO pav <- pav^.dch FINSI FINMIENTRAS ele = pret^.elem SI (clavenueva < ele.clave ) ENTONCES pret^.izq <- nuevonodo EN OTRO CASO pret^.dch <- nuevonodo FINSI FINSI

Page 11: Fórmula de Cayley

FINPROC InsertarABB(árbol:TABB; dato:TElemento)VARIABLES ele:TElementoINICIO SI (ABBVacío(árbol)) ENTONCES árbol <- NUEVO(TNodoABB) árbol^.izq <- NULO árbol^.der <- NULO árbol^.elem <- dato EN OTRO CASO ele = InfoABB(árbol) SI (dato.clave < ele.clave) ENTONCES InsertarABB(árbol^.izq, dato) EN OTRO CASO InsertarABB(árbol^.dch, dato) FINSI FINSIFIN

Se ha podido apreciar la simplicidad que ofrece la versión recursiva, este algoritmo es la traducción en C. El árbol es pasado por referencia para que los nuevos enlaces a los subárboles mantengan la coherencia.

void insertar(tArbol **a, int elem){ if (*a == NULL) { *a = (tArbol *) malloc(sizeof(tArbol)); (*a)->clave = elem; (*a)->hIzquierdo = NULL; (*a)->hDerecho = NULL; } else if ((*a)->clave < elem) insertar(&(*a)->hDerecho, elem); else if ((*a)->clave > elem) insertar(&(*a)->hIzquierdo, elem);}

Ejemplo en Python:

def binary_tree_insert(node, key, value): if node is None: return TreeNode(None, key, value, None) if key == node.key: return TreeNode(node.left, key, value, node.right) if key < node.key: return TreeNode(binary_tree_insert(node.left, key, value), node.key, node.value, node.right) else: return TreeNode(node.left, node.key, node.value, binary_tree_insert(node.right, key, value))

Otro ejemplo en Pascal:

Procedure Insercion(var T:ABR, y:integer)var ultimo:ABR; actual:ABR;

Page 12: Fórmula de Cayley

nuevo:ABR;begin ultimo:=nil; actual:=T; while (actual<>nil) do begin ultimo:=actual; if (^actual.raiz<y) then actual:=^actual.dch; else actual:=^actual.izq; end; new(nuevo); ^nuevo.raiz:=y; ^nuevo.izq:=nil; ^nuevo.dch:=nil; if ultimo=nil then T:=nuevo; else if ^ultimo.raiz<y then ^ultimo.dch:=nuovo; else ^ultimo.izq:=nuevo;end;

Véase también un ejemplo de algoritmo recursivo de inserción en un ABB en el lenguaje de programación Maude:

op insertar : X$Elt ABB{X} -> ABBNV{X} . var R R1 R2 : X$Elt . vars I D : ABB{X} . eq insertar(R, crear) = arbolBin(R, crear, crear) . eq insertar(R1, arbolBin(R2, I, D)) = if R1 < R2 then arbolBin(R2, insertar(R1, I), D) else arbolBin(R2, I, insertar(R1, D)) fi .

La operación de inserción requiere, en el peor de los casos, un tiempo proporcional a la altura del árbol.

[editar] Borrado

La operación de borrado no es tan sencilla como las de búsqueda e inserción. Existen varios casos a tener en consideración:

Borrar un nodo sin hijos ó nodo hoja: simplemente se borra y se establece a nulo el apuntador de su padre.

Page 13: Fórmula de Cayley

Nodo a eliminar 74

Borrar un nodo con un subárbol hijo: se borra el nodo y se asigna su subárbol hijo como subárbol de su padre.

Nodo a eliminar 70

Borrar un nodo con dos subárboles hijo: la solución está en reemplazar el valor del nodo por el de su predecesor o por el de su sucesor en inorden y posteriormente borrar este nodo. Su predecesor en inorden será el nodo más a la derecha de su subárbol izquierdo (mayor nodo del subarbol izquierdo), y su sucesor el nodo más a la izquierda de su subárbol derecho (menor nodo del subarbol derecho). En la siguiente figura se muestra cómo existe la posibilidad de realizar cualquiera de ambos reemplazos:

Nodo a eliminar 59

El siguiente algoritmo en C realiza el borrado en un ABB. El procedimiento reemplazar busca la mayor clave del subárbol izquierdo y la asigna al nodo a eliminar.

void reemplazar(tArbol **a, tArbol **aux); /*Prototipo de la funcion ''reemplazar''*/void borrar(tArbol **a, int elem){ tArbol *aux; if (*a == NULL) return; if ((*a)->clave < elem)

Page 14: Fórmula de Cayley

borrar(&(*a)->hDerecho, elem); else if ((*a)->clave > elem) borrar(&(*a)->hIzquierdo, elem); else if ((*a)->clave == elem) { aux = *a; if ((*a)->hIzquierdo == NULL) *a = (*a)->hDerecho; else if ((*a)->hDerecho == NULL) *a = (*a)->hIzquierdo; else reemplazar(&(*a)->hIzquierdo, &aux); free(aux); }} void reemplazar(tArbol **a, tArbol **aux){ if ((*a)->hDerecho == NULL) { (*aux)->clave = (*a)->clave; *aux = *a; *a = (*a)->hIzquierdo; } else reemplazar(&(*a)->hDerecho, aux);}

Otro ejemplo en Pascal.

Procedure Borrar(var T:ABR, x:ABR)var aBorrar:ABR; anterior:ABR; actual:ABR; hijo:ABR;begin if (^x.izq=nil) or (^x.dch=nil) then aBorrar:=x; else aBorrar:=sucesor(T,x); actual:=T; anterior:=nil; while (actual<>aBorrar) do begin anterior:=actual; if (^actual.raiz<^aBorrar.raiz) then actual:=^actual.dch; else actual:=^actual.izq; end; if (^actual.izq=nil) then hijo:=^actual.dch; else hijo:=^actual.izq; if (anterior=nil) then T:=hijo; else if (^anterior.raiz<^actual.raiz) then ^anterior.dch:=hijo;

Page 15: Fórmula de Cayley

else ^anterior.izq:=hijo; if (aBorrar<>x) then ^x.raiz:=^aBorrar.raiz; free(aBorrar);end;

Véase también un ejemplo de algoritmo recursivo de borrado en un ABB en el lenguaje de programación Maude, considerando los generadores crear y arbolBin. Esta especificación hace uso de la componente clave a partir de la cual se ordena el árbol.

op eliminar : X$Elt ABB{X} -> ABB{X} . varS R M : X$Elt . vars I D : ABB{X} . vars INV DNV : ABBNV{X} . ops max min : ArbolBin{X} -> X$Elt . eq min(arbolBin(R, crear, D)) = R . eq max(arbolBin(R, I, crear)) = R . eq min(arbolBin(R, INV, D)) = min(INV) . eq max(arbolBin(R, I, DNV )) = max(DNV) . eq eliminar(M, crear) = crear . ceq eliminar(M, arbolBin(R, crear, D)) = D if M == clave(R) . ceq eliminar(M, arbolBin(R, I, crear)) = I if M == clave(R) . ceq eliminar(M, arbolBin(R, INV, DNV)) = arbolBin(max(INV), eliminar(clave(max(INV)), INV), DNV) if M == clave(R) . ceq eliminar(M, arbolBin(R, I, D)) = arbolBin(R, eliminar(M, I), D) if M < clave(R) . ceq eliminar(M, arbolBin(R, I, D)) = arbolBin(R, I, eliminar(M, D)) if clave(R) < M .

[editar] Otras Operaciones

Otra operación sería por ejemplo comprobar que un árbol binario es un árbol binario de búsqueda. Su implementación en maude es la siguiente:

op esABB? : ABB{X} -> Bool . var R : X$Elt . vars I D : ABB{X} . eq esABB?(crear) = true . eq esABB?(arbolbBin(R, I, D)) = (Max(I) < R) and (Min(D) > R) and (esABB?(I)) and (esABB?(D)) .

[editar] Recorridos

Se puede hacer un recorrido de un árbol en profundidad o en anchura.

Los recorridos en anchura son por niveles, se realiza horizontalmente desde la raíz a todos los hijos antes de pasar a la descendencia de alguno de los hijos.

El recorrido en profundidad lleva al camino desde la raíz hacia el descendiente más lejano del primer hijo y luego continúa con el siguiente hijo. Como recorridos en profundidad tenemos inorden, preorden y postorden.

Page 16: Fórmula de Cayley

Una propiedad de los ABB es que al hacer un recorrido en profundidad inorden obtenemos los elementos ordenados de forma ascendente.

Ejemplo árbol binario de búsqueda

Resultado de hacer el recorrido en:

Inorden = [6, 9, 13, 14, 15, 17, 20, 26, 64, 72].

Preorden = [15, 9, 6, 14, 13, 20, 17, 64, 26, 72].

Postorden =[6, 13, 14, 9, 17, 26, 72, 64, 20, 15].

Recorridos en Visual Basic .Net

'funcion de recorrido en PREORDEN Public Function preorden() As String cadenasalida = "" rePreorden(raiz) Return cadenasalida End Function Private Sub rePreorden(ByVal padre As Nodo) If IsNothing(padre) Then Return End If cadenasalida = cadenasalida & "-" & padre.dato rePreorden(padre.ant) rePreorden(padre.sig) End Sub 'funcion de recorrido en POSTORDEN Public Function postorden() As String cadenasalida = "" reposorden(raiz) Return cadenasalida End Function Private Sub repostorden(ByVal padre As Nodo) If IsNothing(padre) Then Return End If repostorden(padre.ant) repostorden(padre.sig) cadenasalida = cadenasalida & "-" & padre.dato End Sub 'funcion de recorrido en INORDEN

Page 17: Fórmula de Cayley

Public Function inorden() As String cadenasalida = "" reinorden(raiz) Return cadenasalida End Function Private Sub reinorden(ByVal padre As Nodo) If IsNothing(padre) Then Return End If reinorden(padre.ant) cadenasalida = cadenasalida & "-" & padre.dato reinorden(padre.sig) End Sub

Recorridos en C con funciones recursivas

struct Nodo{ char nombre[30]; struct Nodo *izq; struct Nodo *der;}; typedef struct Nodo Nodo;typedef Nodo *Arbol; void preOrden(Arbol abb){ if(abb) { printf("%s\n", abb->nombre); preOrden(abb->izq); preOrden(abb->der); }} void postOrden(Arbol abb){ if(abb) { postOrden(abb->izq); postOrden(abb->der); printf("%s\n", abb->nombre); }} void inOrden(Arbol abb){ if(abb) { inOrden(abb->izq); printf("%s\n", abb->nombre); inOrden(abb->der); }}

[editar] Tipos de árboles binarios de búsqueda

Page 18: Fórmula de Cayley

Hay varios tipos de árboles binarios de búsqueda. Los árboles AVL, árbol rojo-negro, son árboles autobalanceables . Los árbol biselado son árboles también autobalanceables con la propiedad de que los elementos accedidos recientemente se accederá más rápido en posteriores accesos. En el montículo como en todos los árboles binarios de búsqueda cada nodo padre tiene un valor mayor q sus hijos y además es completo, esto es cuando todos los niveles están llenos con excepción del último que puede no estarlo.

Hay muchos tipos de árboles binarios de búsqueda. Los árboles AVL y los árbol rojo-negro son ambos formas de árboles binarios de búsqueda autobalanceables. Un árbol biselado es un árbol binario de búsqueda que automáticamente mueve los elementos a los que se accede frecuentemente cerca de la raíz. En los montículos, cada nodo también mantiene una prioridad y un nodo padre tiene mayor prioridad que su hijo.

Otras dos maneras de configurar un árbol binario de búsqueda podría ser como un árbol completo o degenerado.

Un árbol completo es un árbol con "n" niveles, donde cada nivel d <= n-1; el número de nodos existentes en el nivel "d" es igual que 2d. Esto significa que todos los posibles nodos existen en esos niveles, no hay ningún hueco. Un requirimiento adicional para un árbol binario completo es que para el nivel "n", los nodos deben estar ocupados de izquierda a derecha, no pudiendo haber un hueco a la izquierda de un nodo ocupado.

Un árbol degenerativo es un árbol que, para cada nodo padre, sólo hay asociado un nodo hijo. Por lo que se comporta como una lista enlazada.

[editar] Comparación de rendimiento

D. A. Heger(2004)1 realiza una comparación entre los diferentes tipos de árboles binarios de búsqueda para encontrar que tipo nos daría el mejor rendimiento para cada caso. Los montículos se encuentran como el tipo de árbol binario de búsqueda que mejor resultado promedio da, mientras que los árboles rojo-negro los que menor rendimiento medio nos aporta.

[editar] Buscando el Árbol binario de búsqueda óptimo

Si nosotros no tenemos en mente planificar un árbol binario de búsqueda, y sabemos exactamente como de frecuente serán visitados cada elemento podemos construir un árbol binario de búsqueda óptimo con lo que conseguiremos que la media de gasto generado a la hora de buscar un elemento sea minimizado.

Asumiendo que conocemos los elementos y en qué nivel está cada uno, también conocemos la proporción de futuras búsquedas que se harán para encontrar dicho elemento. Si es así, podemos usar una solución basada en la programación dinámica.

En cambio, a veces sólo tenemos la estimación de los costes de búsqueda, como pasa con los sistemas que nos muestra el tiempo que ha necesitado para realizar una búsqueda. Un ejemplo, si tenemos un ABB de palabras usado en un corrector ortográfico, deberíamos balancear el árbol basado en la frecuencia que tiene una palabra en el Corpus lingüístico, desplazando palabras como "de" cerca de la raíz y palabras

Page 19: Fórmula de Cayley

como "vesánico" cerca de las hojas. Un árbol como tal podría ser comparado con los árboles Huffman que tratan de encontrar elementos que son accedidos frecuentemente cerca de la raíz para producir una densa información; de todas maneras, los árboles Huffman sólo puede guardar elementos que contienen datos en las hojas y estos elementos no necesitan ser ordenados.

En cambio, si no sabemos la secuencia en la que los elementos del árbol van a ser accedidos, podemos usar árboles biselados que son tan buenos como cualquier árbol de búsqueda que podemos construir para cualquier secuencia en particular de operaciones de búsqueda.

Árboles alfabéticos son árboles Huffman con una restricción de orden adicional, o lo que es lo mismo, árboles de búsqueda con modificación tal que todos los elementos son almacenados en las hojas.

[editar] Véase también

Árbol (programación) Árbol Binario Árbol AVL Árbol 2-3 Árbol B Árbol Rojo-Negro Árbol Splay Árbol Multirrama

[editar] Referencias

1. ↑ Heger, Dominique A. (2004), «A Disquisition on The Performance Behavior of Binary Search Tree Data Structures», European Journal for the Informatics Professional 5 (5), http://www.upgrade-cepis.org/issues/2004/5/up5-5Mosaic.pdf

[editar] Enlaces externos

Árboles binarios de búsqueda en google Implementación de árboles binarios de búsqueda en distintos lenguajes Aplicación JAVA de árboles

Obtenido de «http://es.wikipedia.org/w/index.php?title=%C3%81rbol_binario_de_b%C3%BAsqueda&oldid=53962142»

Ver las calificaciones de la página

Evalúa este artículo¿Qué es esto?Confiable

Objetivo

Page 20: Fórmula de Cayley

Completo

Bien escrito

Estoy muy bien informado sobre este tema (opcional)

Enviar calificacionesGuardado correctamenteTu valoración aún no ha sido enviadaCategoría:

Árboles (estructura)

Herramientas personales

Iniciar sesión / crear cuenta

Espacios de nombres

Artículo Discusión

Variantes

Vistas

Leer Editar Ver historial

Acciones

Buscar

Navegación

Portada Portal de la comunidad Actualidad Cambios recientes Páginas nuevas Página aleatoria Ayuda Donaciones Notificar un error

Especial:Buscar

Page 21: Fórmula de Cayley

Imprimir/exportar

Crear un libro Descargar como PDF Versión para imprimir

Herramientas

Lo que enlaza aquí Cambios en enlazadas Subir archivo Páginas especiales Enlace permanente Citar este artículo Evalúa este artículo

En otros idiomas

العربية Català Česky Dansk Deutsch English فارسی Suomi Français עברית Bahasa Indonesia Italiano 日本語 한국어 Nederlands Polski Português Română Русский Slovenčina Svenska ไทย Українська Tiếng Việt 中文

Esta página fue modificada por última vez el 19 feb 2012, a las 20:07. El texto está disponible bajo la Licencia Creative Commons Atribución

Compartir Igual 3.0; podrían ser aplicables cláusulas adicionales. Lee los términos de uso para más información.Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.

Page 22: Fórmula de Cayley

Contacto

Política de privacidad Acerca de Wikipedia Limitación de responsabilidad Versión para móviles

Montículo binarioDe Wikipedia, la enciclopedia libreSaltar a: navegación, búsquedaPara otros usos de este término, véase Montículo (desambiguación).

Los Montículos binarios (binary heaps en inglés) son un caso particular y sencillo de la estructura de datos Montículo, y está basada en un árbol binario balanceado, que puede verse como un árbol binario con dos restricciones adicionales:

Propiedad de montículoCada nodo contiene un valor superior al de sus hijos (para un montículo por máximos) o más pequeño que el de sus hijos (para un montículo por mínimos).

Árbol semicompletoEl árbol está balanceado y en un mismo nivel las inserciones se realizan de izquierda a derecha.

Los montículos por máximos se utilizan frecuentemente para representar colas de prioridad. A continuación se muestran dos montículos uno por mínimos y otro por máximos que representan el mismo conjunto de valores.

1 11 / \ / \ 2 3 9 10 / \ / \ / \ / \ 4 5 6 7 5 6 7 8 / \ / \ / \ / \ 8 9 10 11 1 2 3 4

El orden de los nodos hermanos en un montículo no está especificado en la propiedad de montículo, de manera que los subárboles de un nodo son intercambiables.

Contenido

Page 23: Fórmula de Cayley

[ocultar]

1 Operaciones sobre montículos o 1.1 Inserción de un elemento

1.1.1 Ejemplo o 1.2 Eliminación del elemento máximo

2 Representación de montículos 3 Enlaces externos

[editar] Operaciones sobre montículos

[editar] Inserción de un elemento

La inserción de un elemento se realiza agregando el elemento en la posición que respeta la restricción de árbol semicompleto pero posiblemente invalidando la propiedad de montículo, para luego remontar hacia la raíz restaurando la propiedad de montículo por intercambio del valor de la posición desordenada por el valor de su padre. Esta reorganización se realiza en tiempo O(log n).

[editar] Ejemplo

En el siguiente montículo por máximos la posición donde se puede insertar está marcada con una letra X.

11 / \ 5 8 / \ /3 4 X

Para insertar el valor 15 en este montículo, se inserta el valor en la posición marcada con lo cual se invalida la propiedad de montículo dado que 15 es mayor que 8. Para restaurar la propiedad de montículo se intercambia primero el 15 con el 8, obteniéndose el siguiente árbol:

11 / \ 5 15 / \ /3 4 8

Sin embargo, la propiedad de montículo todavía no se cumple, dado que 15 es mayor que 11, de manera que hay que realizar un nuevo intercambio:

15 / \ 5 11 / \ /3 4 8

Page 24: Fórmula de Cayley

El resultado si es un montículo por máximos.

[editar] Eliminación del elemento máximo

Para borrar el elemento máximo del montículo, de la manera más eficiente se puede tomar el elemento de la posición que debe quedar vacía, colocándolo en la raíz (así cumpliendo la propiedad de árbol completo), y luego intercambiar ese valor con el máximo de sus hijos hasta satisfacer la propiedad de montículo (si es de máximos), o intercambiarlo con el mínimo de sus hijos (si es de mínimos). Esta reorganización se puede realizar también en tiempo O(log n). Partiendo del mismo montículo que antes:

11 / \ 5 8 / \ 3 4

Al eliminarse el 11, éste se remplaza por 4 (el valor del nodo que se debe eliminar):

4 / \ 5 8 / 3

En este árbol no se cumple la propiedad de montículo dado que 8 es mayor que 4. Al intercambiarse estos dos valores se obtiene un montículo:

8 / \ 5 4 / 3

[editar] Representación de montículos

Si bien se puede utilizar un árbol binario para representar un montículo, la condición de árbol completo permite representar fácilmente un montículo en un vector colocando los elementos por niveles y en cada nivel, los elementos de izquierda a derecha.

Un árbol binario completo guardado como arrreglo

Dado que el árbol es completo, no es necesario almacenar apuntadores en el árbol. Siempre se puede calcular la posición de los hijos o la del padre a partir de la posición de un nodo en el arreglo (contando las posiciones del arreglo a partir de cero):

Page 25: Fórmula de Cayley

El nodo raíz se almacena en la posición 0 del arreglo. Los hijos de un nodo almacenado en la posición k se almacenan en las

posiciones 2k+1 y 2k+2 respectivamente.

Se deduce que el padre de un nodo que está en la posición k (k>0) está almacenado en la posición ((k-1) div 2).

[editar] Enlaces externos

http://mathworld.wolfram.com/Heap.html http://www.policyalmanac.org/games/binaryHeaps.htm

Obtenido de «http://es.wikipedia.org/w/index.php?title=Mont%C3%ADculo_binario&oldid=40518495»

Ver las calificaciones de la página

Evalúa este artículo¿Qué es esto?Confiable

Objetivo

Completo

Bien escrito

Estoy muy bien informado sobre este tema (opcional)

Enviar calificacionesGuardado correctamenteTu valoración aún no ha sido enviadaCategoría:

Árboles (estructura)

Herramientas personales

Iniciar sesión / crear cuenta

Espacios de nombres

Artículo Discusión

Variantes

Page 26: Fórmula de Cayley

Vistas

Leer Editar Ver historial

Acciones

Buscar

Navegación

Portada Portal de la comunidad Actualidad Cambios recientes Páginas nuevas Página aleatoria Ayuda Donaciones Notificar un error

Imprimir/exportar

Crear un libro Descargar como PDF Versión para imprimir

Herramientas

Lo que enlaza aquí Cambios en enlazadas Subir archivo Páginas especiales Enlace permanente Citar este artículo Evalúa este artículo

En otros idiomas

Deutsch English Polski 中文

Esta página fue modificada por última vez el 25 sep 2010, a las 02:53. El texto está disponible bajo la Licencia Creative Commons Atribución

Compartir Igual 3.0; podrían ser aplicables cláusulas adicionales. Lee los términos de uso para más información.

Especial:Buscar

Page 27: Fórmula de Cayley

Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.

Contacto

Política de privacidad Acerca de Wikipedia Limitación de responsabilidad Versión para móviles

Codificación HuffmanDe Wikipedia, la enciclopedia libreSaltar a: navegación, búsqueda

Árbol de Huffman generado para las frecuencias de apariciones exactas del texto "Esto es un ejemplo de árbol de Huffman". las frecuencias y códigos de cada carácter se muestran abajo. Codificar esta frase usando este código requiere 156 bits, sin contar con el espacio para el árbol.

Carácter Frecuencia CódigoEspacio 8 00E 6 100N 3 1100O 3 1110U 2 0100A 2 0101D 2 1010F 2 1011L 2 0110M 2 0111S 2 11010B 1 110110

Page 28: Fórmula de Cayley

H 1 110111J 1 111100P 1 111101R 1 111110T 1 111111

En ciencias de la computación y teoría de la información, la codificación Huffman es un algoritmo usado para compresión de datos. El término se refiere al uso de una tabla de códigos de longitud variable para codificar un determinado símbolo (como puede ser un caracter en un archivo), donde la tabla ha sido rellenada de una manera específica basándose en la probabilidad estimada de aparición de cada posible valor de dicho símbolo. Fue desarrollado por David A. Huffman mientras era estudiante de doctorado en el MIT, y publicado en "A Method for the Construction of Minimum-Redundancy Codes".

La codificación Huffman usa un método específico para elegir la representación de cada símbolo, que da lugar a un código prefijo (es decir, la cadena de bits que representa a un símbolo en particular nunca es prefijo de la cadena de bits de un símbolo distinto) que representa los caracteres más comunes usando las cadenas de bits más cortas, y viceversa. Huffman fue capaz de diseñar el método de compresión más eficiente de este tipo: ninguna representación alternativa de un conjunto de símbolos de entrada produce una salida media más pequeña cuando las frecuencias de los símbolos coinciden con las usadas para crear el código. Posteriormente se encontró un método para llevar esto a cabo en un tiempo lineal si las probabilidades de los símbolos de entrada (también conocidas como "pesos") están ordenadas.

Para un grupo de símbolos con una distribución de probabilidad uniforme y un número de miembros que es potencia de dos, la codificación Huffman es equivalente a una codificación en bloque binaria, por ejemplo, la codificación ASCII. La codificación Huffman es un método para crear códigos prefijo tan extendido que el término "codificación Huffman" es ampliamente usado como sinónimo de "código prefijo", incluso cuando dicho código no se ha producido con el algoritmo de Huffman.

Aunque la codificación de Huffman es óptima para una codificación símbolo a símbolo dada una distribución de probabilidad, su optimalidad a veces puede verse accidentalmente exagerada. Por ejemplo, la codificación aritmética y la codificación LZW normalmente ofrecen mayor capacidad de compresión. Estos dos métodos pueden agrupar un número arbitrario de símbolos para una codificación más eficiente, y en general se adaptan a las estadísticas de entrada reales. Este último es útil cuando las probabilidades no se conocen de forma precisa o varían significativamente dentro del flujo de datos.

Contenido

[ocultar]

1 Historia 2 Definición del problema

o 2.1 Descripción informal

Page 29: Fórmula de Cayley

o 2.2 Descripción formal 2.2.1 Ejemplo

3 Técnica básica 4 Propiedades principales 5 Variaciones

o 5.1 Código Huffman n-ario o 5.2 Código Huffman adaptable o 5.3 Algoritmo de Huffman de plantilla o 5.4 Código de Huffman de tamaño limitado o 5.5 Codificación Huffman con costes desiguales o 5.6 Árboles binarios alfabéticos óptimos (codificación Hu-Tucker) o 5.7 Código canónico de Huffman

6 Aplicaciones 7 Ejemplo 8 Bibliografía 9 Véase también 10 Enlaces externos

[editar] Historia

En 1951, a David Huffman y sus compañeros de clase de la asignatura “Teoría de la Información” se les permitió optar entre la realización de un examen final o la presentación de un trabajo. El profesor Robert. M. Fano asignó las condiciones del trbajo alto las condiciones del trabajo bajo la premisa de encontrar el código binario más eficiente. Huffman, ante la imposibilidad de demostrar qué código era más eficiente, se rindió y empezó a estudiar para el examen final. Mientras estaba en este proceso vino a su mente la idea de usar árboles binarios de frecuencia ordenada y rápidamente probó que éste era el método más eficiente.

Con este estudio, Huffman superó a su profesor, quien había trabajado con el inventor de la teoría de la información Claude Shannon con el fin de desarrollar un código similar. Huffman solucionó la mayor parte de los errores en el algoritmo de codificación Shannon-Fano. La solución se basaba en el proceso de construir el árbol de abajo a arriba en vez de al contrario.

[editar] Definición del problema

[editar] Descripción informal

DadosUn conjunto de símbolos y sus pesos (normalmente proporcionales a probabilidades).

EncontrarUn código binario prefijo (un conjunto de elementos del código) con longitud de palabra esperada mínima (de forma equivalente, un árbol con longitud del camino mínima).

[editar] Descripción formal

Page 30: Fórmula de Cayley

Entradas

El alfabeto , que es el alfabeto de símbolos de tamaño .

El conjunto , que es el conjunto de pesos (positivos) de los símbolos (normalmente proporcionales a probabilidades), es decir

.

Salida

El código , que es el conjunto de elementos del código (binario), donde es la palabra del código para .

Objetivo

Sea la longitud del camino ponderado del código

. Condición: para cualquier código .

[editar] Ejemplo

Entrada (A, W)

Símbolo (ai) a b c d e SumaPeso (wi) 0.10 0.15 0.30 0.16 0.29 = 1

Salida C

Palabras del código (ci) 000 001 10 01 11

Longitud de la palabra (en bits)(li)

3 3 2 2 2

Longitud del camino ponderado

(li wi )0.30 0.45 0.60 0.32 0.58 L(C) = 2.25

Optimalidad

Probabilidad(2-l

i)1/8 1/8 1/4 1/4 1/4 = 1.00

Cantidad de información (en bits)

(−log2 wi) ≈3.32 2.74 1.74 2.64 1.79

Entropía(−wi log2 wi)

0.332 0.411 0.521 0.423 0.518H(A) = 2.205

Para cualquier código biunívoco, aquél código decodificable de forma única, la suma de las probabilidades de todos los símbolos es siempre menor o igual que uno. En este ejemplo, es exactamente igual a uno; por lo que decimos que es un código completo. Si no es el caso siempre se puede derivar un código equivalente añadiendo símbolos extra (con probabilidades nulas asociadas), para hacer el código completo a la vez que se mantiene biunívoco.

Tal como definió Shannon (1948), la cantidad de información h (en bits) de cada símbolo ai con probabilidad no nula es

Page 31: Fórmula de Cayley

La entropía H (en bits) es la suma ponderada, de todos los símbolos ai con probabilidad no nula wi, de la cantidad de información de cada símbolo:

(Nota: un símbolo con probabilidad cero tiene una contribución nula a la entropía.

Cuando w = 0, es una indeterminación; aplicando la regla de L'Hôpital :

.

Por simplicidad, los símbolos con probabilidad nula han sido dejados fuera de la fórmula anterior).

Como consecuencia del teorema de codificación de fuente de Shannon, la entropía es una medida de la longitud de palabra más pequeña del código que es teóricamente posible para un alfabeto dado con unos pesos asociados. En este ejemplo, la longitud media de la palabra es 2,25 bits por símbolo, ligeramente mayor que la entropía calculada de 2,205 bits por símbolo. Así que no sólo este código es óptimo en el sentido de que ningún otro código posible funciona mejor, sino que además está muy cercano al límite teórico establecido por Shannon.

Nótese que, en general, un código Huffman no necesita ser único, pero si lo es siempre

es uno de los códigos que minimiza .

[editar] Técnica básica

La técnica utilizada es el propio algoritmo de Huffman. Consiste en la creación de un árbol binario en el que se etiquetan los nodos hoja con los caracteres, junto a sus frecuencias, y de forma consecutiva se van uniendo cada pareja de nodos que menos frecuencia sumen, pasando a crear un nuevo nodo intermedio etiquetado con dicha suma. Se procede a realizar esta acción hasta que no quedan nodos hoja por unir a ningún nodo superior , y se ha formado el árbol binario.

Posteriormente se etiquetan las aristas que unen cada uno de los nodos con ceros y unos (hijo derecho e izquierdo, respectivamente, por ejemplo. El código resultante para cada carácter es la lectura, siguiendo la rama, desde la raíz hacia cada carácter (o viceversa) de cada una de las etiquetas de las aristas.

[editar] Propiedades principales

Page 32: Fórmula de Cayley

Las probabilidades usadas pueden ser genéricas para el dominio de la aplicación, que están basadas en el caso promedio, o pueden ser las frecuencias reales encontradas en el texto que se está comprimiendo. (Esta variación requiere que la tabla de frecuencias u otra estructura utilizada para la codificación deben ser almacenadas con el texto comprimido; las implementaciones emplean varios mecanismos para almacenar tablas de manera eficiente).

La codificación Huffman es óptima cuando la probabilidad de cada símbolo de entrada es una potencia negativa de dos. Los códigos prefijos tienden a ser ligeramente ineficientes en alfabetos pequeños, donde las probabilidades normalmente se encuentran entre esos puntos óptimos. El "empaquetado", o expansión del tamaño del alfabeto concatenando múltiples símbolos en "palabras" de tamaño fijo o variable antes de la codificación Huffman, normalmente ayuda, especialmente cuando símbolos adyacentes están correlacionados (como en el caso de un texto en lenguaje natural). El peor caso para una codificación Huffman puede darse cuando la probabilidad de un símbolo excede 2-1 = 0.5, haciendo el límite superior de ineficiencia ilimitado. Estas situaciones a menudo responden bien a una forma de paquete llamada codificación run-length.

La codificación aritmética produce una ligera ganancia sobre la codificación Huffman, pero en la práctica esta ganancia raramente ha sido lo bastante grande como para utilizar la codificación aritmética que posee una complejidad computacional más elevada y además requiere el pago de royalties. (A julio de 2006, IBM posee patentes de muchos métodos de codificación aritmética en varias jurisdicciones).

[editar] Variaciones

Existen muchas variaciones del código de Huffman, algunos que utilizan Huffman como algoritmo, y otros que encuentra el código prefijo óptimo. Tenga en cuenta que en este último caso el método no es necesariamente similar al de Huffmans y no tiene por qué terminar en tiempo polinómico.

[editar] Código Huffman n-ario

El algoritmo n-ario de Huffman usa el alfabeto {0,1,….,n-1} para codificar el mensaje y construir un árbol n-ario. Este enfoque fue considerado por Huffman en su enfoque originario.

[editar] Código Huffman adaptable

La variación llamada código de huffman adaptable calcula dinámicamente la probabilidad de la frecuencia de la cadena de origen basada en antiguas apariciones. Está relacionado con la familia de algoritmos LZ.

[editar] Algoritmo de Huffman de plantilla

La mayoría de las veces, el tamaño de las implementaciones del código de Huffman están representadas por probabilidades numéricas, pero el algoritmo no lo exige; se requiere solo una manera de ordenar el tamaño y añadirle. El algoritmo de plantilla de Huffman permite utilizar cualquier tipo de tamaño (costos, frecuencias, los pares del

Page 33: Fórmula de Cayley

tamaño, tamaños no numéricos) y uno de los muchos que combina métodos (no solo la adición). Tales algoritmos pueden resolver problemas de minimización, como la minimización de Max[ Wi + C (i)], un problema que se aplicó por primera vez en el diseño de circuitos.

[editar] Código de Huffman de tamaño limitado

El Código de Huffman de tamaño de limitado es una variante donde el objetivo es lograr que el camino de coste mínimo con la restricción de que la longitud de cada palabra sea menor que una constante. El algoritmo de package-merge lo soluciona con un algoritmo voraz, muy similar al usado por el algoritmo de Huffman. Su complejidad es del orden de O (nL), siendo L el tamaño de la palabra más larga. No se conoce algoritmo para resolver este problema en tiempo lineal, a diferencia de los problemas convencionales de Huffman.

[editar] Codificación Huffman con costes desiguales

En el problema estándar de la codificación Huffman, se asume que cada símbolo del alfabeto con el que se construye cada palabra del código tiene igual costo de transmisión: una palabra del código cuya longitud sea N dígitos siempre tendrá un costo de N, sin importar cuántos de esos dígitos sean ceros, cuántos unos, etc. Cuando se trabaja bajo esta suposición, minimizar el costo total del mensaje y minimizar el número total de dígitos es lo mismo.

En la codificación Huffman con costes desiguales la suposición anterior ya no es verdadera: los símbolos del alfabeto pueden tener longitudes no uniformes, debido a características del medio de transmisión. Un ejemplo es el alfabeto del código Morse, donde una 'raya' requiere más tiempo para ser enviada que un 'punto', y por lo tanto el costo del tiempo de transmisión de una raya es mayor. El objetivo sigue siendo minimizar la longitud media de la palabra de código, pero no es suficiente con minimizar el número de símbolos usado en el mensaje. No se conoce un algoritmo para solucionar esto de la misma manera o con la misma eficiencia que la codificación Huffman convencional.

[editar] Árboles binarios alfabéticos óptimos (codificación Hu-Tucker)

En una situación de codificación Huffman estándar, se asume que cualquier código puede corresponderse con cualquier símbolo de entrada. En la versión alfabética, el orden alfabético de las entradas y salidas debe ser idéntico. Así, por ejemplo, a la

entrada no se le puede asignar , sino que le

correspondería o . Esto también se conoce como el problema de Hu-Tucker, por los autores de la publicación que contiene la primera solución linearítmica a este problema de optimalidad binaria alfabética, que es similar al algoritmo de Huffman, pero no es una variación del mismo. Estos árboles binarios alfabéticos óptimos son usados a menudo como áboles binarios de búsqueda.

[editar] Código canónico de Huffman

Page 34: Fórmula de Cayley

Si los pesos correspondientes a las entradas (ordenadas alfabéticamente) están en orden numérico, los códigos de Huffman tienen la misma longitud que los códigos alfabético óptimos, así que pueden calcularse como estas últimas, haciendo que la codificación Hu-Tucker sea innecesaria. El código resultante de las entradas (re) ordenadas numéricamente se conoce como código canónico de Huffman y es el código que normalmente se usa en la práctica, dada su facilidad para codificar y decodificar. La técnica para encontrar este código se conoce como codificación de Huffman-Shannon-Fano, ya que es óptima como la codificación de Huffman, y alfabética según la probabilidad de los pesos, como la codificación de Shannon-Fano.

[editar] Aplicaciones

La codificación aritmética puede considerarse como una generalización de la codificación de Huffman, de hecho, en la práctica la codificación Aritmética viene precedida por la codificación de huffman, pues es más fácil encontrar una aritmética para una entrada binaria que para una no binaria. Por otra parte aunque la codificación de compresión ofrece mejor rendimiento que la codificación de Huffman, la codificación de Huffman se encuentra todavía en uso generalizado debido a su simplicidad, alta velocidad, y falta de problemas de patentes.

La codificación de Huffman se utiliza a menudo en algún otro método de compresión. Como la deflación y códec multimedia como JPEG y MP3 que tienen una cuantificación digital basada en la codificación de Huffman.

[editar] Ejemplo

Una sonda espacial ha sido lanzada al espacio para contar cierto tipo de perturbaciones estelares. Ha de contar cuántas se producen en cada minuto, y tiene cada día una ventana de tiempo bastante reducida para enviar los datos a Tierra; por tanto, interesa reducir al máximo el tiempo de transmisión, y para ello se recurre a codificar las muestras mediante un código de Huffman.

En la siguiente tabla se muestran los valores a transmitir, junto con sus frecuencias relativas, su código en una codificación binaria de 3 bits, y su código en un posible código Huffman para estos valores.

Valor Frecuencia Código binario Código Huffman0 10% 000 0101 20% 001 102 30% 010 003 25% 011 114 10% 100 01105 o más 5% 101 0111

Puede observarse que, en la codificación binaria, todos los posibles valores reciben códigos del mismo número de bits, mientras que en la codificación Huffman, cada valor tiene un número diferente de bits: los códigos más frecuentes poseen dos bits, mientras que los menos frecuentes poseen cuatro bits.

Page 35: Fórmula de Cayley

A continuación se observa el código necesario para transmitir la siguiente serie de valores:

5,4,2,3,2,2,1,0,1,3,2,4,3,4,3,2,3,4,2,4

Utilizando la codificación binaria, sería una serie de 60 bits; es decir, 3 bits por símbolo.

101100010011010010001000001011010100011100011010011100010100

nota: se ha añadido la misma serie separada en bloques con la única razón de facilitar una transcripción manual libre de errores para un estudio por parte del lector interesado.

101.100.010.011.010.010.001.000.001.011.010.100.011.100.011.010.011.100.010.100

Utilizando, en cambio, la codificación Huffman, se tendría que enviar una secuencia de 53 bits; es decir, 2,65 bits por símbolo.

01110110001100001001010110001101101101100110110000110

nota: la misma serie dividida en bloques de 4 bits para la misma observación anterior.

0111.0110.0011.0000.1001.0101.1000.1101.1011.0110.0110.1100.0011.0

En este ejemplo, la media de bits por símbolo que cabría esperar de esta codificación, en cadenas de valores más largas, es de 2,4.

Para su comparación, la entropía del conjunto de símbolos es de 2,366; es decir, el mejor método de compresión sería capaz de codificar estos valores utilizando 2,366 bits por símbolo.

Es posible, también, apreciar cómo se pueden extraer sin ninguna ambigüedad los valores originales a partir de la cadena codificada mediante Huffman.

Hay que añadir que la codificación de Huffman no puede ser aplicada a imágenes en blanco y negro porque es incapaz de producir compresión sobre un alfabeto binario.

[editar] Bibliografía

D.A. Huffman, "A method for the construction of minimum-redundancy codes", Proceedings of the I.R.E., sept 1952, pp 1098-1102

[editar] Véase también

Algoritmo de Huffman Código canónico de Huffman Codificación aritmética

Page 36: Fórmula de Cayley

[editar] Enlaces externos

Generador de árboles de Huffman Huffman en PHP

Obtenido de «http://es.wikipedia.org/w/index.php?title=Codificaci%C3%B3n_Huffman&oldid=54889751»

Ver las calificaciones de la página

Evalúa este artículo¿Qué es esto?Confiable

Objetivo

Completo

Bien escrito

Estoy muy bien informado sobre este tema (opcional)

Enviar calificacionesGuardado correctamenteTu valoración aún no ha sido enviadaCategoría:

Teoría de códigos

Herramientas personales

Iniciar sesión / crear cuenta

Espacios de nombres

Artículo Discusión

Variantes

Vistas

Leer Editar Ver historial

Page 37: Fórmula de Cayley

Acciones

Buscar

Navegación

Portada Portal de la comunidad Actualidad Cambios recientes Páginas nuevas Página aleatoria Ayuda Donaciones Notificar un error

Imprimir/exportar

Crear un libro Descargar como PDF Versión para imprimir

Herramientas

Lo que enlaza aquí Cambios en enlazadas Subir archivo Páginas especiales Enlace permanente Citar este artículo Evalúa este artículo

En otros idiomas

العربية Azərbaycanca Català Česky Dansk Deutsch Ελληνικά English Eesti فارسی Suomi Français עברית Italiano 日本語

Especial:Buscar

Page 38: Fórmula de Cayley

한국어 Nederlands Norsk (bokmål) Polski Português Русский Svenska ไทย Türkçe Tiếng Việt 中文

Esta página fue modificada por última vez el 26 mar 2012, a las 23:09. El texto está disponible bajo la Licencia Creative Commons Atribución

Compartir Igual 3.0; podrían ser aplicables cláusulas adicionales. Lee los términos de uso para más información.Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.

Contacto

Política de privacidad Acerca de Wikipedia Limitación de responsabilidad Versión para móviles