Adloun

Où insérer dans une liste triée

Exercice d'entraînement · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Dichotomie et approximation numérique

Énoncé

Écrire position(L, x) qui, pour une liste L triée par ordre croissant, renvoie par dichotomie l'indice où insérer x afin que la liste reste triée. Tester sur un x plus petit que tous les éléments, puis plus grand que tous.

Corrigé

Le code.

def position(L, x):
    # L est TRIEE ; renvoie l'indice d'insertion de x
    a, b = 0, len(L)          # b vaut len(L), pas len(L) - 1
    while a < b:
        m = (a + b) // 2
        if L[m] < x:
            a = m + 1         # x va strictement a droite de m
        else:
            b = m             # x peut aller en m, ou avant
    return a

L = [2, 5, 5, 8, 13]
print(position(L, 6))     # 3
print(position(L, 0))     # 0   plus petit que tous
print(position(L, 20))    # 5   plus grand que tous
print(position(L, 5))     # 1   devant les 5 deja presents

Ce que l'invariant garantit. À chaque tour, l'indice cherché est dans : tout élément d'indice est strictement inférieur à x, et tout élément d'indice est supérieur ou égal à x. Les deux affectations préservent cette propriété — c'est pourquoi b = m et non b = m - 1 : l'indice m reste candidat quand L[m] &gt;= x.

Terminaison. À chaque tour, diminue strictement. En effet , donc l'affectation a = m + 1 fait croître , et b = m fait décroître . La boucle s'arrête donc, après environ tours.

Les cas extrêmes, à tester systématiquement. Pour x = 0, la condition L[m] &lt; x n'est jamais vraie, b descend jusqu'à et la fonction rend — insertion en tête. Pour x = 20, la condition est toujours vraie, a monte jusqu'à len(L) — insertion en queue. C'est parce que b est initialisé à len(L) et non à len(L) - 1 que ce second cas fonctionne : sinon l'indice serait inatteignable, et l'insertion en queue impossible.

Les doublons. Avec L[m] &lt; x (inégalité stricte), l'indice rendu est celui de la première occurrence de x s'il y en a. Avec L[m] &lt;= x on obtiendrait la position après la dernière. Les deux conventions sont défendables, mais il faut savoir laquelle on programme.

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.