¿Cuál es la estructura de datos óptima para un árbol de mapas?

9

Estoy buscando una estructura de datos, que es básicamente un árbol de mapas, donde el mapa en cada nodo contiene algunos elementos nuevos, así como los elementos en el mapa de su nodo padre. Por mapa aquí me refiero a un mapa de programación con claves y valores, como mapa en STL o dict en python.

Por ejemplo, puede haber un nodo raíz:

root = {'car':1, 'boat':2}

y 2 hijos, cada uno agregando un elemento al mapa padre

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

Me gustaría que esto sea lo más eficiente posible en cuanto al espacio, es decir, no quiero almacenar una copia completa del mapa resultante en cada nodo, pero idealmente la búsqueda sería O (log N), siendo N el número total de elementos en el nodo, no todo el árbol.

Estaba pensando que tal vez hay una función inteligente de hash que podría usar para esto, pero no se me ocurrió nada.

El enfoque ingenuo sería almacenar las entradas recién agregadas en un mapa en cada nodo y luego subir al árbol si no se encuentra nada. No me gusta esto porque depende de la profundidad del árbol.

phreeza
fuente
entonces cada nodo representa un mapa que refina el mapa almacenado en el padre?
Suresh Venkat
Además, ¿te refieres al mapa en sentido matemático o cartográfico?
Suresh Venkat
Me refiero a un mapa en el sentido matemático / CS. Como mapa en el STL por ejemplo.
phreeza
@Suresh: Parece que no es un refinamiento. Si respondí bien la pregunta, un nodo hijo agrega nuevos elementos al mapa de su nodo padre.
Jukka Suomela
y para responder la primera pregunta, cada nodo refina el mapa en el sentido de que se agregan más pares clave / valor.
phreeza

Respuestas:

10

No ha dicho qué son las consultas, pero supongo que query () toma un nodo y una clave y desea el valor asociado (o nulo si no existe dicho valor). En este caso, creo que en general no puede hacerlo mejor que almacenar un mapa separado en cada nodo. Considere, por ejemplo, un árbol de oruga donde cada nodo de ruta tiene un nodo conectado que se bifurca (un total de 2n nodos). Root en un extremo del camino. Ahora suponga que el tamaño del universo para las claves es m. Para cada nodo bifurcado v y cada una de las m claves posibles, esa clave puede existir o no existir en v, y ambas cumplirían con la restricción de su subárbol. Por lo tanto, hay posibilidades de si existe o no cada tecla en cada nodo tenedor, por lo que necesita mn bits de espacio sólo para almacenar la información requerida.2metronorte

Jelani Nelson
fuente
55
¡Pero este ejemplo no muestra que debe almacenar información redundante (es decir, que también necesita duplicar las entradas del nodo raíz en cada elemento secundario)!
Jukka Suomela
1nortemetroo(metro)
15

O(Iniciar sesiónnorte)

Θ(O(lglgnorte)Θ(lgnorte)

XXXvv

Para un límite inferior, tenga en cuenta que incluso una pregunta punzante es tan difícil como la predecesora (vea las reducciones de la búsqueda de predecesoras en color). Dado que las referencias en papel anteriores muestran un comportamiento óptimo de suma directa para la búsqueda de predecesores, significa que el algoritmo descrito anteriormente es óptimo para cualquier relación entre el número de nodos y el número total de claves.

Mihai
fuente