¿Cuáles son las ventajas de un árbol AVL?

Gracias por A2A.

Los árboles AVL, como ya lo expliqué en un par de mis respuestas anteriores, no son más que un árbol de búsqueda binaria auto equilibrado.

¿Cuál es su ventaja?

Bueno, el tiempo de inserción en BST nos da la ilusión de ser O (log n) pero no siempre es log n. Por ejemplo, considere un árbol de búsqueda binaria formado por la inserción de nodos en orden ordenado (decir orden ascendente). El árbol se verá así:

Claramente, el árbol anterior es un árbol de búsqueda binaria y se ve tan bien como una lista o cualquier estructura de datos lineal, y por lo tanto la operación de búsqueda lleva tiempo lineal. Mientras que en el caso de los árboles AVL, equilibramos el árbol de búsqueda binario cada vez que se ingresa un nodo. Entonces, el árbol AVL para los mismos nodos se verá así:

Como puedes ver. Este es un BST perfectamente equilibrado, que no lleva más tiempo que O (log n) para la operación de búsqueda. Entonces, cuando N es un número muy grande, los árboles AVL tienen una ventaja significativa sobre los árboles de búsqueda binaria.

Espero que esto ayude.

Buena suerte 🙂

Árbol AVL (Alto – Árbol de equilibrio)

No es más que un árbol de búsqueda binaria (BST) con factor de equilibrio.

El factor de equilibrio puede ser -1, 0, 1.

Factor de equilibrio

Altura del subárbol izquierdo – Altura del subárbol derecho.

Aplicación del árbol AVL

Se utiliza para realizar búsquedas en O (log n) Complejidad de tiempo.

Importancia del árbol AVL

La búsqueda se puede realizar mediante Binary Search Tree (BST), pero si el elemento ya está ordenado, BST toma la forma de una cadena y la complejidad temporal es O (n).

Para superar este problema, se introduce el árbol AVL.

Debido al factor de equilibrio, nunca toma una forma de cadena, de hecho, el árbol AVL es un árbol binario casi completo.

Operaciones como inserción, eliminación, búsqueda en un árbol toman tiempo O (log n) en el peor de los casos y el caso promedio.

Espero que sepas sobre los árboles de búsqueda binarios. Están destinados a proporcionar búsqueda e inserción de registros (n). Ahora, si está insertando elementos ordenados, el árbol no será exactamente binario. Tendrá una estructura lineal que tendrá una búsqueda e inserción lineal.

Los árboles avl se equilibran. Esto significa que los árboles Avl no permiten que la estructura sea lineal. De este modo, cumpliendo los propósitos de un árbol de búsqueda binario.

Los árboles AVL son árboles de búsqueda binaria (BST) de equilibrio automático. Un BST normal puede estar sesgado a ambos lados, lo que resultará en un esfuerzo mucho mayor para buscar una clave (el orden será mucho más que [matemática] O (\ log_2n) [/ matemática]) y algunas veces igual [matemática] O (n [/ math])) a veces da el resultado del peor de los casos, que es el mismo esfuerzo dedicado a la búsqueda secuencial. Esto hace que los BST sean inútiles como una estructura de datos prácticamente eficiente.

La solución es el árbol AVL como versiones de equilibrio automático del árbol binario. El árbol verificará la diferencia de profundidad entre sus subárboles izquierdo y derecho y realiza la rotación izquierda o derecha o combinada de ciertos nodos de pivote esencialmente manteniendo la diferencia de profundidad como 1. El equilibrio se realiza con cada inserción para que la complejidad total de la inserción No cambia significativamente. Sin embargo, cada vez hay más aumento en el espacio requerido, ya que cada nodo ahora llevará un equipaje de profundidad. Los beneficios son incalculables, ya que recuperar los datos es muy eficiente y casi siempre la complejidad estará en O ( \log_2n)

Vea a continuación el código para la inserción AVL

paquete edu.amrita.cen;

import edu.amrita.cen.BinaryTree.TNode;

/ **
* *
* T1, T2, T3 y T4 son subárboles.
zy
/ \ / \
y T4 Girar a la derecha (z) xz
/ \ – – – – – – – – -> / \ / \
x T3 T1 T2 T3 T4
/ \
T1 T2
b) Caso izquierdo derecho

