> Après avoir vu le parcours séquentiel d'un tableau dans le but de trouver un élèment, on va pouvoir voir une méthode bien plus efficace dans le cas d'une liste triée, **la recherche dichotomique.** ### Le programme ![bo_dichotomique](assets/bo_dichotomique.png) ----------- ### Etymologie Le mot dichotomie vient du grec ancien $$ dikhotomia $$ qui signifie ***couper en deux*** ------------- ### Problème de base Supposons un tableau tab : ```python tab = [1,2,6,9,12,14,18,21,42] ``` Si on souhaite chercher un élèment, par exemple 7, en utilisant le [parcours séquentiel](PARCOURS.md) on fonctionne par balayage (avec une boucle for...) et donc parcourir la liste du début à la fin en colparant chaque valeur à l'élèment recherché. Ici par exemple, on effectuerait 9 comparaison pour finir par dire que non, 7 n'est pas présent. Dans le cas d'une liste **déjà triée**, la recherche dichotomique permet d'améliorer les performances. ----------- ### Principe - Si le tableau est vide, on renvoie False, la recherche est terminée. - Sinon, on trouve la valeur la plus *centrale* du tableau et on la compare avec l'élément recherché : - si la valeur est celle qu'on recherche, on renvoie True, la recherche est terminée. - si la valeur est plus petite que l'élèment recherché, on recommence la procédure avec la seconde moitié du tableau. - si la valeur est plus grande que l'élément recherché, on recommence avec la première moitié du tableau. ![dichotomie](assets/dichotomie.png) > Par Tushe2000 — Template:LoStrangolatore, Domaine public, https://commons.wikimedia.org/w/index.php?curid=39675138 Exercice : Montrer le nombre d'étapes nécessaires à la réussite de cette recherche. ------------- ### Complexité | Taille tableau | 0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | N | | ---------------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---------------- | | Recherche Séquentielle | 0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | N | | Recherche Dichotomique | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | log2N | - Quel est le pire des cas ici ? Que l'élèment recherché ne soit pas dans le tableau. - Le nombre de tours de boucle de la recherche dichotomique est de l'ordrede log2(n) où *n* est la taille de la liste. *Explications* Qu'est ce que le ***Logarithme***: pour faire simple, le logarithme en base n - écrit logn correspond au nombre de division par n successive pour arriver au nombre 0. ***Exemple :*** Soit un tableau de taille 𝑛. Si on « coupe » ce tableau en deux parts égales, cela revient à diviser 𝑛 par deux à chaque itération :