You are on page 1of 6

rbol AA

rbol AA
En informtica un rbol AA es un tipo de rbol binario de bsqueda auto-balanceable utilizado para almacenar y recuperar informacin ordenada de manera eficiente. Los rboles AA reciben el nombre de su inventor, Arne Andersson. Los rboles AA son una variacin del rbol rojo-negro, que a su vez es una mejora del rbol binario de bsqueda. A diferencia de los rboles rojo-negro, los nodos rojos en un rbol AA slo pueden aadirse como un hijo derecho. En otras palabras, ningn nodo rojo puede ser un hijo izquierdo. De esta manera se simula un rbol 2-3 en lugar de un rbol 2-3-4, lo que simplifica las operaciones de mantenimiento. Los algoritmos de mantenimiento para un rbol rojo-negro necesitan considerar siete diferentes formas para balancear adecuadamente el rbol:

En un rbol AA, al cumplirse el estricto requisito de que slo los enlaces derechos pueden ser rojos, slo es necesario considerar dos formas:

Rotaciones de balanceo
En general, los rboles AA se implementan con la idea de un nivel en lugar de la de un color, a diferencia de los rboles rojo-negro. Cada nodo tiene un campo nivel y se deben cumplir las siguientes condiciones para que el rbol sea vlido: 1. 2. 3. 4. 5. El nivel de un nodo hoja es uno. El nivel de un hijo izquierdo es estrictamente menor que el de su padre. El nivel de un hijo derecho es menor o igual que el de su padre. El nivel de un nieto derecho es estrictamente menor que el de su abuelo. Cada nodo de nivel mayor que uno debe tener dos hijos.

Slo se necesitan dos operaciones para mantener el equilibrio en un rbol AA. Estas operaciones se llaman torsin (skew) y divisin (split). La torsin es una rotacin derecha que se realiza cuando una insercin o un borrado genera un enlace horizontal izquierdo, puede pensarse como un enlace rojo izquierdo en el contexto del rbol rojo-negro. La divisin es una rotacin izquierda condicional que tiene lugar cuando una insercin o un borrado crea dos enlaces horizontales derechos, lo que de nuevo se corresponde con dos enlaces rojos consecutivos en el contexto de los rboles rojo-negro.
funcin torcin es entrada: T, un nodo que representa un rbol AA que requiere ser rebalanceado. salida: Otro nodo que representa el rbol AA rebalanceado.

si nil(T) entonces devuelve Nil si no si nivel(izquierda(T)) == nivel(T) entonces Cambia los apuntadores de los enlaces horizontales a la izquierda. L = izquierda(T) izquierda(T) := derecha(L)

rbol AA derecha(L) := T devuelve L si no devuelve T fin si fin de la funcin

Torsin:
funcin divisin es entrada: T, un nodo que representa un rbol AA que requiere ser rebalanceado. salida: Otro nodo que representa el rbol AA rebalanceado.
si nil(T) entonces devuelve Nil si no si nivel(T) == nivel(derecha(derecha(T))) entonces Tenemos dos enlaces horizontales a la derecha. Toma el de en medio, elvalo, y devulvelo. R = derecha(T) derecha(T) := izquierda(R) izquierda(R) := T nivel(R) := nivel(R) + 1 devuelve R si no devuelve T fin si fin de la funcin

Divisin:

Insercin
La insercin comienza con la bsqueda normal en un rbol binario y su procedimiento de insercin. Despus, a medida que se desenrolla la pila de llamadas, es fcil comprobar la validez del rbol y realizar las rotaciones que se precisen. Si aparece un enlace horizontal izquierdo, se realiza una torsin, y si aparecen dos enlaces horizontales derechos, se realiza una divisin, posiblemente incrementando el nivel del nuevo nodo raz del subrbol correspondiente. Observe que el cdigo de muestra realiza un incremento de nivel(T). Lo que hace necesario continuar comprobando la validez del rbol a medida que las modificaciones suben desde las hojas.

rbol AA
funcin insertar es entrada: X, el valor a ser insertado, y T, la raz del rbol en el cual se insertar. salida: Una versin balanceada de T que incluye a X.

Haz el procedimiento normal de insercin de un rbol de bsqueda binario. Asigna al hijo correcto el resultado de la llamada recursiva en caso de que un nodo nuevo fue creado o la raz del subrbol cambi. si nil(T) entonces Crea una nueva hoja con X. devuelve nodo(X, 1, Nil, Nil) si no si X < valor(T) entonces izquierda(T) := insertar(X, izquierda(T)) si no si X > valor(T) entonces derecha(T) := insertar(X, derecha(T)) fin si Note que el caso X == valor(T) no est especificado. En esta implementacin, no tendr ningn ejemplo. Se puede cambiar el comportamiento dependiendo de la implementacin. Haz la torsin y luego la divisin. Las condiciones de si sern hechas ambas acciones estn dentro de los procedimientos ya descritos arriba. T := torsin(T) T := divisin(T) devuelve T fin de la funcin

