Quelle est la structure de données optimale pour un arbre de cartes.

9

Je cherche une structure de données, qui est essentiellement un arbre de cartes, où la carte à chaque nœud contient de nouveaux éléments, ainsi que les éléments de la carte de son nœud parent. Par carte ici, je veux dire une carte de programmation avec des clés et des valeurs, comme la carte dans la STL ou dict en python.

Par exemple, il pourrait y avoir un nœud racine:

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

et 2 enfants, chacun ajoutant un élément à la carte parent

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

Je voudrais que ce soit le plus économe en espace possible, c'est-à-dire que je ne veux pas stocker une copie complète de la carte résultante à chaque nœud, mais idéalement la recherche serait toujours O (log N), N étant le nombre total de des éléments au niveau du nœud, pas de l’arbre entier.

Je pensais qu'il y avait peut-être une fonction de hachage intelligente que je pourrais utiliser pour cela, mais je n'ai rien trouvé.

L'approche naïve consisterait à stocker les entrées nouvellement ajoutées dans une carte à chaque nœud, puis à remonter dans l'arborescence si rien n'est trouvé. Je n'aime pas ça car cela dépend de la profondeur de l'arbre.

phreeza
la source
donc chaque nœud représente une carte qui affine la carte stockée dans le parent?
Suresh Venkat
aussi, voulez-vous dire carte au sens mathématique ou cartographique?
Suresh Venkat
Je veux dire une carte dans le sens mathématique / CS. Comme la carte dans la STL par exemple.
phreeza
@Suresh: Il semble que ce ne soit pas un raffinement. Si j'ai bien compris, un nœud enfant ajoute de nouveaux éléments à la carte de son nœud parent.
Jukka Suomela
et pour répondre à la première question, chaque nœud affine la carte en ce sens que davantage de paires clé / valeur sont ajoutées.
phreeza

Réponses:

10

2mn

Jelani Nelson
la source
5
Mais cet exemple ne montre pas que vous devez stocker des informations redondantes (c'est-à-dire que vous devez également dupliquer les entrées du nœud racine sur chaque enfant)!
Jukka Suomela
1nmo(m)
15

O(logN)

Θ(O(lglgN)Θ(lgn)

xxxvv

Pour une borne inférieure, notez que même une seule question lancinante est aussi difficile que le prédécesseur (voir les réductions de la recherche de prédécesseur colorée). Étant donné que les références papier ci-dessus montrent un comportement optimal de somme directe pour la recherche précédente, cela signifie que l'algorithme décrit ci-dessus est optimal pour toute ration entre le nombre de nœuds et le nombre total de clés.

Mihai
la source