Cours Info - 11 Algorithmes de recherche D.Malka MPSI 2016-2017 D.Malka Cours Info - 11 MPSI 2016-2017 1 / 31 Sommaire Sommaire 1 Les tableaux 2 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Liste triée : recherche dichotomique 3 Recherche d’un mot dans une chaîne de caractères 4 Recherche du zéro d’une fonction continue monotone D.Malka Cours Info - 11 MPSI 2016-2017 2 / 31 Les tableaux Sommaire 1 Les tableaux 2 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Liste triée : recherche dichotomique 3 Recherche d’un mot dans une chaîne de caractères 4 Recherche du zéro d’une fonction continue monotone D.Malka Cours Info - 11 MPSI 2016-2017 3 / 31 Les tableaux Exemple La structure de Tableau Définition Tableau Un tableau est une suite de valeurs stockées dans des cases mémoires contigües. En Python, la structure de données correspondant aux tableaux est le type list. Python autorise les listes stockant des variables de types différents. Nous nous restreindrons à des tableaux dont les éléments sont tous de même type. D.Malka Cours Info - 11 MPSI 2016-2017 4 / 31 Les tableaux Exemples La structure de Tableau Exemples Tableau d’entiers indice elt 0 4 1 75 2 6 3 93 4 101 5 3 6 12 Tableau de caractères indice elt 0 ’a’ D.Malka 1 ’e 2 ’i’ 3 ’o’ 4 ’u 5 ’y’ Cours Info - 11 MPSI 2016-2017 5 / 31 Les tableaux Quelques rappels La structure de Tableau Création, manipulation Quelques rappels en Python I Création T=[1,2,3,....] I Lecture de l’élément d’indice i : T[i] I Modification de l’élément d’indice i : T[i]=3 I Insertion en queue : T.append(elt) I Insertion : T.insert(indice,elt) I Suppression : del(T[indice]) ou T.remove(elt) D.Malka Cours Info - 11 MPSI 2016-2017 6 / 31 Les tableaux Quelques rappels La structure de Tableau Création, manipulation Quelques rappels en Python I Slicing : T[i:j] renvoie un sous-tableau contenant les éléments d’indice i(inclus) à j(exclu) de T I Concaténation : [1,2,3]+[3,2,1] → [1,2,3,3,2,1] I Revoir le chapitre 5 ... I et la documentation Python D.Malka Cours Info - 11 MPSI 2016-2017 7 / 31 Les tableaux Quelques rappels La structure de Tableau Parcours des éléments d’un tableau On considère le tableau (ou la liste) T. Comment le parcourir en Python ? Méthode 1 : 1 2 for i in range(len(T)): T[i] Méthode 2 : 1 2 for elt in T: elt Méthode 3 : 1 2 for indice, elt in enumerate(T): elt,indice D.Malka Cours Info - 11 MPSI 2016-2017 8 / 31 Recherche d’un nombre dans une liste Sommaire 1 Les tableaux 2 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Liste triée : recherche dichotomique 3 Recherche d’un mot dans une chaîne de caractères 4 Recherche du zéro d’une fonction continue monotone D.Malka Cours Info - 11 MPSI 2016-2017 9 / 31 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Recherche séquentielle d’un nombre dans une liste Principe Recherche séquentielle : principe I Parcourir le tableau I Comparer chaque élément parcouru à l’élément recherché I Si l’élément est trouvé, quitter la boucle et renvoyer l’indice de l’élément (plus précisément de la 1ère occurrence) I Arrivé au dernier élément du tableau, quitter la boucle et renvoyer NULL D.Malka Cours Info - 11 MPSI 2016-2017 10 / 31 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Recherche séquentielle d’un nombre dans une liste Algorithme Algorithme 1 : Recherche séquentielle d’une valeur 1 fonction Recherche_sequentielle(T,x) 2 4 pour i de 0 à longueur(T)-1 faire si T[i]==x alors retourner i 5 retourner NULL 3 Complexité : O(n) où n est la longueur du tableau T. D.Malka Cours Info - 11 MPSI 2016-2017 11 / 31 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Recherche séquentielle d’un nombre dans une liste Algorithme Implémentation en Python : 1 2 3 4 5 6 def recherche_seq(T,x): n=len(T) for i in range(n) if T[i]==x: return i return None D.Malka Cours Info - 11 MPSI 2016-2017 12 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique Principe Existe-t-il un algorithme plus efficace que la recherche naïve ? OUI si la liste est triée. C’est la recherche dichotomique. D.Malka Cours Info - 11 MPSI 2016-2017 13 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique Principe Paradigme : « diviser pour régner » Recherchons 15 dans le tableau d’entier croissant suivant : 1 0 2 1 8 2 15 425 532 648 771 881 999 3 32 > 15 0 1 2 1 8 2 15 425 3 8 < 15 15 425 3 15=15 ALGORITHME TERMINE D.Malka Cours Info - 11 MPSI 2015-2016 14 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Algorithme Algorithme 2 : Recherche dichotomique d’une valeur Entrées : Entier x, tableau trié par ordre croissant T Sorties : Indice de x dans T 1 fonction Recherche_dichotomique(T,x) 2 g=0 3 d=longueur(T)-1 4 tant que g<=d faire m=(g+d)/2 5 6 7 8 9 10 11 12 si T[m]<x alors g=m+1 sinon si T[m]>x alors d=m-1 sinon /*T[m]==x*/ retourner m retourner NULL D.Malka Cours Info - 11 MPSI 2016-2017 15 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Implémentation en Python 1 2 3 4 5 6 7 8 9 10 11 def rech_dicho(x,T): g=0 d=len(T)-1 while g<=d: m=(d+g)//2 if x>T[m]: g=m+1 elif x<T[m]: d=m-1 else :#x==T[m]: return m 12 13 return None D.Malka Cours Info - 11 MPSI 2016-2017 16 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Terminaison Terminaison Montrons que l’algorithme de recherche dichotomique termine. On considère la suite {uk = dk − gk }. Dans la boucle, {uk } est une suite : I Entière I Positive car gk ≤ mk ≤ dk I Strictement décroissante (uk +1 < uk ) car ∀ k , dk +1 < dk ou gk +1 > gk Donc l’algorithme termine. D.Malka Cours Info - 11 MPSI 2016-2017 17 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Exactitude Montrons que si x est dans T alors l’algorithme renvoie i l’indice de x dans le tableau. Pour cela, montrons que Pk : x ∈ [T [gk ], T [dk ]] ou x = T [mk ] est un invariant de boucle. Initialisation Pour k = 0 : I d0 = n − 1, g0 = 0 I Par hypothèse x ∈ T donc x ∈ [T [g0 ], T [d0 ]] I P0 est vraie D.Malka Cours Info - 11 MPSI 2016-2017 18 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Exactitude Montrons que Pk ⇒ Pk +1 Hérédité – Cas 1 : x = T [mk +1 ] Cas trivial : Pk +1 est vraie. D.Malka Cours Info - 11 MPSI 2016-2017 19 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Exactitude Montrons que Pk ⇒ Pk +1 . Hérédité – Cas 2 : x < T [mk +1 ] Si x < T [mk +1 ] alors : I mk +1 = dk + gk I 2 gk +1 = gk or par hypothèse Pk est vrai donc x ≥ T [gk ] donc x ≥ T [gk +1 ] I dk +1 = mk +1 − 1 or x < T [mk +1 ] donc x ≤ T [mk +1 − 1] soit x ≤ T [dk +1 ] I Les deux dernières assertions sont équivalentes à x ∈ [T [gk +1 ], T [dk +1 ]] soit à Pk +1 I Donc Pk ⇒ Pk +1 D.Malka Cours Info - 11 MPSI 2016-2017 20 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Exactitude Montrons que Pk ⇒ Pk +1 . Hérédité – Cas 3 : x > T [mk +1 ] Si x > T [mk +1 ] alors : I mk +1 = dk + gk I 2 dk +1 = dk or par hypothèse Pk est vrai donc x ≤ T [dk ] donc x ≤ T [dk +1 ] I gk +1 = mk +1 + 1 or x > T [mk +1 ] donc x ≥ T [mk +1 + 1] soit x ≥ T [gk +1 ] I Les deux dernières assertions sont équivalentes à x ∈ [T [gk +1 ], T [dk +1 ]] soit à Pk +1 I Donc Pk ⇒ Pk +1 D.Malka Cours Info - 11 MPSI 2016-2017 21 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Exactitude Finalement : I Soit x a été trouvé avant la dernière itération. I Soit à la dernière itération d = g = m et donc d’après l’invariant de boucle x = T [m] donc x est trouvé. I La démonstration est complète si l’algorithme retourne NULL si x n’est pas dans le tableau ce qui assuré par la négation de la condition x == T [m] et par la terminaison de l’algorithme. D.Malka Cours Info - 11 MPSI 2016-2017 22 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Complexité La complexité de la recherche dichotomique est O(log2 (n)) où n est la taille du tableau. Démonstration par récurrence sur la diapo suivante. D.Malka Cours Info - 11 MPSI 2016-2017 23 / 31 Recherche d’un nombre dans une liste Liste triée : recherche dichotomique Recherche dichotomique d’un nombre dans une liste triée Complexité Preuve n 2k Montrons par récurrence qu’à l’itération k , lk = dk − gk ≤ où n est la longueur du tableau. I Initialisation : pour k = 0, l0 = n − 1 − 0 + 1 = n cqfd I Hérédité : Pk : lk < n 2k vraie montrons Pk +1 : lk +1 < n 2k +1 à la (k + 1)ieme itération : mk +1 = • • dk +gk 2 et : soit dk +1 = mk +1 − 1 et gk +1 = gk , soit ou gk +1 = mk +1 + 1 et dk +1 = dk . cas où gk +1 = mk +1 + 1 et dk +1 = dk : lk +1 = dk +1 − (mk +1 + 1) + 1 = dk − donc lk +1 = lk 2 ≤ n 2k +1 dk +gk 2 +1 = dk −gk 2 or lk 2 = (dk −gk )+1 2 : cqfd. cas où dk +1 = mk +1 − 1 et gk = gk +1 : même raisonnement. I donc ∀k , lk < n 2k . A la sortie de la boucle k = N, et au pire, l = 1 tableau à un élément. Donc 1 ≤ n 2N ⇔ N ≤ log2 (n). La complexité au pire de l’algorithme est donc O(log2 (n)). D.Malka Cours Info - 11 MPSI 2016-2017 24 / 31 Recherche d’un mot dans une chaîne de caractères Sommaire 1 Les tableaux 2 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Liste triée : recherche dichotomique 3 Recherche d’un mot dans une chaîne de caractères 4 Recherche du zéro d’une fonction continue monotone D.Malka Cours Info - 11 MPSI 2016-2017 25 / 31 Recherche d’un mot dans une chaîne de caractères Le problème Recherche d’un mot dans une chaîne de caractères Le problème Recherche d’un motif dans un texte On souhaite rechercher toutes les occurrences d’une chaine de caractère motif de longueur m dans une chaine de caractères texte de longueur n. On supposera m ≤ n. D.Malka Cours Info - 11 MPSI 2016-2017 26 / 31 Recherche d’un mot dans une chaîne de caractères Algorithme naïf Recherche d’un mot dans une chaîne de caractères Algorithme naïf Algorithme 3 : Recherche d’une chaîne de caractère Entrées : String motif, string texte Sorties : Liste des positions du motif (premier caractère) 1 fonction Recherche_motif(motif,texte) 2 position_motif=[] 3 n=longueur(texte) 4 m=longueur(motif) 5 pour i allant de 0 à n-m-1 faire j=0 6 8 tant que j<m et texte[i+j]==motif[j] faire j=j+1 9 si j==m alors 7 10 11 /*Alors texte[i+j]==motif[j] a toujours été vraie*/ Ajouter i à position_motif retourner position_motif D.Malka Cours Info - 11 MPSI 2016-2017 27 / 31 Recherche d’un mot dans une chaîne de caractères Implémentation en Python Recherche d’un mot dans une chaîne de caractères Algorithme naïf – Implémentation en Python 1 def rech_motif(mot,t): 2 3 4 5 6 7 8 9 10 11 12 liste_pos=[] n=len(t) m=len(mot) for i in range(n-m): j=0 while(j<m and t[i+j]==mot[j]): j+=1 if j==m: liste_pos.append(i) return liste_pos D.Malka Cours Info - 11 MPSI 2016-2017 28 / 31 Recherche d’un mot dans une chaîne de caractères Complexité Recherche d’un mot dans une chaîne de caractères Algorithme naïf – Complexité Complexité I Unité de mesure : les comparaisons I Boucle for : une boucle while n − m fois et n − m comparaisons (embranchement) I Boucle while : au pire on trouve à chaque fois le motif ⇒ 2m comparaisons I Boucle while : au mieux on ne trouve jamais le motif ⇒ 2 comparaisons I Complexité au pire : O(m(n − m)). I Complexité au mieux : O(n − m). D.Malka Cours Info - 11 MPSI 2016-2017 29 / 31 Recherche du zéro d’une fonction continue monotone Sommaire 1 Les tableaux 2 Recherche d’un nombre dans une liste Liste quelconque : recherche séquentielle Liste triée : recherche dichotomique 3 Recherche d’un mot dans une chaîne de caractères 4 Recherche du zéro d’une fonction continue monotone D.Malka Cours Info - 11 MPSI 2016-2017 30 / 31 Recherche du zéro d’une fonction continue monotone Recherche du zéro d’une fonction continue monotone VOIR PARTIE CALCULS NUMERIQUES D.Malka Cours Info - 11 MPSI 2016-2017 31 / 31