Borrado
Como en la mayora de rboles binarios balanceados, el borrado de un nodo interno puede convertirse en el borrado de un nodo hoja al intercambiar el nodo interno bien con su predecesor o sucesor ms prximo, dependiendo del que est en el rbol o de los deseos del implementador. Para recuperar un predecesor smplemente se debe seguir un enlace izquierdo y despus todos los enlaces derechos restantes. De forma similar, el sucesor se puede encontrar al ir una vez a la derecha una vez y a la izquierda hasta que se encuentre un puntero nulo. Dada la propiedad de los rboles AA de que todos los nodos de un nivel superior a uno tienen dos hijos, el nodo sucesor o predecesor tendr nivel 1, haciendo que su eliminado sea trivial. Para re-equilibrar un rbol existen diferentes aproximaciones. La que describi Andersson en su publicacin original [1] es la ms simple, y se describir aqu, aunque implementaciones reales pueden optar por un enfoque ms optimizado. Tras un borrado, el primer paso para mantener la validez es reducir el nivel de todos los nodos cuyos hijos estn dos niveles por debajo de ellos, o a los que les faltan hijos. Despus, todo el nivel debe ser torsionado y dividido. Esta aproximacin se ha visto favorecida por el hecho de que se basa en tres pasos independientes y fciles de entender: 1. Decrementar el nivel, si es necesario. 2. Torsionar el nivel. 3. Dividir el nivel. Sin embargo, debemos torsionar y dividir todo el nivel en lugar de un solo nodo lo que complica nuestro cdigo. funcin borrar es

rbol AA
entrada: X, el valor a ser borrado, y T, la raz del rbol del que se debe borrar. salida: T, balanceado, sin el valor X.

si X > valor(T) entonces derecha(T) := borrar(X, derecha(T)) si no si X < valor(T) entonces izquierda(T) := borrar(X, izquierda(T)) si no si somos una hoja es fcil, si no, hay que reducir ese caso. si hoja(T) entonces regresa Nil si no si nil(izquierda(T)) entonces L := sucesor(T) derecha(T) := borrar(L, derecha(T)) valor(T) := L si no L := predecesor(T) izquierda(T) := borrar(L, izquierda(T)) valor(T) := L fin si fin si
Rebalancea el rbol. Decrementa el nivel de los nodos en este nivel si es necesario, y despus torsiona y divide todos los nodos en el nuevo nivel. T := decrementa_nivel(T) T := torcin(T) derecha(T) := torcin(derecha(T)) derecha(derecha(T)) := torcin(derecha(derecha(T))) T := divisin(T) derecha(T) := divisin(derecha(T)) regresa T fin de la funcin

funcin decrementa_nivel es entrada: T, un rbol del que queremos quitar enlaces que se saltan niveles. salida: T con sus niveles decrementados. debe_ser = min(nivel(izquierda(T)), nivel(derecha(T))) + 1 si debe_ser < nivel(T) entonces nivel(T) := debe_ser si debe_ser < nivel(derecha(T)) entonces nivel(derecha(T)) := debe_ser fin si fin si regresa T fin de la funcin Un buen ejemplo de borrado por este algoritmo est presente en la publicacin de Andersson [1].

rbol AA

Rendimiento
El rendimiento de un rbol AA es equivalente al de un rbol rojo-negro. Un rbol AA realiza ms rotaciones que un rbol red-black, pero la mayor sencillez de sus algoritmos tiende a hacerlos ms rpidos, y estos factores se compensan resultando en un rendimiento similar. Un rbol rojo-negro es ms constante en su rendimiento que un rbol AA, pero un rbol AA tiende a ser ms llano lo que produce unos tiempos de bsqueda ligeramente ms pequeos.[2]

Referencias
[1] http:/ / user. it. uu. se/ ~arnea/ abs/ simp. html [2] A Disquisition on The Performance Behavior of Binary Search Tree Data Structures (pages 67-75) (http:/ / www. cepis. org/ upgrade/ files/ full-2004-V. pdf).

Enlaces externos
A. Andersson. Balanced search trees made simple (http://user.it.uu.se/~arnea/abs/simp.html) A. Andersson. A note on searching in a binary search tree (http://user.it.uu.se/~arnea/abs/searchproc.html) AA-Tree Applet (http://people.ksp.sk/~kuko/bak/index.html) by Kubo Kovac AA Visual 2007 1.5 - OpenSource Delphi program for educating AA tree structures (http://www.softpedia. com/get/Others/Home-Education/AA-Visual-2007.shtml) Thorough tutorial with lots of code (http://www.eternallyconfuzzled.com/tuts/datastructures/ jsw_tut_andersson.aspx) Practical implementation (http://www.eternallyconfuzzled.com/libs/jsw_atree.zip) Object Oriented implementation with tests (http://www.cs.fiu.edu/~weiss/dsaa_c++3/code/) Comparison of AA trees, red-black trees, treaps, skip lists, and radix trees (http://www.upgrade-cepis.org/ issues/2004/5/up5-5Mosaic.pdf) An example C implementation (http://www.rational.co.za/aatree.c)

Fuentes y contribuyentes del artculo

Fuentes y contribuyentes del artculo


rbol AA Fuente: http://es.wikipedia.org/w/index.php?oldid=57730382 Contribuyentes: Vcarceler, 7 ediciones annimas

Fuentes de imagen, Licencias y contribuyentes


Archivo:Red Black Shape Cases.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Red_Black_Shape_Cases.svg Licencia: GNU Free Documentation License Contribuyentes: Why Not A Duck Archivo:AA Tree Shape Cases.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:AA_Tree_Shape_Cases.svg Licencia: GNU Free Documentation License Contribuyentes: Why Not A Duck Archivo:AA Tree Skew2.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:AA_Tree_Skew2.svg Licencia: GNU Free Documentation License Contribuyentes: User:Why Not A Duck based on work by Archivo:AA Tree Split2.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:AA_Tree_Split2.svg Licencia: GNU Free Documentation License Contribuyentes: User:Why Not A Duck based on work by

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

You might also like