Adloun

Écrire sans doublons(t) , qui renvoie les éléments de t sans…

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 4 — Les types construits · Tableaux, compréhensions et coût

Énoncé

Écrire sans_doublons(t), qui renvoie les éléments de t sans répétition, dans l'ordre de première apparition. Écrire deux assertions qui, ensemble, caractérisent le résultat. Quel est le coût de cette fonction ?

Corrigé


def sans_doublons(t):
    """Elements de t sans repetition, dans l'ordre de premiere apparition.

    Postcondition : chaque element de t figure exactement une fois dans le
                    resultat, et le resultat ne contient rien d'autre.
    """
    r = []
    for x in t:
        if x not in r:
            r.append(x)
    return r

Les deux assertions qui caractérisent. Une seule ne suffit jamais :


r = sans_doublons(t)
assert all(x in t for x in r)          # rien d'invente
assert all(x in r for x in t)          # rien d'oublie
assert len(r) == len(sans_doublons(r)) # aucun doublon ne subsiste

La première seule serait vérifiée par la fonction qui rend toujours [] ; la deuxième seule, par la fonction identité. Ensemble, elles disent l'égalité des ensembles ; la troisième ajoute l'absence de répétition.

Vérification.


assert sans_doublons([3, 1, 3, 2, 1]) == [3, 1, 2]
assert sans_doublons([]) == [] and sans_doublons([5, 5, 5]) == [5]

for _ in range(1000):
    t = [random.randint(0, 5) for _ in range(random.randint(0, 12))]
    r = sans_doublons(t)
    assert len(r) == len(set(t))
    assert all(x in t for x in r) and len(r) == len(sans_doublons(r))

Les cas passent.

Le coût. La ligne if x not in r n'est pas gratuite : elle parcourt r jusqu'à trouver ou épuiser. Si le tableau contient valeurs toutes distinctes, le -ième tour compare contre éléments, et le total vaut comparaisons : le coût croît comme le carré de .

L'ordre de première apparition est ce qui coûte cher. Si l'on y renonce, set(t) donne le même contenu à coût presque proportionnel à — grâce au mécanisme d'accès direct du chapitre 5. Une contrainte qui paraît anodine dans l'énoncé peut décider du coût de l'algorithme.

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.