Cours Info - 11 - mpsi-lycee-saint

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