ALGORITHMES DE RECHERCHE
Recherche séquentielle
Introduction
Pour Thomas Cormen, très grand professeur d'informatique, un algorithme est une procédure de calcul, bien définie, qui prend en entrée une valeur ou un ensemble de valeurs, et qui donne en sortie une valeur ou un ensemble de valeurs. C'est un outil permettant de résoudre un problème de calcul bien spécifié.
Un algorithme doit se terminer dans un temps raisonnable et doit résoudre correctement le problème donné. Ces deux propriétés sont respectivement nommées:
- complexité (en temps)
- correction
Cette première leçon d'algorithmique sera orientée vers la recherche (séquentielle) d'un élément dans un tableau.
Parcours séquentiel d'un tableau
Recherche d'une occurence
Soit le problème suivant: étant donné un tableau t
de éléments, écrire un algorithme qui permet de dire si un élément appartient à ce tableau.
Le problème: appartient-il au tableau ?
Les entrées: un tableau t
et un élément x
;
La sortie: une réponse vraie ou fausse (True
ou False
)
Une solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 |
|
1 |
|
Travail
Réaliser l'implémentation en python en utilisant une boucle while
plutôt qu'une boucle for
.
1 2 3 4 5 6 7 8 9 |
|
Remarque
On peut boucler sur éléments plutôt que les indices; cela nous dispense de la variable n
.
1 2 3 4 5 6 7 8 9 10 |
|
Recherche d'un extrémum
Deuxième problème: étant donné un tableau t
de éléments (des entiers pour se fixer les idées). Le deuxième algorithme proposé permet de trouver le minimum parmi les éléments de ce tableau.
Le problème: quellle est la plus petite valeur du tableau ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Implémentation en python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Travail
Ecrire et tester l'implémentation d'une fonction retournant l'élément le plus grand de t
Calcul d'une moyenne
Troisième problème: étant donné un tableau t
de éléments que l'on supposera entiers. L'algorithme proposé permet de trouver la moyenne des éléments de ce tableau.
Le problème: quelle est la valeur moyenne des éléments du tableau ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Travail
Implémenter cet algorithme en python
1 2 3 4 5 6 7 8 |
|
Efficacité des algorithmes
En informatique, la question de la performance des algorithmes est centrale. D'une manière générale, le traitement d'une certaine quantité de données requiert un temps d'xecution lié à cette quantité.
Ainsi dans nos exemples où est la taille du tableau d'entrée, la boucle est parcourue:
- fois dans le pire des cas (si x n'appartient pas au tableau) dans le problème 1
- fois dans le problème 2;
- fois dans le problème 3;
Le temps d'exécution sera lié au nombre d'opérations effectuées, qui dépend ici de la taille de l'entrée $n$, plus exactement proportionnel à (ou ). On dit que la complexité en temps de ces algorithmes est linéaire.
Remarque
Il n'est pas question de rechercher de manière exacte le temps d'exécution mais plutôt d'avoir une estimation.
Recherche dichotomique
Principe
On souhaite rechercher une valeur dans un tableau t
trié (par ordre croissant pour se fixer les idées). L'idée principale est de comparer avec la valeur située au milieu du tableau:
1 2 3 4 |
|
- si elle est plus petite, il suffit de restreindre la recherche dans la partie gauche du tableau;
- sinon, on la restreint à la partie droite de .
- ou alors on a trouvé
En répétant ce procédé on divise la zone de recherche par deux à chaque fois. On peut alors représenter la situation avec le schéma ci-dessous. Il s'agit d'une application du principe diviser pour régner qui sera vu en terminale.
1 2 3 4 |
|
Algorithme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Implémentation en python
1 2 3 4 5 6 |
|
Travail
Implémenter l'algorithme de la recherche dichotomique en python, en complétant le code ci-dessous.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Terminaison de l'algorithme
Lorsqu'un programme contient une boucle while
il est suceptible de diverger (on dit aussi qu'il peut entrer dans une boucle infinie). Pour montrer l'arrêt de la boucle, on utilise une technique de raisonnement appelé technique du variant de boucle. Il s'agit de trouver parmi les éléments du programme une quantité:
- entière;
- positive;
- qui décroit strictement à chaque tour de boucle.
Si on peut exhiber un variant de boucle, l'algorithme termine.
g | d | m | t[m] | d-g | trouvé ? | |
---|---|---|---|---|---|---|
Initialisation | ||||||
Fin itération 1 | ||||||
Fin itération 2 | ||||||
Fin itération 3 |
Application
Soit t = [1,7,8,9,12,15,15,22,30,31]
. On recherche dans t
.
Compléter le tableau ci-dessus. Conclure