Algorithmes de recherche : rechercher un extremum
- Fiche de cours
- Quiz
- Profs en ligne
- Videos
- Application mobile
- Écrire un algorithme d’un extremum dans un tableau.
- Prouver que cet algorithme se termine et est correct, c’est-à-dire qu’il fait bien ce que l’on veut.
- Il est nécessaire de prouver qu’un algorithme se termine et qu’il est correct.
- Le cout d’une recherche d’un extremum dans un tableau est linéaire en n la taille du tableau.
Algorithmes de recherche : parcourir un tableau
Par la suite, nous étudierons la recherche du maximum d’un tableau.
Voici ci-dessous un algorithme classique de recherche du maximum dans un tableau Tab (non vide et non trié) de taille n.
maxi ← Tab[0] | Tab[0] est affecté à la variable maxi. |
Pour i allant de 0 à n−1 | i = 0, puis i = 1, puis i = 2, puis… i = n − 1. |
Si Tab[i] > maxi, alors | Si Tab[i] est supérieur à maxi, alors |
maxi ← Tab[i] | on affecte Tab[i] à la variable maxi. |
FinSi | Fin de l’instruction « Si ». |
FinPour | Fin de l’instruction « Pour ». |
Cet algorithme affecte le maximum du tableau Tab à la variable maxi en parcourant le tableau Tab et en « sauvegardant » au fur et à mesure le maximum des éléments parcourus.
Si le maximum est présent plusieurs fois dans le tableau, seule la première occurrence sera affectée à la variable maxi.
Si Tab = [1,9,2,9,1,4], alors le maximum sera affecté pour i = 1. Ce sera Tab[1] = 9.
En Python, on définit par exemple la fonction maximum1(Tab) suivante, qui implémente l’algorithme de recherche du maximum de Tab : elle retourne la première occurrence du maximum.
def maximum1(Tab): | On définit la fonction maximum1. |
maxi = Tab[0] | Tab[0] est affecté à la variable maxi. |
for i in range(len(Tab)): | i = 0, puis i = 1, puis i = 2, puis… i = n − 1. |
if Tab[i] > maxi: | Si Tab[i] est supérieur à maxi, alors |
maxi = Tab[i] | on affecte Tab[i] à la variable maxi. |
return maxi | On retourne la variable maxi. |
En Python, on définit par exemple la fonction maximum2(Tab) suivante, qui implémente l’algorithme de recherche du maximum de Tab en contrôle de flux.
def maximum2(Tab): | On définit la fonction maximum2. |
maxi = Tab[0] | Tab[0] est affecté à la variable maxi. |
for elt in Tab: | elt prend successivement les valeurs de Tab. |
if elt > maxi: | Si elt est supérieur à maxi, alors |
maxi = elt | on affecte elt à la variable maxi. |
return maxi | On retourne la variable maxi. |
L’étude et la programmation de la recherche du minimum est similaire. Il suffit de remplacer > par <.
Des fonctions qui implémentent la recherche du maximum ou du minimum d’un tableau existent déjà en Python ; ce sont les fonctions min et max.
Si Tab = [1,9,2,9,1,4], alors min(Tab) renvoie 1 et max(Tab) renvoie 9.
Il est important qu’un algorithme se termine pour que son exécution se passe sans problème.
Une instruction pour se termine toujours puisque l’on en connait le nombre de répétitions.
L’algorithme de recherche du maximum se termine puisqu’une instruction pour se termine toujours.
On utilise pour cela un invariant de boucle. Il s’agit d’une proposition qui doit être vraie à chaque itération de l’algorithme.
Pour l’algorithme de recherche du maximum de la
partie précédente, un invariant de
boucle peut être :
P(i) :
« Après la i-ème itération de
l’instruction pour, maxi référence le
maximum de Tab[0],
Tab[1], …,
Tab[i]. »
Démonstration de la correction
|
Pour l’algorithme de recherche du maximum de la partie précédente, le cas où les éléments de Tab sont classés dans l’ordre croissant est le pire des cas puisque toutes les affectations maxi ← Tab[i] vont être faites.
Donc, dans le pire des cas, l’algorithme appliqué à un tableau comportant n éléments nécessite :
- 2n + 1 affectations : une affectation avant l’instruction pour, n affectations pendant celle-ci, et au plus n affectations après les n comparaisons (si les éléments de Tab sont classés dans l’ordre croissant).
- n comparaisons : dans l’instruction pour.
- Une affectation est une procédure qui permet d’attribuer une valeur à une variable.
- Une comparaison est une instruction qui met en jeu deux variables et qui renvoie True ou False (vrai ou faux).
(car a × (2n + 1) + c × n = 2an + a + cn).
On obtient une fonction affine en n. On dit alors que le cout d’une recherche du maximum dans un tableau est linéaire en n la taille du tableau.
Vous avez obtenu75%de bonnes réponses !