Le module bisect fournit la dichotomie de la bibliothèque standard
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 8 — Dichotomie, voisins et gloutons · Les outils, et ce qu'ils coûtent
Énoncé
Le module bisect fournit la dichotomie de la bibliothèque standard. Comparer bisect_left et bisect_right à rang_insertion, et essayer insort.
Corrigé
import bisect
t = [1, 3, 5, 7, 9]
assert bisect.bisect_left(t, 5) == 2 # AVANT l'occurrence existante
assert bisect.bisect_right(t, 5) == 3 # APRES
assert bisect.bisect_left(t, 4) == 2 # identiques si la valeur est absente
for _ in range(2000):
t = sorted(random.randint(0, 20) for _ in range(random.randint(0, 10)))
v = random.randint(-1, 21)
assert bisect.bisect_left(t, v) == rang_insertion(t, v)
liste = []
for v in [5, 1, 9, 3]:
bisect.insort(liste, v)
assert liste == [1, 3, 5, 9]
**Notre rang_insertion est bisect_left** : deux mille tirages le confirment, doublons compris. Les deux variantes de la bibliothèque correspondent exactement aux deux décisions possibles sur les égalités — celles qu'un exercice de TD a obligé à trancher.
Un piège de insort. La recherche du point d'insertion est logarithmique, mais l'insertion elle-même décale tous les éléments suivants : elle est linéaire. Maintenir une liste triée par mille insertions ne coûte donc pas mille fois , mais bien davantage. C'est l'objet de l'exercice suivant.
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.