Adloun

La dichotomie est logarithmique

Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 8 — Dichotomie, voisins et gloutons · Aux frontières

Énoncé

La dichotomie est logarithmique ; un ensemble (set) donne un accès direct. Comparer les deux sur recherches, dans un tableau de mille puis d'un million d'éléments. Le rapport est-il celui qu'on attendait ?

Corrigé


def comparer(n, essais=20000):
    t = list(range(n))
    cibles = [random.randrange(n) for _ in range(essais)]

    t0 = time.perf_counter()
    for v in cibles:
        dichotomie(t, v)
    t_dicho = time.perf_counter() - t0

    ens = set(t)
    t0 = time.perf_counter()
    for v in cibles:
        v in ens
    t_ens = time.perf_counter() - t0
    return t_dicho, t_ens
dichotomieensemblerapport
s s
s s

Deux lectures, et elles vont dans des sens opposés. D'un côté, la dichotomie tient remarquablement bien : multiplier la taille par mille ne multiplie son temps que par trois — c'est le logarithme, qui passe de à tours, plus le coût des accès en mémoire. De l'autre, elle reste vingt à trente fois plus lente que l'ensemble, à toutes les tailles.

Pourquoi la comparaison n'est pas déloyale mais reste incomplète. L'ensemble ne répond qu'à « est-ce là ? » ; la dichotomie donne la position, permet de chercher le voisin le plus proche, le rang d'insertion, un intervalle de valeurs — toutes choses qu'une table de hachage ne sait pas faire, puisqu'elle a perdu l'ordre. Comparer deux structures sur la seule opération qu'elles ont en commun donne un chiffre exact et une conclusion fausse.

Une précaution de mesure, encore. Le temps de construction de l'ensemble n'est pas compté ici, pas plus que celui du tri qu'exige la dichotomie. Sur une seule recherche, ces coûts d'installation dominent tout le reste — c'est le raisonnement du cours sur « trier d'abord, est-ce rentable ? », et il faut le refaire à chaque fois.

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.