Vous êtes sur la page 1sur 4

Recherche dichotomique.

Soit un vecteur A de dimension N dans lequel nous devons rechercher la position d'un lment y
apparaissant ventuellment.
La mthode la plus rudimentaire consiste passer tous les lments du tableau en revue en
commenant par le premier et en s'arrtant lorsque l'lment est trouv ou lorsque le dernier
lment est atteint: il s'agit d'une recherche squentielle.
Ce type de recherche impose un nombre de tests compris entre 1 (si l'lment recherch est en
1re position) et N (si l'lment recherch est en dernire position), pour une moyenne de
(1+2+...+N)/N = [(1+N)N/2]/N = (1+N)/2 tests.

Lorsque l'information contenue dans le tableau n'est pas trie ou trie suivant un critre qu'il n'est
pas possible d'exploiter, cette recherche est la seule possible mais si le tableau est tri sur un
critre exploitable, nous allons pouvoir diminuer notablement le nombre d'oprations effectuer
par une recherche dichotomique.

Imaginons que nous devions trouver le nombre 4 dans le tableau tri ci-dessous:

1 2 3 4 5 6 7 8 9 10 11
1 3 3 5 7 8 8 8 9 9 10
Si nous comparons le nombre chercher l'lment (en rouge) se trouvant au milieu du tableau
(dont les extrmits sont marques par un lment en jaune et un lment en mauve), nous
constatons qu'il doit se trouver (s'il est dans le tableau) dans la partie se trouvant devant l'lment
en rouge. Et nous pouvons mme prciser qu'il doit se trouver entre les positions 1 (marque en
jaune) et 5 (qui sera marque en mauve) (puisqu'il n'est pas en position 6).
1 2 3 4 5 6 7 8 9 10 11
1 3 3 5 7 8 8 8 9 9 10
Si nous comparons le nombre chercher l'lment se trouvant au milieu de la partie du tableau
dont les limites sont indiques par les nombres en jaune et mauve, nous constatons qu'il doit se
trouver (s'il est dans le tableau) dans la 2me partie (celle se trouvant aprs l'lment en rouge).
Et nous pouvons mme prciser qu'il doit se trouver entre les positions 4 (qui sera marque en
jaune) (puisqu'il n'est pas en position 3) et 5 (marque en mauve).
1 2 3 4 5 6 7 8 9 10 11
1 3 3 5 7 8 8 8 9 9 10
Si nous comparons le nombre chercher l'lment (en rouge) se trouvant au milieu de la partie
du tableau dont les limites sont indiques par les nombres en jaune et mauve, nous constatons
qu'il doit se trouver (s'il est dans le tableau) dans la 1re partie (celle se trouvant avant l'lment
en rouge). Et nous pouvons mme prciser qu'il doit se trouver entre les positions 3 (marque en
jaune) et 3 (puisqu'il n'est pas en position 4) (qui sera marque en mauve).
1 2 3 4 5 6 7 8 9 10 11
1 3 3 5 7 8 8 8 9 9 10
Si nous comparons le nombre chercher l'lment (en rouge) se trouvant au milieu de la partie
du tableau dont les limites sont indiques par les nombres en jaune et mauve, nous constatons
qu'il ne s'y trouve pas et que nous sommes arrivs la conclusion que 4 ne se trouve pas dans le
tableau.

Nous pouvons constater qu' la premire tape, nous devions prendre le milieur d'un tableau de
N lments, l'tape suivante le milieu d'un tableau de N/2 lments, puis de N/4 lments, ...
Dans le plus mauvais des cas, la recherche s'arrte quand le nombre d'lments est rduit 1 et
donc quand N/2k<=1 ou quand N<=2k c'est--dire quand k est le plus petit entier>=log2N.
Pour 1024 lments, nous nous en tirerons donc avec un maximum de 10 tapes, rapprocher
des 1024 tapes de la recherche squentielle!

Voici l'algorithme en pseudo-code. Il comprend une 2me partie pour rechercher si l'lment
cherch apparat plusieurs fois. Il serait plus intressant de recommencer une recherche
dichotomique pour trouver ces lments mais dans un but pdagogique, je demande mes
tudiants d'appliquer une recherche squentielle et ceci est donc la version que je leur demande.

Type Tabl = tableaui i=1,...,1000 de entier


fonction CreTabTri(N)
paramtre N: entier
valeur Tabl
Tabl: T
T1 RANDOM(3)
pour i de 2 N faire
Ti Ti-1 + RANDOM(3)
fpour
rsultat (T)

fonction Hasard(Min, Max)


paramtres: Min, Max: entier
valeur: entier
entier: tmp
tmp Min+RANDOM(Max-Min+1)
rsultat (tmp)

fonction Cherche(X, N, T)
paramtres: X, N: entier
T: Tabl
valeur: entier
entier: Min, Max, c, Tmp
Min 1
Max N
c (Min+Max)\2
tant que NOT ((Max-Min 1) ou (X=Tc)) faire
si X<Tc alors Max c
sinon Min c
fsi
c (Min+Max)\2
ftant
si X=Tc alors Tmp c
sinon Tmp 0
fsi
rsultat (Tmp)
entier: N, X, P
Tabl: Tab
N 100
Tab CreTabTri(N)
X Hasard(Tab1 ,TabN)
crire X
P Cherche(X, N, Tab)
si P=0 alors crire X,"n'a pas t trouv dans le tableau"
sinon crire X,"a t trouv en position", P, "dans le tableau"
fsi

ou si on cherche toutes les positions de X squentiellement:

procdure ChercheTous( X, N, T, Inf, Sup)


paramtres: X, N; Inf, Sup: entier
T: Tabl
entier: Min, Max, c, i
Min 1
Max N
c (Min+Max)\2
tant que NOT ((Max-Min 1) ou (X=Tc)) faire
si X<Tc alors Max c-1
sinon Min c+1
fsi
c (Min+Max)\2
ftant
si X=Tc alors i c
tant que NOT ((X Ti) ou (i=Min)) faire
i i-1
ftant
si X Ti alors Inf i+1
sinon Inf i
fsi
i c
tant que NOT ((X Ti) ou (i=Max)) faire
i i+1
ftant
si X Ti alors Sup i-1
sinon Sup i
fsi
sinon Min 0
Max 0
fsi
fproc

Cliquez ici pour charger le source et l'excutable en Delphi.


Dans cette version, la recherche se fait dans une liste de nombres que vous devez encoder dans
un Memo.

Page d'accueil.

Vous aimerez peut-être aussi