Algo Dichotomie

Identification

Infoforall

Animation de la recherche dichotomique


Cette page présente une animation permettant de comprendre le principe de la recherche par dichotomie.

L'algorithme de recherche est sous l'animation.

1 - Animation

On notera que le tableau doit être trié de façon croissante.

Valeur cherchée :

Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
Elément 06 08 09 13 18 37 37 59 60 60 61 68 70 80 80 83 83 89 91 96

2 - Algorithme

Algorithme de recherche dichotomique

But : fournir l'indice de la première occurrence trouvée d'un élément x dans un tableau t. La valeur de réponse de -1 indique l'absence de x dans le tableau.

Description des entrées / sortie

  • ENTREES :
    • x : un élément voulu qu'on tente de rechercher dans le tableau
    • t : un tableau trié contenant un ensemble d'éléments.
      • PRECONDITON : le tableau est trié en ordre croissant.
    • (entrée optionnelle selon le langage d'implémentation) longueur : le nombre d'éléments dans le tableau
  • SORTIE : un entier correspondant à un indice i du tableau tel que t[i] contient bien x, ou la réponse vide (-1 par exemple).
t  ⇒   RECHERCHER   ⇒ 
et indice ou "vide"
x

Algorithme

Dans l'algorithme ci-dessous, l'opérateur // désigne une division euclidienne.

    r ← -1

    g ← 0

    dlongueur - 1

    TANT QUE (g <= d) ET (r vaut -1)

      c ← (g + d) // 2

      SI t[c] < x

        on modifie g pour "supprimer" la partie gauche

        g ← (c + 1)

      SINON SI t[c] > x

        on modifie d pour "supprimer" la partie droite

        d ← (c - 1)

      SINON

        x est l'élément de t[c] : on sort du TANT QUE en modifiant r

        rc

      Fin du Si

    Fin Tant que

    Renvoyer c

3 - Implémentation Python

Supprimer le print() de la ligne 16 (ou 15 sur la version 2) si vous ne voulez pas de description progressive du déroulement.

Deux versions :

  • La première avec juste un seul return, plus propre algorithmiquement.
  • La deuxième plus simple mais comportant deux return
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
def recherche_dicho(t, x): '''Fonction qui cherche l'élément x dans le tableau trié de façon dichotomique :: param t(list) :: un tableau trié d'éléments :: param x (variable) :: l'élément à chercher dans le tableau :: return (int) :: l'indice de l'élément ou -1 .. Précondition 1 :: le tableau ne doit pas être vide .. Précondition 2 :: le tableau doit être TRIE de façon croissante .. Précondition 3 :: x doit être du même type que les éléments du tableau ''' r = -1 g = 0 d = len(t) - 1 while g <= d and r == -1: print(f"Un tour de boucle avec l'intervalle [{g}; {d}]") c = (g + d) // 2 # Division entière if t[c] < x: g = c + 1 elif t[c] > x: d = c - 1 else: r = c return r
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
def recherche_dicho(tableau, x): '''Fonction qui cherche l'élément x dans le tableau trié de façon dichotomique :: param t(list) :: un tableau trié d'éléments :: param x (variable) :: l'élément à chercher dans le tableau :: return (int) :: l'indice de l'élément ou -1 .. Précondition 1 :: le tableau ne doit pas être vide .. Précondition 2 :: le tableau doit être TRIE de façon croissante .. Précondition 3 :: x doit être du même type que les éléments du tableau ''' g = 0 d = len(tableau) - 1 while g <= d: print(f"Un tour de boucle avec l'intervalle [{g}; {d}]") c = (g + d) // 2 # Division entière if tableau[c] < x: g = c + 1 elif tableau[c] > x: d = c - 1 else: return c return -1

Article publié le 11 04 2020
Dernière modification : 13 04 2020
Auteur : ows. h.