TP Python Recherche dichotomique dans un tableau trié Recherche d’un entier dans un tableau trié par dichotomie Programme officiel Les méthodes de recherche précédentes étaient des méthodes séquentielles : on parcourt le tableau à partir du 1er élément jusqu’à trouver l’élément cherché. On conçoit donc que dans le cas de tableaux très grands (annuaire téléphonique…), la recherche peut être très longue. La méthode de recherche dichotomique relève du principe « diviser pour régner » : à chaque étape, on divise par 2 la taille du tableau dans lequel on effectue la recherche. Elle est donc beaucoup plus rapide que la recherche séquentielle. Inconvénient : elle nécessite un tableau trié (les algorithmes de tris sont au programme de seconde année). Néanmoins l’ensemble des deux opérations reste plus rapide qu’une recherche séquentielle. Résumé de l’algorithme de recherche dichotomique : à chaque étape, on compare l’entier cherché x à la valeur centrale du tableau M. Trois situations se présentent alors : 1) x = M : la recherche est terminée ; 2) x < M : la recherche doit se poursuivre dans la moitié gauche du tableau ; Bien réfléchir aux bornes 3) x > M : la recherche doit se poursuivre dans la moitié droite du tableau. de ces sous-tableaux On ne cherche pas ici à trier le tableau, il doit être fourni trié. Savoir-faire - Recherche d’un algorithme Grandeurs d’entrée de l’algorithme : la liste triée L et x l’élément cherché (L = [4, 5, 7, 25, 32, 50, 51, 60] et x = 51 dans l’exemple ci-dessous). Grandeurs de sortie de l’algorithme : position (index) de x si x est présent dans la liste (6 dans l’exemple ci-dessous) False sinon. Méthode : dichotomie = diviser pour régner Variables : g, d et m les index des extrémités et du milieu de la liste. Ces variables sont modifiées au cours de l’algorithme. Structure principale : boucle while car le nombre d’itérations est inconnu ⇒ critère d’arrêt ? → Observer l’évolution des variables g et d : quand la boucle doit-elle se terminer ? Remplir le tableau ci-dessous en indiquant les valeurs des index g, d, m (index de la valeur M) : x Liste triée L [ 4, 5, 7, 25, 32, 50, 51, 60 ] 0 1 2 3 4 5 6 7 Index Initialisation g= d= Boucle 1 Variables Boucle2 Boucle 3 Écrire l’algorithme détaillé en pseudo-code (français/informatique) : initialisations des variables de stockage (quelles valeurs doit-on mémoriser ?), la boucle principale avec ses tests, valeurs retournées. PCSI – IPT G. Monod TP_Recherche_dichotomique.docx 1/2 Cahier des charges Écrire une fonction rde(x,L) retournant la position de l’entier x dans le tableau trié d’entiers L (représenté par une liste) si x est présent et False sinon en utilisant la méthode de recherche dichotomique (rde = recherche dichotomique entier). La fonction ne sera pas récursive (programme de seconde année) : elle ne s’appelle pas elle-même. Savoir-faire - Tests Veiller à effectuer plusieurs tests de façon à vérifier que les cas particuliers sont correctement traités : élément absent de la liste, en tête de liste, en fin de liste. Évaluation expérimentale de la complexité temporelle de l’algorithme Écrire une fonction rdec(x,L) déduite de la fonction précédente mais comportant en plus un compteur de boucles et renvoyant en plus du résultat attendu, le nombre de boucles effectuées (return index, compteur). La fonction renvoie donc un tuple. Pour accéder à la valeur du compteur, on écrira donc une instruction de la forme rde(x,L)[1]. Taper le script ci-dessous en ajoutant des commentaires dans le code (derrière les symboles #), préciser quelles sont les courbes tracées (identifier abscisses et ordonnées) et compléter le code avec des chaînes de caractères à la place des points de suspension de façon à rendre le graphique compréhensible. import random as rd import matplotlib.pyplot as plt import numpy as np # L = range(1,10000,100) H = [rde(rd.randint(0,k-1), range(k))[1] for k in L] # # plt.xlabel('…') plt.ylabel('…') plt.plot(L,H, color='blue', label="…") plt.plot(L,np.log2(L), color='red', label="…") plt.legend(loc='best') plt.title("…") plt.show() # Ajouter la courbe correspondant à la complexité d’une recherche dichotomique effectuée sur le dernier élément d’une liste. Conclure quant à la complexité de l’algorithme (on pourra modifier légèrement l’instruction plt.plot(L,np.log2(L), color='red', label="…") afin de mettre en évidence un majorant du nombre de boucles. PCSI – IPT G. Monod TP_Recherche_dichotomique.docx 2/2