Qual è la struttura dati ottimale per un albero di mappe.


9

Sto cercando una struttura di dati, che è fondamentalmente un albero di mappe, in cui la mappa in ciascun nodo contiene alcuni nuovi elementi, nonché gli elementi nella mappa del nodo principale. Per mappa qui intendo una mappa di programmazione con chiavi e valori, come map in STL o dict in python.

Ad esempio, potrebbe esserci un nodo radice:

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

e 2 figli, ognuno aggiungendo un elemento alla mappa principale

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

Vorrei che questo fosse il più efficiente possibile in termini di spazio, cioè non voglio archiviare una copia completa della mappa risultante su ciascun nodo, ma idealmente la ricerca sarebbe comunque O (log N), N essendo il numero totale di elementi nel nodo, non l'intero albero.

Stavo pensando che forse c'è una funzione di hash intelligente che potrei usare per questo, ma non sono riuscito a trovare nulla.

L'approccio ingenuo consiste nel memorizzare le voci appena aggiunte in una mappa su ciascun nodo e quindi spostarsi verso l'alto dell'albero se non viene trovato nulla. Non mi piace perché dipende dalla profondità dell'albero.


quindi ogni nodo rappresenta una mappa che perfeziona la mappa memorizzata nel genitore?
Suresh Venkat,

intendi anche mappa in senso matematico o cartografico?
Suresh Venkat,

Intendo una mappa in senso matematico / CS. Come la mappa nella STL per esempio.
phreeza,

@Suresh: sembra che non sia un perfezionamento. Se ho capito bene la domanda, un nodo figlio aggiunge nuovi elementi alla mappa del suo nodo genitore.
Jukka Suomela,

e per rispondere alla prima domanda, ciascun nodo perfeziona la mappa, nel senso che vengono aggiunte più coppie chiave / valore.
phreeza,

Risposte:


10

2mn


5
Ma questo esempio non mostra che è necessario archiviare informazioni ridondanti (vale a dire che è necessario duplicare le voci del nodo radice anche su ciascun figlio)!
Jukka Suomela,

1nmo(m)

15

O(logN)

Θ(O(lglgN)Θ(lgn)

xxxvv

Per un limite inferiore, nota che anche una sola domanda accoltellata è dura come il predecessore (vedi le riduzioni della ricerca colorata del predecessore). Poiché i riferimenti cartacei sopra mostrano un comportamento di somma diretta ottimale per la ricerca del predecessore, significa che l'algoritmo sopra descritto è ottimale per qualsiasi razione tra il numero di nodi e il numero totale di chiavi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.