Donc, voici mon petit problème.Indexer le nombre de seaux
Disons que j'ai une liste des seaux un ... un n qui contiennent respectivement L < = c ... c n < articles H. Je peux décider des limites L et H. Je pourrais même les mettre à jour dynamiquement, bien que je ne pense pas que cela aiderait beaucoup.
L'ordre des godets est important. Je ne peux pas aller les échanger.
Maintenant, je voudrais indexer ces seaux de sorte que:
- Je sais que le nombre total d'articles
- Je Recherch l'élément ième
- je peux ajouter/supprimer des éléments à partir de n'importe quel compartiment et mettre à jour l'index efficacement
Cela semble facile non? En voyant ces critères, j'ai immédiatement pensé à un arbre Fenwick. C'est ce à quoi ils sont destinés.
Cependant, quand vous pensez au sujet des cas d'utilisation, quelques autres cas d'utilisation fluage:
- si un nombre de seau tombe en dessous de L, le seau doit disparaître (ne vous inquiétez pas encore sur les articles)
- si un nombre seau atteint H, un nouveau seau doit être créé, car celui-ci est plein
Je n'ai pas compris comment modifier un arbre Fenwick efficacement: supprimer/ajouter un nœud sans reconstruire le arbre entier ...
Bien sûr, nous pourrions configurer L = 0, de sorte que la suppression deviendrait inutile, mais l'ajout d'éléments ne peut pas vraiment être évité.
Voici donc la question:
Savez-vous soit une meilleure structure pour cet indice ou comment mettre à jour un arbre Fenwick? La préoccupation principale est l'efficacité, et parce que j'ai l'intention de mettre en œuvre des considérations de mémoire cache/mémoire valent la peine d'inquiétude.
Contexte:
J'essaie de trouver une structure quelque peu similaire à B-Arbres et listes Classé Passer mais avec un index localisé. Le problème de ces deux structures est que l'index est conservé le long des données, ce qui est inefficace en terme de cache (c'est-à-dire que vous devez récupérer plusieurs pages de la mémoire). Les implémentations de base de données suggèrent que garder l'index isolé des données réelles est plus favorable au cache, et donc plus efficace.
Je suis content que vous ayez l'air intéressé par le problème :) Cependant, si je devais seulement ajouter des seaux à la fin ou au début, le problème serait un peu plus facile. Au lieu de cela, je veux être en mesure d'insérer des seaux juste au milieu. Votre structure est toujours intéressante à cet égard, elle ressemble beaucoup à un B-Tree standard. Par exemple je pourrais remplacer la feuille 4 par un sous-arbre '7 (4 3)', mais cela déséquilibrera l'arbre. Tu m'as nourri de pensées :) –
@Matthieu: C'est un problème intéressant :-) Alors est-ce que je l'ai bien compris? Aussi, l'insertion, est-elle à côté du seau que vous modifiez ou pourrait-elle être arbitraire? –
Vous l'avez bien compris. L'insertion d'un seau vient en effet de l'insertion d'objets à une position donnée. Si vous remplissez le compartiment à cette position et que le compartiment suivant n'a pas assez d'espace, vous devez insérer un ou plusieurs compartiments entre eux. De même, ce serait bien si nous pouvions enlever les seaux quand ils sont vides. –