Numérique et sciences informatiques

Algorithme de dichotomie

Un algorithme de recherche d'un élément dans une liste triée.

La recherche d'un objet dans une liste ( dictionnaires, annuaires, moteur de recherche.....)

Le principe utilisé est la dichotomie .

Soit une liste de n objets classés. On recherche un objet en particulier.

--> On choisit dans la liste l'objet médian.

--> On compare les deux objets.

--> Si on a trouvé alors c'est fini.

--> Si l'objet recherché est placé avant l'objet choisi alors on recommence avec cette partie de la liste.

--> Si l'objet recherché est placé après l'objet choisi alors on recommence avec cette partie de la liste.

--> Au bout d'un certain nombre d'essais (cela se calcule) soit on a trouvé l'objet soit il n'est pas dans la liste.

Ce principe est utilisé aussi bien en mathématiques (pour rechercher une approximation de solution d'une équation) que pour trouver un mot dans un dictionnaire.

Voici cet algorithme sous forme d'une fonction.

On suppose que tab est un tableau de mots classés.

et que l'on recherche le mot contenu dans x.

Cette fonction renvoie un booléen.

Vrai si le mot est dans la liste

Faux s'il n'y est pas

1
tableau est une liste triée de longueur n
2
fonction recherche(tableau,x)
3
  i=0 et j=n-1
4
  tant que i<=j
5
    si tableau[(i+j)//2]==x
6
       retourner Vrai
7
    sinon 
8
       si tableau[(i+j)//2]>x
9
             j=(i+j)//2-1
10
       sinon
11
             i=(i+j)//2+1
12
   retourner Faux

Il y a beaucoup d'autres algorithmes de recherche et la plupart d'entre eux sont des améliorations de celui-ci.

Ce qui compte c'est le temps d'exécution.

Imaginons un annuaire qui contienne les noms, prénoms, adresses.....des 7 milliards d'êtres humains vivant sur la terre.

Quel est le nombre maximum d'itérations pour trouver un individu ?

Comme à chaque itération on divise le nombre de personne par 2, et, en supposant que la personne cherchée est la 1ère ou la dernière. La question revient à :

Combien de fois faut-il que je divise 7 milliards par 2 pour qu'il n'en reste qu'un ?

Soit à résoudre l'équation : dont la solution est : . Soit au maximum 33 itérations !

Un algorithme qui balaye la liste du début à la fin aurait fait 1 itération pour la première personne et 7 milliards d'itérations pour la dernière ! !

MéthodeExemple

Commençons par réaliser un programme de recherche par dichotomie d'un entier dans une liste triée qui compte le nombre de comparaison.

On travaillera avec EduPython.

Initialisation de la liste :

1
liste=[]
2
for i in range(1,101,1):
3
    liste.append(i)

La fonction recherche dichotomique :

  • Avec des paramètres

  • Un compteur ( qui compte le nombre de comparaisons)

  • Dont le résultat est un tuples (Vrai/Faux, compteur )

1
#fonction de recherche dichotomique
2
def recherche(liste,x):
3
    i=0
4
    j=len(liste)-1
5
    c=0 #compteur
6
    while i<=j:
7
        if liste[(i+j)//2]==x:
8
            c=c+1
9
            return (True,c)
10
        else:
11
            if liste[(i+j)//2]>x:
12
                j=(i+j)//2-1
13
                c=c+1
14
            else:
15
                i=(i+j)//2+1
16
                c=c+1
17
    return (False,c)

La recherche se fait sur l'entrée faite par l’utilisateur

1
# Demande d'entrée
2
x=int(input("Entrez un entier entre 1 et "+str(len(liste))))
3
4
#Appel de la fonction recherche
5
resultat=recherche(liste,x)
6
print(resultat)

Faites fonctionner ce programme en essayant différentes valeurs de x et différentes tailles de liste

SimulationUn Jeu

Concevoir un programme qui illustre la situation suivante :

Stéphane (S) propose à Patrice (P) le jeu suivant :

"choisis en secret un nombre compris entre 0 et 100; je vais essayer de le deviner le plus rapidement possible, en ne pouvant que te poser des questions auxquelles tu réponds par oui ou par non ".

Deux cas sont envisageables :

  • Stéphane dans le rôle de l'ordinateur

  • Patrice dans le rôle de l'ordinateur

MéthodeCorrigés

Le cas où c'est l'ordinateur qui cherche :

1
# Créé par vstep, le 23/02/2019 en Python 3.4
2
# c'est l'ordinateur qui cherche
3
# x nombre à trouver pensé par l'utilisateur
4
5
def recherche(x):
6
    k=True
7
    a=0
8
    b=100
9
    c=0 #compteur
10
    while k==True:
11
        test=input("Le nombre est il égal à :" +str((a+b)//2)+" ?\n :Répondre par 'o' ou 'n'")
12
        c=c+1
13
        if test=='o':
14
            return ((a+b)//2 ,c)
15
            k=False
16
        else:
17
            test=input("le nombre inconnu est-il plus grand que " + str((a+b)//2)+"?\n : Répondre par 'o' / 'n' ")
18
            if test=="o":
19
                a=(a+b)//2+1
20
21
            else:
22
                b=(a+b)//2-1
23
24
25
resul=recherche(26)
26
print("le nombre cherché est " +str(resul[0])+" trouvé en "+str(resul[1])+" coups")
27
print(resul)
28

Le cas ou c'est l'utilisateur qui cherche

1
# Créé par vstep, le 23/02/2019 en Python 3.4
2
# l'utilisateur est celui qui cherche
3
# c'est l'utilisateur qui cherche
4
from random import*
5
n=randint(0,100)
6
app=" "
7
var=input("Entrez un nombre")
8
var=int(var)
9
10
while True:
11
    if var<n:
12
        print(str(var)+ " : Trop bas")
13
        var=input("Entrez un nombre")
14
        var=int(var)
15
    else:
16
        print(str(var)+ " : Trop haut")
17
        var=input("Entrez un nombre")
18
        var=int(var)
19
    if var==n:
20
        print("Bravo")
21
        break
22
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Stéphan Van Zuijlen Licence de documentation libre GNURéalisé avec Scenari (nouvelle fenêtre)