Vous êtes sur la page 1sur 2

NSI – Algorithme ALG05

ALG 06 Algorithme de recherche dichotomique


Fortement des cours de David Roche – pixees.fr

Lien DOCSHARE pour question 05 : link.dgpad.net/d5A3

I- Qu'est-ce que la dichotomie ?


Le but est de rechercher si un entier est élément d'un tableau.
Nous avons déjà vu un algorithme de recherche d'un entier dans un tableau (cf ALG01 et ALG02). Nous
avions trouvé (dans le pire des cas) une complexité O(n). En effet, on est obligé de parcourir l'ensemble du
tableau pour vérifier la présence d'un entier x. Mais si le tableau est trié, cela change tout …
L'algorithme par dichotomie consiste à comparer la valeur cherchée avec la valeur placée au milieu du
tableau et de continuer à chercher dans la partie inférieure au milieu ou supérieure au milieu en
fonction de la comparaison. Ceci n'est possible que si le tableau est trié.
Ce sera plus clair avec l'algorithme de recherche par dichotomie et son étude.

II- Algorithme de recherche dichotomique de la présence d'un entier


dans un tableau t = [5,7,12,14,23,27,35,40,41,45] et x = 35
1) L'algorithme
tr=FAUX
VARIABLE deb=0
t : tableau d'entiers trié fin=9 (car longueur(t)=10)
mil : nombre entier tr=FAUX et deb=0≤fin=9  on entre dans la boucle
fin : nombre entier mil = 4 (car (deb+fin)/2 = (0+9)/2 = 4.5)
t[mil]=t[4]=23  x=35 on n'entre pas dans le Si n°1
deb : nombre entier
x=35>t[mil]=t[4]=23  on entre dans le Si n°2
x : nombre entier // x : l'entier recherché deb=5 (car debmil+1)
tr : booléen retour au début de la boucle
DEBUT
tr  FAUX tr = FAUX et deb=5 et fin=9
deb  0 tr=FAUX et deb=5≤fin=9  on entre dans la boucle
fin  longueur(t)-1 mil = 7 (car (deb+fin)/2 = (5+9)/2 = 7)
tant que tr == FAUX et que deb ≤ fin : t[mil]=t[7]=40  x=35 on n'entre pas dans le Si n°1
x=35<t[mil]=t[7]=40  on n'entre pas dans le Si n°2
mil  partie_entière((deb+fin)/2) fin= 6(car finmil–1)
si t[mil] == x : // si n°1 retour au début de la boucle
tr = VRAI
sinon :
tr = FAUX et deb=5 et fin=6
si x > t[mil] : // si n°2 tr=FAUX et deb=5≤fin=6  on entre dans la boucle
deb  mil+1 mil = 5 (car (deb+fin)/2 = (5+6)/2 = 5.5)
sinon : [mil]=t[5]=27  x=35 on n'entre pas dans le Si n°1
fin  mil-1 x=35>t[mil]=t[5]=27  on entre dans le Si n°2
fin si deb=6 (car debmil+1)
retour au début de la boucle
fin si
fin tant que
renvoyer la valeur de tr tr = FAUX et deb=6 et fin=6
tr=FAUX et deb=6≤fin=6  on entre dans la boucle
FIN mil = 6 (car (deb+fin)/2 = (6+6)/2 = 6)
[mil]=t[6]=35 = x=35 on entre dans le Si n°1
tr=VRAI
2) Faire tourner l'algorithme à la main …. retour au début de la boucle
Faisons tourner l'algorithme à la main de la
recherche dichotomique de l'entier x = 35 dans le tr = VRAI et deb=6 et fin=6
tr=VRAI et deb=6≤fin=6  on n'entre pas dans la boucle
tableau t = [5,7,12,14,23,27,35,40,41,45]. renvoyer VRAI

Exo01 : Reproduire la même analyse que le 2) avec t = [5,7,12,14,23,27,35,40,41,45] et x= 9


NSI – Algorithme ALG05
3) Principe de fonctionnement de l'algorithme de recherche dichotomique
Il est possible de représenter le fonctionnement de 2 façons différentes

Exo02 : Représentez le principe de fonctionnement de l'algorithme de recherche dichotomique


pour t = [5,7,12,14,23,27,35,40,41,45] et x= 9 avec les 2 schémas *

Exo03 : Représentez le principe de fonctionnement de l'algorithme de recherche dichotomique


pour t = [5,7,12,14,23,27,35,40,41,45] et x= 40 avec le schéma de *

III- Complexité de l'algorithme de la recherche dichotomique


1) Que compter pour mesurer la complexité ?
Comme précédemment, nous nous intéresserons à la complexité en temps dans le pire des cas.
Le pire des cas pour un algorithme de recherche est que l'entier n'est pas dans le tableau.
Pour déterminer la complexité de l'algorithme de recherche dichotomique, nous allons nous
intéresser au nombre d'itération de la boucle pour un tableau de taille n Nb éléments Nb de boucles
dans le tableau parcourues
2) Exemple 1 0
Exo04 : 3 2
Complétez le tableau ci–contre dans le cas le plus défavorable (à déterminer) 5
10
3) Généralisation et ordre de la complexité : 20
Comme le tableau est divisé par 2 à chaque itération, il faut se demander combien de fois faut-il
diviser le tableau en 2 pour obtenir, à la fin, un tableau comportant un seul entier ?
Autrement dit, combien de fois faut-il diviser n par 2 pour obtenir 1 ?
n
Mathématiquement cela se traduit par : =1 et il faut trouver x …
2x
Pour résoudre ce type d'équation, il faut connaitre une fonction particulière : "logarithme base 2",
notée log2. C'est la fonction réciproque de la fonction "puissance de 2".
On a donc, par définition log2(2x) = x
Nous avons donc :
n
=1  n = 2x  log2(n) = log2(2x) = x donc x = log2(n)
2x
L'ordre de la complexité est donc O(log2(n)) (complexité logarithmique)
Exo05* : Implémenter l'algorithme en Python dans la fonction dichotomie(nb,tab)et mesurer
une estimation de la complexité temporelle de l'algorithme

Exo06 : Complétez le programme Python donné pour tracer les fonctions mathématiques f 1(x) =
x2, f2(x) = x et f3(x) = log2(x).
En déduire le classement des complexités de la plus efficace à la moins efficace :
 complexité quadratique (modélisée par la fonction f 1),
 complexité linéaire (modélisée par la fonction f 2),
 complexité logarithmique (modélisée par f 3)

Vous aimerez peut-être aussi