Les trois plus grandes, en un parcours
Exercice · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Parcours et boucles imbriquées
Énoncé
Écrire une fonction qui renvoie les trois plus grandes valeurs d'une liste en un seul parcours.
Corrigé
def trois_plus_grandes(L):
assert len(L) >= 3, "il faut au moins trois elements"
# m1 >= m2 >= m3 a tout moment
trois = sorted(L[:3], reverse=True)
m1, m2, m3 = trois[0], trois[1], trois[2]
for x in L[3:]:
if x > m1:
m1, m2, m3 = x, m1, m2
elif x > m2:
m2, m3 = x, m2
elif x > m3:
m3 = x
return m1, m2, m3
L'invariant est ce qui fait la correction : à chaque instant, sont les trois plus grandes valeurs déjà vues. Les trois cas de la cascade le maintiennent — et l'ordre des tests compte : tester x > m3 en premier casserait tout.
Le coût. Un seul parcours, trois comparaisons au plus par élément : . Trier la liste puis prendre les trois premières coûterait , et l'on paierait pour ordonner valeurs dont on n'a que faire.
Une nuance. Si la liste contient des doublons, cette fonction renvoie les trois plus grandes avec répétition : sur elle donne . Renvoyer trois valeurs distinctes serait un autre énoncé, et un autre code.
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.