Adloun

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.