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.
fuente
Respuestas:
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.2m n
fuente
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.
fuente