Ma question porte sur le raisonnement complet qui sous-tend l'étape de mise à jour dans les arbres indexés binaires (arbres de Fenwick). Ainsi, lors de la mise à jour de notre tableau avec un certain incrément, à une certaine position, la mise à jour se déroule comme suit :
void updateBIT(int BITree[], int n, int index, int val)
{
// index in BITree[] is 1 more than the index in arr[]
index = index + 1;
// Traverse all ancestors and add 'val'
while (index <= n)
{
// Add 'val' to current node of BI Tree
BITree[index] += val;
// Update index to that of parent in update View
index += index & (-index);
}
Mon problème se situe au niveau de la index += index & (-index);
partie. Veuillez noter que je comprends la index & (-index)
surtout dans le contexte de l'interrogation de l'arbre.
J'ai essayé plusieurs exemples à la main en utilisant cette règle de mise à jour de l'index, mais je n'ai pas réussi à trouver la logique derrière l'ajout de index & (-index)
afin de passer au nœud suivant qui doit être mis à jour.
D'après ce que j'ai obtenu jusqu'à présent, un nœud i
dans un BIT est "responsable" des valeurs originales dans le tableau allant de [i - i & (-i) + 1, i]
ce qui implique que tout nœud se trouve dans un intervalle de cette forme. Plus précisément, si j'ai bien compris, lorsque l'on veut mettre à jour la position k
dans le tableau original, nous suivons les étapes suivantes (conceptuellement, pas dans le code réel) :
- Itération
0
: mise à jourBIT[k + 1]
(les indices sont décalés de1
dans le BIT). Alors que l'on est toujours à l'itération0
Nous mettons à jour l'index que nous sommes en train d'élaborer. donc je suppose que nous recherchons le prochain plus petit intervalle responsable du nœudk
Nous devons donc trouver la indice suivanti
dondei - i & (-i) < k < i
. Trouver cet indexi
par en incrémentant l'indice actuel dek & (-k)
.
Les autres itérations se déroulent de la même manière jusqu'à ce que nous sortions des limites. J'ai essayé de nombreux exemples à la main, et je ne comprends toujours pas pourquoi l'ajout de i & (-i)
nous amène au nœud suivant. Tous les tutoriels que j'ai trouvés sur le web, y compris les vidéos, sont complètement douteux à ce sujet.
Plusieurs questions relatives aux TBI sont posées ici, veuillez ne pas les fusionner avec les miennes avant de les avoir lues attentivement . A ma connaissance, cette question n'a pas reçu de réponse.