Effectivement, une addition ne s'optimise pas. Par contre, si on doit répéter un plein de fois un différents sous-ensembles d'additions portant sur le même intervalle, mais à des positions différentes, il y a des cas où on peut optimiser ça pour éviter d'avoir à les refaire plein de fois.
Une solution simple: utiliser un second vecteur contenant la somme progressive des éléments: ce vecteur n'est calculé qu'une seule fois. Ensuite, si on a à prendre plein de fois la somme des éléments entre deux bornes aléatoires de cet ensemble, on n'a pas à refaire toutes les additions: il suffit de faire la différence entre les sommes progressives relatives à chaque borne: résultat 1 seule soustraction à chaque passage.
Mathématiquement cela s'écrit:
Pour tout i,j tel que 1 <= i <= j <= N,
Somme(valeur[i] à valeur[j])
= Somme(valeur[1] à valeur[j])
- Somme(valeur[1] à valeur[i - 1])
En posant:
cumul[0] = 0, et
cumul[i] = Somme(valeur[1] à valeur[i]), pour 1<=i<=N,
on a aussi:
cumul[i] = cumul[i-1] + valeur[i]
Le vecteur cumul est calculable en une seule passe comptant N additions en tout pour un tableau de valeurs de longueur N.
On obtient alors:
Somme(valeur[i] à valeur[j]) = cumul[j] - cumul[i - 1]
Cette somme est la différence de 2 cumuls déjà réalisés avant. Et il ne faut qu'une seule opération à chacune des fois.
Il y a encore des variantes, dans le cas où quelques éléments du tableau de valeurs ont pu changer: il suffit de garder la trace des valeurs qui ont été modifiées, en maintenant deux tables en parallèle du vecteur de valeurs: la table supplémentaire contient l'indice depuis lequel les cumuls ont été opérés totalement. On garde la trace des indices minimum et maximums pour lesquels les sommes ne sont plus valide car des valeurs ont été changées: à chaque changement, on enregistre la différence entre l'ancienne valeur et la nouvelle et lorsqu'on aura à faire à nouveau des sommes à bornes aléatoires, il suffit de regarder si ces bornes ont une intersection avec les valeurs modifiées. Si c'est le cas, on n'a qu'à recalculer uniquement les sommes progressives entre les bornesde l'intersection, en reportant la différence initiale aux extrémités de l'intersection, et en reportant les autres différences dans les cumuls progressifs.
[edit]--Message édité par verdy_p--[/edit]