Question

J'ai fait des recherches sur la structure de données d'arbre décrit à ce lien (vers le bas):

http://sigpipe.macromates.com/2009/08 / 13 / maintien-a-layout /

Il est mentionné que cette structure de données pourrait être un arbre de doigt. Cependant, après plus de recherche autour des arbres des doigts, j'ai trouvé que ce manque les « doigts » qui fait des arbres arbres doigts des doigts. Il semble plutôt cela est juste un arbre binaire annoté (annoté avec la taille de sous-arbre).

Connaissez-vous une implémentation existante (dans toutes les langues) de cette structure de données que je pourrais utiliser comme référence pour ma propre mise en œuvre (bien que, de préférence pas une mise en œuvre dans un langage de programmation fonctionnelle )?

Ou, quelle serait la façon la plus optimale des annotations de modernisation taille de sous-arbre dans un arbre existant structure de données?

Merci!

Était-ce utile?

La solution

Simon B-Comptées Les arbres de Tatham sont similaires. si le comptage de noeud est remplacée par une largeur de mémoire tampon comme dans tweak , ceux-ci fournissent des opérations comme cordes .

, en fait, à la lecture que la page vous référencez je vois qu'il a été utilisé comme une table de pièce ou d'une table de ligne pour un éditeur

dans le document, positionnel Delta arbres pour concilier les mises à jour avec le stockage de données en lecture optimisée , les auteurs présentent un arbre dont le comportement en ce qui concerne les invariants qu'il détient entre les nœuds de l'arbre met à nu une ressemblance frappante avec enfilades de Xanadu auquel le B-tree compté est également similaire.

Autres conseils

Je l'ai mis en œuvre quelque chose de similaire basé sur une question que je posais l'autre jour. Je annotations ajouté au boost :: :: intrusive rbtree / noeuds avltree pour calculer la taille de chaque sous-arbre (comptage de noeud foreach = node-> gauche> count + node-> droite> count + 1). J'effectuer cette mise à jour lors de l'insertion / deletetion / rééquilibrage de l'arbre à l'aide d'un crochet de l'impulsion pour set_parent, set_left et set_right. Quasiment, comme indiqué dans le site que vous avez mentionné, après chaque mise à jour de nœud, mettez à jour la taille du noeud courant, puis parcourir l'arbre jusqu'à ce que vous frappez la racine, la mise à jour de la taille de chaque nœud que vous allez.

Le problème vient quand vous voulez insérer dans l'arbre à une position spécifique. À peu près au moment où vous faites cela, vous invalidez l'invariant clé commande pour la structure de l'arbre. Cela signifie que vous ne sera pas en mesure d'effectuer des recherches efficaces O (log n) par clé. Mais, si vous voulez, vous ne serais probablement pas besoin de la taille des annotations de toute façon.

scroll top