Principe
diviser pour régnerOn compare la cible au milieu du segment. Selon le résultat, on élimine la moitié gauche ou droite et on recommence.
Les deux codes complets sont dans la section Les deux exemples Python ci-dessous.
Principe, complexité O(log n) et précondition de tri
On compare la cible au milieu du segment. Selon le résultat, on élimine la moitié gauche ou droite et on recommence.
Les deux codes complets sont dans la section Les deux exemples Python ci-dessous.
À chaque tour, la taille de l'intervalle est divisée par 2.
Beaucoup plus rapide que O(n) pour les grands tableaux triés.
Choix privilégié dès que le tri est disponible et n grand.
Pas utilisable dans tous les contextes.
Étape 1 : milieu index 4 → tab[4]=9 > 7 → garder gauche [0..3] Étape 2 : milieu index 1 → tab[1]=3 < 7 → garder droite [2..3] Étape 3 : milieu index 2 → tab[2]=5 < 7 → garder [3..3] Étape 4 : index 3 → tab[3]=7 trouvé
Appliquer la dichotomie sur un tableau non trié donne un résultat faux même si l'algorithme « tourne ».
Même objectif : retourner l'indice de la cible, ou -1 si absente. Compare les deux implémentations côte à côte.
Fonctionne sur un tableau non trié. On avance indice par indice.
def recherche_sequentielle(tab, cible):
for i in range(len(tab)):
if tab[i] == cible:
return i
return -1
# Tableau non trié possible
notes = [12, 15, 9, 18, 11]
print(recherche_sequentielle(notes, 18)) # 3
print(recherche_sequentielle(notes, 7)) # -1
Nécessite un tableau trié. On coupe l'intervalle en deux à chaque étape.
def dichotomie(tab, cible):
g, d = 0, len(tab) - 1
while g <= d:
m = (g + d) // 2
if tab[m] == cible:
return m
elif tab[m] < cible:
g = m + 1
else:
d = m - 1
return -1
# Tableau trié obligatoire
ages = [2, 5, 8, 12, 16, 21]
print(dichotomie(ages, 8)) # 2
print(dichotomie(ages, 10)) # -1