algorithmique (école d'ingénieur) · Chapitre 10 · Application directe du cours
Sommes préfixes
Complexité des programmes · niveau 1 (application)
Énoncé
Étant donné un tableau , on veut le tableau de terme général (somme du -préfixe).
- Un premier programme calcule chaque par une boucle sur . Combien d'additions fait-il ? Quelle est sa complexité ?
- Écrire un programme en , en remarquant que .
- À quoi servent ces sommes ? Montrer qu'avec , la somme de n'importe quel sous-tableau se calcule en temps constant.
Corrigé
- Le calcul de fait additions, d'où additions : .
- On calcule les par croissants, chacun à partir du précédent :
static int[] sommesPrefixes(int[] T) { int n = T.length;
int[] S = new int[n + 1]; // S[0] = 0 : somme du 0-préfixe
for (int k = 0; k < n; k++) // S[0:k+1] est calculé
S[k + 1] = S[k] + T[k]; // somme de T[0:k+1]
return S; // S[0:n+1] est calculé
}
Exactement additions : . Sur :
naif : [0, 3, 2, 6, 7, 2, 11] additions = 21
lineaire : [0, 3, 2, 6, 7, 2, 11] additions = 6
n = 1000 : naif 500500 additions, lineaire 1000 additions
n = 10000 : naif 50005000 additions, lineaire 10000 additions
nom : S
valeurs : 0 3 2 6 7 2 11
fleches : 0->1:+3 1->2:-1 2->3:+4 3->4:+1 4->5:-5 5->6:+9
legende : S[k+1] = S[k] + T[k] : une addition par case
- : une soustraction. Après un précalcul en , chaque somme de sous-tableau coûte un temps constant. C'est une petite programmation dynamique : la récurrence évite de recalculer les sommes des préfixes.
nom : T
valeurs : 3 -1 4 1 -5 9
vert : 1..3
zone : 1..3 somme 4
legende : T[1] + T[2] + T[3] = S[4] - S[1] = 7 - 3 = 4100 % gratuit
La suite du chapitre est sur Adloun
- 11 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.