zzx
/ \ / \ / \
y T4 Rotar a la izquierda (y) x T4 Rotar a la derecha (z) yz
/ \ – – – – – – – – -> / \ – – – – – – – -> / \ / \
T1 xy T3 T1 T2 T3 T4
/ \ / \
T2 T3 T1 T2
c) Derecho Derecho Caso

zy
/ \ / \
T1 y Girar a la izquierda (z) zx
/ \ – – – – – – – -> / \ / \
T2 x T1 T2 T3 T4
/ \
T3 T4
d) Caso derecho izquierdo

zzx
/ \ / \ / \
T1 y Rotar a la derecha (y) T1 x Rotar a la izquierda (z) zy
/ \ – – – – – – – – -> / \ – – – – – – – -> / \ / \
x T4 T2 y T1 T2 T3 T4
/ \ / \
T2 T3 T3 T4
Ejemplos de inserción:

* @author vijaykrishnamenon
* *
* /

AVLTrees de clase pública {

clase TNode {
int val, altura;
TNodo izquierda, derecha;

Public TNode (int v, TNode l, TNode r) {
val = v;
izquierda = l;
derecha = r;
altura = 0;
}

TNode público (int v) {
esto (v, nulo, nulo);
}
}

Raíz de TNode = nulo;

public int height (TNode n) {
if (n == null) devuelve 0;
de lo contrario regrese n. altura;
}

public int max (int i, int j) {
si (i> j) devuelve i;
de lo contrario, devuelve j;
}

saldo público int (TNode n) {
if (n == null) devuelve 0;
return (altura (n.left) – altura (n.right));
}

Public TNode leftRotate (TNode n) {
if (n == null) devuelve n;

TNode y = n.right;
n.right = y.izquierda;
y.izquierda = n;

n.height = max (altura (n.left), altura (n.right)) + 1;
y.height = max (altura (y.izquierda), altura (y.derecha)) + 1;

volver y;
}

Public TNode rightRotate (TNode n) {
if (n == null) devuelve n;

TNode y = n.left;
n.left = y.right;
y.right = n;

n.height = max (altura (n.left), altura (n.right)) + 1;
y.height = max (altura (y.izquierda), altura (y.derecha)) + 1;

volver y;

}

TNode protegido insert_r (raíz de TNode, int a) {
if (root == null) root = new TNode (a);

si no (root.val> a) root.left = insert_r (root.left, a);
sino root.right = insert_r (root.right, a);

root.height = max (height (root.left), height (root.right)) + 1;

int bal = balance (raíz);

//Izquierda izquierda…
if (bal> 1 && a return rightRotate (root);
//Izquierda derecha…
if (bal> 1 && a> = root.left.val) {
root.left = leftRotate (root.left);
return rightRotate (root);
}
//Bien bien…
if (bal <-1 && a> = root.right.val)
return leftRotate (root);
//Derecha izquierda…
if (bal <-1 && a root.right = rightRotate (root.right);
return leftRotate (root);
}

volver root;
}

inserción vacía pública (clave int) {
root = insert_r (raíz, clave);

System.out.println (“\ n”);
preordenar (raíz);
}

public void create (int [] a) {
para (int i = 0; i insertar (a [i]);

}

pedido público vacío (raíz de TNode) {
if (root == null) return;

System.out.print (root.val + “(“);
if (root.left! = null) {
preordenar (root.left);
System.out.print (“,”);
}
if (root.right! = null) {
preordenar (root.right);

}
System.out.print (“)”);
}

public static void main (String [] args) {
AVLTrees t = new AVLTrees ();

int [] a = {7,6,5,4,3,2,1, -1, -2};
t.crear (a);

System.out.println (“\ n”);
t.preorder (t.root);
}

}

Los árboles AVL son árboles de búsqueda binarios equilibrados que garantizan la complejidad del peor caso de O (logn) para búsqueda, inserción y eliminación, mientras que los árboles de búsqueda binaria vanilla son O (n) para estas operaciones.

Realizar búsquedas en árboles AVL tiene la misma complejidad asintótica que los árboles rojo-negros, pero son más rápidos por un factor multiplicativo porque los árboles AVL toman más rotaciones para equilibrarse más que los árboles rojo-negros.

En informática, un árbol AVL es un árbol de búsqueda binaria con equilibrio automático. Fue la primera estructura de datos de este tipo que se inventó. En un árbol AVL, las alturas de los dos subárboles secundarios de cualquier nodo difieren en como máximo uno; si en algún momento difieren en más de uno, se realiza un reequilibrio para restaurar esta propiedad. La búsqueda, la inserción y la eliminación toman tiempo O (log n ) tanto en el promedio como en el peor de los casos, donde n es el número de nodos en el árbol antes de la operación. Las inserciones y eliminaciones pueden requerir que el árbol sea reequilibrado por una o más rotaciones de árbol.

Los árboles AVL a menudo se comparan con los árboles negros rojos porque ambos admiten el mismo conjunto de operaciones y toman tiempo O (log n ) para las operaciones básicas. Para aplicaciones de búsqueda intensiva, los árboles AVL son más rápidos que los árboles rojo-negros porque están más estrictamente equilibrados. Al igual que los árboles rojo-negros, los árboles AVL tienen un equilibrio de altura. Ambos, en general, no están equilibrados en peso ni en μ para cualquier μ≤1⁄2; es decir, los nodos hermanos pueden tener números muy diferentes de descendientes.

El árbol AvL son optimizaciones sobre el árbol de búsqueda binaria equilibrado. Permite menos tiempo para mantener la altura del árbol. Se autoequilibra de manera optimizada en comparación con el árbol de búsqueda binaria equilibrado normal. Para entrar en detalles, puede leerlo en geeksforgeeks o en el sitio web de topcoder.

Dado que los árboles AVL son árboles de equilibrio de altura, operaciones como la inserción y eliminación tienen una baja complejidad de tiempo. Consideremos un ejemplo: si tiene el siguiente árbol con las teclas 1, 2, 3, 4, 5, 6, 7 y el árbol binario será como la segunda figura:

Para insertar un nodo con una clave Q en el árbol binario, el algoritmo requiere 7 comparaciones, pero si inserta la misma clave en el árbol AVL, en la primera figura anterior puede ver que el algoritmo requerirá 3 comparaciones.

AVL y el árbol rojo negro son árboles de búsqueda binarios equilibrados. Los árboles de búsqueda binarios son excelentes para buscar y pueden proporcionarle un rendimiento de búsqueda O (log (n)) si están equilibrados. Pero si el BST no se mantiene correctamente, entonces, para algunas entradas, el árbol se sesga y el rendimiento de la búsqueda se convierte en O (n), lo que anula el propósito.

El árbol AVL es un árbol de búsqueda binaria de altura equilibrada, lo que significa que siempre tiene la altura como factor logarítmico del número de nodos.

Ser más preciso-

Si inserta 1, 2, 3, 4, 5 en ese orden en un árbol de búsqueda binario inicialmente vacío, el árbol estará sesgado. Las operaciones de búsqueda, inserción, eliminación, búsqueda mínima, búsqueda máxima, etc. tomarán tiempo O (n).

Mientras que en el árbol AVL siempre estará equilibrado en altura, por lo que las operaciones mencionadas anteriormente tomarán el tiempo log (n) donde n es el número de nodos presentes.

Avl tree es un árbol de auto equilibrio.

Por ejemplo, si insertamos series de números de la forma 20, 30, 40, 50, 60 en el árbol binario, entonces el árbol se sesgará y la altura del árbol en este caso será igual a n y no logn.

Por lo tanto, avl tree se utiliza para hacer que la búsqueda sea eficiente incluso en el peor de los casos.

Espero que esto ayude..!

El árbol AVL es un árbol de búsqueda binaria con equilibrio automático. Fue el primer arreglo de datos de este tipo en ser imaginario. En un árbol AVL , las alturas de los dos subárboles secundarios de cualquier nodo pueden ser diferentes como máximo en uno; Si en alguna ocasión son diferentes en más de uno, se realiza un reequilibrio para restablecer estas pertenencias.

Mira este video para saber sobre el árbol AVL