Aller au contenu

Exercices

Exercice n°1 : Recherche dichotomique

Question 1 : La fonction

À l'aide de l'algorithme décrit en cours, rédiger la fonction Python recherche_dichotomique(l, v) qui renvoie True si v est dans l, et False sinon.

Vous devrez rédiger les docstrings et doctests adéquats.

Une info ?

On devra utiliser une boucle while. Repérez la condition à respecter pour continuer à faire le tour de la boucle.

Solution
def recherche_dichotomique(l, v):
    """
    Recherche v dans l en utilisant l'algorithme de recherche dichotomique
    Entrées : l - list : Liste triée d'éléments
              v : Objet à rechercher dans la liste
    Sortie : bool - True si v est dans l, False sinon
    >>> recherche_dichotomique([1,2,3,4,5,6], 3)
    True
    >>> recherche_dichotomique([1,3,4,6,7,9,10], 2)
    False
    """
    g = 0
    d = len(l)-1

    while g <= d:
        m = (g+d)//2

        if l[m] == v:
            return True
        elif l[m] < v:
            g = m + 1
        else:
            d = m - 1
    return False

Question 2 : Améliorer

Améliorez votre fonction afin de renvoyer l'indice de la valeur si elle est trouvée. Sinon, vous devrez renvoyer None. Mettre à jour les docstrings et doctests en conséquence.

Exercice n°2 : Vérifier l'optimalité

Dans cet exercice, on souhaite vérifier que la méthode de recherche dichotomique est réellement efficace. En effet, peut-être que couper au début ou à la fin de la liste est plus optimal que couper au milieu.

Question 1 : La fonction

Pour cela, commencer par rédiger une fonction recherche(l, v, c) qui recherche la valeur v dans l mais qui coupe à une valeur c comprise strictement entre 0 et 1. Par exemple, si c=0.5, alors cela revient à couper au milieu, comme l'algorithme de recherche dichotomique.

La fonction devra renvoyer le nombre d'itérations de la boucle while (autrement dit, le nombre de découpes effectuées).

Boucle infinie ?

Si vous tombez sur une boucle infinie, vous avez probablement un problème avec votre valeur de m. Vérifiez qu'elle ne soit pas en dehors des bornes g et d.

Question 2 : Les tests

Une fois votre fonction mise en place, testez-la avec différentes valeurs de c (par exemple 0.1, 0.2, ..., 0.9) pour plusieurs listes aléatoires. Compilez ces résultats dans un graphique affichant en abscisse les valeurs de c et en ordonnée le nombre moyen de découpes par appel de fonction.