C7.6 : Complexité - TD 2
Algorithmes de recherche
Outils pour le TD
Dans ce TD on va réutiliser les outils de l'activité précédente :
- - Le module mathplolib pour tracer une courbe ;
- - La fonction
mesure_temps()pour mesurer le temps d'exécution d'un code.
Rappel de quelques algorithmes de recherche
1) Algorithme séquentiel
A faire : Écrire une fonction recherche_sequentielle(liste, nb) qui prend une liste d'entiers triée et un entier en paramètres, et renvoie la position de l'entier dans la liste (ou None si le nombre n'est pas dans la liste). On n'utilisera pas les méthodes de l'objet list (la fonction len() est autorisée).
2) Algorithme dichotomique
A faire : Écrire la fonction recherche_dichotomique(liste, nb) identique à la précédente, mais qui utilise l'algorithme de recherche par dichotomie.
Comparaison de la complexité des deux algorithmes
Détermination du coût par analyse du code
1) Par une analyse de code, estimer la complexité de chacun des deux algorithmes dans le pire cas et préciser si elle est de type \(n^2,\) \(n\) ou \(log_2(n)\).
Visualisation graphique du coût
1) Écrire une fonction liste_triee_aleatoire(n) qui prend un nombre entier n en paramètre et renvoie une liste triée de n entiers aléatoires compris entre 0 et 9999.
2) Coût de l'algorithme séquentiel.
2.a) Écrire une fonction qui prend un entier n en paramètre et renvoie le temps mis pour rechercher le nombre 10000 dans une liste triée de n nombres entiers compris entre 0 et 9999.
Remarque : on recherche volontairement le nombre 10000 pour avoir le pire cas.
2.b) Écrire le programme principal qui permet de visualiser l'évolution du coût de la recherche séquentielle.
2.c) Les hypothèses faites dans la question 1) sont-elles confirmées ?
3) Coût de l'algorithme dichotomique.
Reprendre les questions a, b et c précédentes en les appliquant à l'algorithme de recherche dichotomique.
4) Écrire un programme qui permet de visualiser, sur un même graphique, l'évolution du coût de la recherche d'un élément dans une liste par les deux méthodes.
5) Pour aller plus loin : comparaison avec la méthode index.
La fonction ci-dessous permet de faire une recherche d'une valeur dans une liste triée en utilisant la méthode index() des listes.
def recherche_index(liste, nb):
try:
return liste.index(nb)
except(ValueError):
return None
5.a) Compléter le programme précédent avec une troisième courbe qui correspond à la recherche utilisant index().
5.b) Comment le coût de la méthode index() évolue-t-il en fonction de la taille des données ?
Remarque : le coût de la méthode index() est moins bon que celui de la recherche dichotomique car la méthode index() fonctionne aussi bien sur les listes triées que sur les listes non triées.