Adloun

NSI (première) · Chapitre 7 · Exercice de TD

Écrire minimum et maximum(t) en un seul parcours, renvoyant un couple

Parcourir, trier, prouver · Parcourir et prouver · niveau 3 (difficile)

Énoncé

Écrire minimum_et_maximum(t) en un seul parcours, renvoyant un couple. Combien de comparaisons effectue-t-elle ? Peut-on faire mieux que ?

Corrigé


def minimum_et_maximum(t):
    """Couple (plus petit, plus grand) en un seul parcours.

    Précondition  : t est non vide.
    Postcondition : mini <= x <= maxi pour tout x de t, et mini et maxi
                    appartiennent tous deux à t.
    """
    assert len(t) > 0, "tableau vide"
    mini = maxi = t[0]
    for i in range(1, len(t)):
        if t[i] < mini:
            mini = t[i]
        else:
            if t[i] > maxi:
                maxi = t[i]
    return mini, maxi

L'invariant tient en une phrase : avant le tour , mini et maxi sont le plus petit et le plus grand élément de t[0..i-1]. L'initialisation à t[0] — et non à une constante — est ce qui rend l'invariant vrai au départ, et c'est l'avertissement du cours.

Le décompte. Le else est essentiel : si t[i] est plus petit que le minimum, il ne peut pas être plus grand que le maximum, et la seconde comparaison est inutile. Le coût dépend donc du contenu :

  • pire cas — tableau croissant : la première comparaison est toujours fausse, on paie les deux à chaque tour, soit . Mesuré sur croissant : 198 comparaisons, et ;
  • meilleur cas — tableau décroissant : une seule comparaison par tour, soit . Mesuré : 99.

Peut-on faire mieux ? Oui : . On traite les éléments par paires. Une comparaison range les deux membres de la paire ; le plus petit ne peut alors concourir que pour le minimum, le plus grand que pour le maximum. Trois comparaisons par paire, soit par élément, au lieu de .

un par unpar paires

Les deux versions ont été comparées sur tableaux tirés au hasard : elles rendent toujours le même couple, et le même que (min(t), max(t)).

Ce que cela vaut, honnêtement. On passe de à : le gain est d'un quart, il ne change pas la loi — les deux restent linéaires. On peut démontrer qu'aucun algorithme ne descend sous comparaisons ; c'est donc l'optimum, et c'est un résultat de terminale.

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →