Les sommes cumulées, et les requêtes en temps constant
Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Parcours de listes et coût
Énoncé
Écrire cumul(L) renvoyant la liste telle que , puis somme_tranche(C, i, j) qui rend sans boucle. Justifier la formule et comparer le coût de requêtes avec et sans prétraitement.
Corrigé
Le code.
def cumul(L):
C = []
total = 0
for x in L:
total = total + x
C.append(total)
return C
def somme_tranche(C, i, j):
# somme des L[i] a L[j] inclus, en temps constant
if i == 0:
return C[j]
return C[j] - C[i - 1]
L = [3, 1, 4, 1, 5, 9, 2, 6]
C = cumul(L)
print(C) # [3, 4, 8, 9, 14, 23, 25, 31]
print(somme_tranche(C, 2, 5)) # 4 + 1 + 5 + 9 = 19
La formule. Par construction, et . En soustrayant, tous les termes d'indice inférieur à se compensent :
C'est un télescopage, le même mécanisme que celui des séries : une somme de tranche s'obtient comme différence de deux sommes depuis le début.
Le cas est à traiter à part. L'indice vaudrait alors , et en Python C[-1] désigne le dernier élément de la liste : la fonction renverrait , un résultat faux, souvent négatif, et sans le moindre message d'erreur. C'est le piège de cet exercice.
Vérification sur l'exemple. , et . ✔
Le coût. Sans prétraitement, chaque requête demande de parcourir la tranche, soit jusqu'à additions ; requêtes coûtent donc de l'ordre de opérations. Avec le prétraitement, on paie opérations une fois, puis chaque requête coûte une soustraction : total de l'ordre de .
Sur et , cela fait opérations contre : plusieurs minutes contre une fraction de seconde. C'est le principe du prétraitement — investir un parcours pour rendre les interrogations suivantes immédiates.
À noter. La bibliothèque numpy propose np.cumsum(L), qui produit exactement la liste . La programmer soi-même une fois éclaire ce qu'elle fait ; l'utiliser ensuite est parfaitement légitime.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.