¿Estructura de diccionario ordenada que admite fusiones eficientes?

8

Muchas estructuras de árbol equilibradas (árboles rojos / negros, árboles de separación, etc.) y algunas otras estructuras de diccionario ordenadas (listas de omisión) admiten una operación de unión que incluye dos diccionarios donde todas las claves de la primera estructura son menores que todas las claves del segundo, luego combina los dos diccionarios en un solo diccionario ordenado en el tiempo , donde n es el número total de claves. Sin embargo, esto solo funciona si no hay superposición en los rangos de claves almacenadas en esos árboles.O(logn)n

Del mismo modo, muchas colas prioritarias (montones binomiales, montones de Fibonacci, etc.) admiten fusiones de tiempo . Estas fusiones funcionan independientemente de las claves almacenadas, pero dado que las estructuras de datos son colas de prioridad, no podemos buscar elementos aleatorios en la estructura resultante.O(logn)

¿Existe una estructura de diccionario ordenada que admita fusiones de diccionarios arbitrarios en el tiempo al tiempo que admite operaciones de diccionario ordenadas normales (inserciones, eliminaciones, búsquedas, consultas de sucesor / predecesor, etc.) en el tiempo O ( log n ) , o ¿Una prueba de límite inferior de que tales estructuras no pueden existir?O(logn)O(logn)

templatetypedef
fuente
2
¿Qué otras operaciones debe tener el diccionario ordenado y qué tan rápido deben ser? Sin requisitos sobre el orden de inserción y búsqueda, las listas doblemente enlazadas funcionarán bien, pero las operaciones sin fusión toman tiempo lineal, en la longitud de la lista, que puede ser superlineal en el número de claves distintas.
jbapple
O(logn)
Le sugiero que edite su pregunta para incluir esta información en la pregunta ...
DW
O(logn)n

Respuestas:

8

dO(logd)kO(klog(n/k))

Ahora, suponga que desea admitir inserciones, fusiones destructivas y búsquedas. Para las inserciones y búsquedas, solo use las operaciones de árbol de búsqueda existentes. Para una fusión, siempre combine el árbol más pequeño en el más grande, y use un recorrido transversal del árbol más pequeño para obtener su orden ordenado en tiempo lineal. Luego, inserte los elementos del árbol más pequeño uno a la vez en el árbol más grande en este orden ordenado.

xn1,n2,xO(logn1)O(log(n2/n1))O(logn)xO(logn)O(1)

nO(logn)el tiempo por operación debe ser el número total de elementos que se insertaron o eliminaron en lugar del número actualmente presente. Si estos dos números alguna vez se separan demasiado, puede realizar una actualización que reajuste todos los recuentos a sus números reales, restableciendo la estructura de datos a un estado sin elementos borrados de forma diferida; el tiempo amortizado para esta actualización se puede cargar contra las operaciones de eliminación que tuvo que realizar para obtener los números tan separados. O posiblemente puede hacer que la amortización de fusión funcione directamente con eliminaciones no perezosas, pero no he resuelto los detalles de esa parte.

David Eppstein
fuente
1
logUU
No, solo registre la cantidad máxima de elementos que haya en un árbol al mismo tiempo.
David Eppstein