TP Python Recherche dichotomique dans un tableau trié

publicité
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
Téléchargement