Fusionar dos árboles de búsqueda binarios

17

Estoy buscando un algoritmo para fusionar dos árboles de búsqueda binarios de tamaño y rango arbitrarios. La forma obvia de implementar esto sería encontrar subárboles completos cuyo rango pueda caber en un nodo externo arbitrario en el otro árbol. Sin embargo, el peor tiempo de ejecución para este tipo de algoritmo parece ser del orden de O(n+m)dónde ny mdel tamaño de cada árbol, respectivamente.

Sin embargo, me han dicho que esto se podría hacer en O(h), donde hestá la altura del árbol con la altura más grande. Y estoy completamente perdido en cómo esto es posible. He intentado experimentar rotando uno de los árboles primero, pero girar un árbol en una columna ya es O (h).

efritz
fuente
No sé, Erick, tengo la misma pregunta también.
Para ser justos, esta fue una pregunta dada en una tarea de Algoritmos. Resulta que O (h) es un tiempo de ejecución demasiado estricto, ya que la pregunta olvidó dar más información necesaria: que todas las claves de un árbol eran más pequeñas que todas las claves del árbol correcto.
efritz
¿Me estoy perdiendo algo, no sería fácil combinar árboles binarios O(log n)con una simple función de nodo de movimiento?
AL
@AT Sí, pero no sabíamos que las claves de un BST eran mutuamente excluyentes del otro.
efritz
1
Este es un árbol rojo-negro, no un BST. Un rojo negro (así como los árboles y montones AVL) son tipos especiales de árboles que mantienen una propiedad limitada por la altura. Los BST de vainilla pueden ser una sola columna vertebral. Intente insertar una serie de números no decrecientes o no crecientes en un BST y verá que la altura de estos árboles es en realidad n. Solo los árboles binarios completos o completos tienen una altura logarítmica con respecto a su número total de nodos.
efritz

Respuestas:

24

En ArXiv: 1002.4248 , John Iacono y Özgür Özkan describen un algoritmo relativamente simple para fusionar dos árboles de búsqueda binarios en tiempo amortizado ; El análisis es la parte difícil. [ Actualización: como Joe observa correctamente en su respuesta, este algoritmo se debe a Brown y Tarjan.] También describen una estructura de datos de diccionario más complicada, basada en listas de omisión sesgadas, que admite fusiones en el tiempo amortizado O ( log n ) .O(log2n) O(logn)

Por otro lado, es imposible un límite de peor de los casos . Considere dos árboles de búsqueda binarios con n nodos, uno almacena los enteros pares entre 2 y 2 n , el otro almacena los enteros impares entre 1 y 2 n - 1 . Fusionar los dos árboles crea un nuevo árbol de búsqueda binario que almacena todos los enteros entre 1 y 2 n . En cualquiera de estos árboles, una fracción constante de los nodos tiene una paridad diferente a la de sus padres. (Prueba: el padre de una hoja impar debe ser par.) Por lo tanto, la fusión de los árboles pares e impares requiere un cambioO(logn)n22n12n112n punteros.Ω(n)

Jeffε
fuente
Una nota: si he leído la descripción en este documento correctamente, estos árboles no admiten insertar y eliminar. La fusión solo sigue el procedimiento para fusionar árboles de búsqueda de dedos (descrito en la respuesta de Joe). El conjunto restringido de operaciones permite un mejor análisis que el O ( n lg mO(lg2norte)uno. O(nortelgmetronorte)
jbapple
1
El análisis mejorado se debe a la amortización, no a una restricción de las operaciones permitidas. Las inserciones y eliminaciones se pueden admitir con divisiones y fusiones (en realidad "uniones") en el mismo límite de tiempo amortizado . O(losolnorte)
Jeffε
Solo por curiosidad, ¿ se ve afectado el tiempo si los árboles se almacenan en matrices en lugar de listas enlazadas (lo que supongo es lo que querías decir cuando dijiste "cambiar ... punteros ")? Ω(norte)
mtahmed
Por defecto, los "árboles de búsqueda binarios" son estructuras basadas en punteros (no "listas vinculadas"); cada nodo apunta a sus dos hijos y posiblemente a su padre. Pero el límite inferior no depende de la representación precisa. Hay formas de fusionar dosárboles de búsqueda binarian-node, por lo que cualquier algoritmo basado en comparación necesita al menoslog2 ( 2n(2nortenorte)nortecomparaciones para elegir la correcta. Iniciar sesión2(2nortenorte)2norte-O(Iniciar sesiónnorte)
Jeff
1
@ Jɛ ff E: Estoy de acuerdo en que las divisiones y las uniones son compatibles, pero no creo que lo sea crear o destruir árboles. Entonces, por ejemplo, si quiero eliminar "x" del alfabeto, no obtengo solo "a..wyz", sino también "x". El tamaño del universo (que es , ver sección 2.1) no cambia. Además, la introducción a la sección 1 señala que los conjuntos deben particionar el universo, lo que interpreto (tal vez incorrectamente) significa que cada elemento en el universo está en algún árbol. Entonces, tal como lo leí, esta construcción no funciona sobre universos ilimitados. Así es como debería escribir mi comentario arriba. norte
jbapple
9

Puede encontrar útil esta referencia: Brown y Tarjan, un algoritmo de fusión rápida , en el que los autores muestran cómo fusionar árboles binarios balanceados (AVL) en que es óptimo (para algoritmos basados ​​en comparación). mynson las longitudes de las listas ordenadas representados por los árboles binarios de búsqueda, y se supone quemn.O(nlogmn)mnmn

También podría ver una discusión sobre diferentes técnicas para fusionar conjuntos ordenados en la sección 11.5 de este documento sobre árboles de búsqueda de dedos

Joe
fuente
2
Tanto el límite de tiempo y el límite inferior coincidente suponen quemn. O(norteIniciar sesiónmetronorte)metronorte
Jeff
Pensé que eso estaba implícito en el límite de tiempo, pero edité la pregunta para hacerlo explícito.
Joe
0

Puede fusionar árboles en peor de los casosO(1) sin dejar de admitir: insertar, eliminar y buscar en .O(losol norte)

Brodal, Gerth Stølting, Christos Makris y Kostas Tsichlas. "Listas ordenadas catenables en tiempo constante con el peor caso puramente funcional" . En Actas de la 14ª Conferencia sobre el Simposio Europeo Anual - Volumen 14, 172–183. ESA'06. Londres, Reino Unido, Reino Unido: Springer-Verlag, 2006. [ PDF ]

A
fuente
1
Su estructura de datos admite unirse en O (1) tiempo amortizado, no fusionarse. Todos los elementos en un árbol deben ser más pequeños que todos los elementos en el otro.
Jeffε
TiTjTiTjTjTiw(Ti)=w(Tj)TjTiTiTjTi