Ces deux fonctions sont une modification de la mise en œuvre d'un index Binaire de l'arbre (Fenwick arbre) structure de données.
Voici deux photos pour compléter MikeCAT de répondre, en montrant comment je la variable de mises à jour pour différentes valeurs de.
La fonction get:
Pour assumer la valeur maxi de l'entrée en fonction est de 15 pour des raisons de simplicité de la représentation.
Un nœud avec le numéro de t sur elle représente l'arbre[t] dans l'arborescence de la matrice.
Si vous appelez d'obtenir la fonction de i la valeur retournée est la somme de l'arbre[i] plus la somme de tous les arbres les éléments du tableau qui leur index dans le tableau est un parent de i dans l'image, à l'exception de zéro.
Voici quelques exemples:
get(15) = tree[15] + tree[14] + tree[12] + tree[8]
get(14) = tree[14] + tree[12] + tree[8]
get(13) = tree[13] + tree[12] + tree[8]
get(12) = tree[12] + tree[8]
get(11) = tree[11] + tree[10] + tree[8]
get(10) = tree[10] + tree[8]
get(9) = tree[9] + tree[8]
get(8) = tree[8]
get(7) = tree[7] + tree[6] + tree[4]
get(6) = tree[6] + tree[4]
get(5) = tree[5] + tree[4]
get(4) = tree[4]
get(3) = tree[3] + tree[2]
get(2) = tree[2]
Les numéros sur les étiquettes des nœuds dans l'image ci-dessus, a la propriété que chaque nœud parent du nœud d'étiquette moins le moins significatif de 1(très bien expliqué sur @MikeCAT réponse)
La "mise à jour" de la fonction:
Pour des raisons de simplicité de l'image, nous supposons que la longueur maximum de l' arbre de la matrice est de 16.
La mise à jour de la fonction est un peu plus compliqué.
Il ajoute val d' arbre[i] et tous les arbres des éléments qui leur indice est parent du nœud avec l'étiquette j'ai dans l'image.
update(16, val) --> tree[16] += val;
update(15, val) --> tree[15] += val, tree[16] += val;
update(14, val) --> tree[14] += val, tree[16] += val;
update(13, val) --> tree[13] += val, tree[14] += val; tree[16] += val;
update(12, val) --> tree[12] += val, tree[16] += val;
update(11, val) --> tree[11] += val, tree[12] += val, tree[16] += val;
update(10, val) --> tree[10] += val, tree[12] += val, tree[16] += val;
update(9, val) --> tree[9] += val, tree[10] += val, tree[12] += val, tree[16] += val;
update(8, val) --> tree[8] += val, tree[16] += val;
update(7, val) --> tree[7] += val, tree[8] += val, tree[16] += val;
update(6, val) --> tree[6] += val, tree[8] += val, tree[16] += val;
update(5, val) --> tree[5] += val, tree[6] += val, tree[8] += val, tree[16] += val;
update(4, val) --> tree[4] += val, tree[8] += val, tree[16] += val;
update(3, val) --> tree[3] += val, tree[4] += val, tree[8] += val, tree[16] += val;
update(2, val) --> tree[2] += val, tree[4] += val, tree[8] += val, tree[16] += val;
update(1, val) --> tree[1] += val, tree[2] += val, tree[4] += val, tree[8] += val, tree[16] += val;