Recherche dichotomique#
La dichotomie est un mot d’origine greque qui signifie « diviser en deux ».
La recherche d’une valeur par dichotomie dans un tableau peut être facilitée si celui-ci est trié. Dans ce cas, on divise successivement le tableau en 2 jusqu’à atteindre la valeur cherchée.
L’algorithme#
Algorithme
L’algorithme de recherche dichotomique se fait dans un tableau trié. On définit plusieurs variables :
t
désigne un tableau triév
est la valeur cherchée dans le tableaudeb
,fin
etmil
sont les indices de position des valeurs dans le tableau.
deb = 0
fin = indice du dernier élement
tant que deb <= fin:
mil = (deb + fin)//2 (m est l'indice de la valeur médiane du tableau t)
si v < t[mil]:
fin = mil-1 #(v se trouve dans la première moitié du tableau t)
sinon si v > t[mil]:
deb = mil + 1 #(v se trouve dans la seconde moitié du tableau)
sinon: # (on a v = t[mil])
la valeur est trouvée et a pour indice mil
on sort de la boucle, la valeur n'est pas trouvée
Appliquons cet algorithme pour rechercher la valeur 12 dans le tableau trié t=[5, 9, 12, 14, 15, 16, 19, 20, 23, 25]
.
Première itération
deb = 0
etfin = 9
doncdeb < fin
, première itération de la boucle tant que ;on calcule la valeur de l’indice situé au milieu du tableau :
mil=(0+9)//2=4
;La valeur cherchée
12 < t[4] = 15
se situe dans le tableau entre les indicesdeb=0
etfin=mil-1=3
.
Deuxième itération
deb = 0
etfin = 3
doncdeb < fin
, deuxième itération de la boucle tant que;on calcule la valeur de l’indice situé entre les indices 0 et 3 :
mil = (0+3)//2 = 1
;La valeur cherchée
12 > t[1] = 9
se situe dans le tableau entre les indicesdeb = mil+1 = 2
etfin = 3
.
Troisième itération
deb = 2
etfin = 3
doncdeb < fin
, troisième itération de la boucle tant que;on calcule la valeur de l’indice situé entre les indices 2 et 3 :
mil = (2+3)//2 = 2
;La valeur cherchée
12 = t[2]
donc la valeur est dans le tableau et a pour indice 2.
Terminaison de l’algorithme#
L’algorithme de recherche utilise une boucle. Comment être sûr que cette boucle se termine même si la valeur cherchée n’est pas dans le tableau ?
Définition
On appelle variant de boucle une quantité entière qui est positive ou nulle et décroit strictement à chaque itération.
Si on trouve une telle quantité dans une boucle, alors on est sûr que la boucle se termine.
Preuve de la terminaison
Dans l’algorithme de recherche par dichotomie, le test deb < fin
est équivalent au test fin - deb > 0
. Le nombre fin - deb
est un variant de boucle.
Le nombre
fin - deb
est strictement positif dans la bouclewhile
.Le nombre
fin - deb
décroît car à chaque itération. C’est soit l’indicedeb
qui augmente, soit l’indicefin
qui diminue.
En conclusion, le nombre fin - deb
est un variant de boucle positif qui décroit, assurant la terminaison de la boucle while
de l’algorithme de recherche par dichotomie.
Complexité de l’algorithme#
La recherche dichotomique s’applique sur un tableau trié de nombres. À chaque itération, la recherche se fait dans une partie du tableau dont la longueur est divisée par 2. Inévitablement, la longueur finit par être égale à 0.
Combien d’itérations faut-il pour obtenir une zone du tableau dont la longueur est 0 ?
Prenons en exemple un tableau trié contenant 50 valeurs. La zone de recherche est divisée en 2 à chaque itération ce qui donne des longueurs de 50, 25, 12, 6, 3, 1 et 0. On obtient une zone le longueur nulle en 6 itérations.
Du point de vue mathématique, on peut remarquer que \(2^{5} = 32 < 50\) et que \(2^{6} = 64 > 50\). Donc le nombre d’itérations correspond au plus petit exposant entier de 2 qui dépasse le nombre de valeurs dans le tableau.
Propriété
Le nombre d’itérations maximum pour chercher une valeur dans un tableau trié contenant n
valeurs est le nombre entier p
, premier exposant du nombre 2 tel que \(2^{p} \geqslant n\).
Le nombre p
est le logarithme du nombre n
en base 2 : \(p=\log_{2}(n)\)
Propriété
La complexité de l’algorithme de recherche dichotomique est logarithmique et se note \(O(\log_{2}(n))\).
Cette complexité est une complexité dans le pire des cas, c’est à dire lorsque le nombre cherché n’est pas dans le tableau.
La complexité logarithmique est plus efficace que la complexité linéaire : \(O(\log_{2}(n)) < O(n)\)
Par exemple, un tableau trié contient 200 nombres, en supposant le pire des cas, c’est à dire que le nombre cherché n’est pas dans le tableau, nécessite au moins 8 itérations car \(2^{8} = 256 > 200\).
Indication
On peut calculer le logarithme en base 2 d’un nombre en Python:
>>> from math import log2
>>> log2(200)
7.643856189774724
Ce résultat confirme qu’il faut 8 itérations pour montrer que le nombre cherché n’est pas dans le tableau.