Algorithmes et Structures de Données Chapitre 8 , Les Recherches

publicité
Objectifs
Les algorithmes de recherche
Algorithmes et
Structures de Données
Chapitre 8 – Les Recherches
Séquentielle ou linéaire
Dichotomique
Capocchi Laurent
[email protected]
http://spe.univ-corse.fr/capocchiweb
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche de l'information ?
On a souvent besoin de rechercher la position d'un
élément donné dans une structure
Tableau, Liste …
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Algorithmes de recherches
Algorithmes de recherche = Localiser un
élément dans un ensemble de données
Plusieurs approches
Caractéristiques importantes d'un algorithme de
recherche
Linéaire: Parcourir cet ensemble du début à la fin (simple)
Traitement du cas où l'élément cherché n'est pas dans le
Dichotomique (+ efficace)
tableau
Dépendant d’une structure de données « ad-hoc »
Comportement désiré en cas d'éléments identiques :
Tables de hachage
doit-il donné le premier, le dernier, tous ?
Arbres Binaires de Recherche
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche Linéaire ou Séquentielle
Technique qui consiste à passer en revue les éléments
jusqu'à ce qu'on trouve le bon ou que la liste ait été
entièrement parcourue
Si le tableau n'est pas trié : Arriver à la fin signifie que
l'élément n'existe pas
Si le tableau est trié : le premier élément trouvé > à
l'élément cherché permet d'arrêter la recherche, de plus
cette position correspond à celle ou il faudrait insérer
Recherche Linéaire
Algorithme de recherche séquentielle dans un
tableau de N entiers
fonction rechercheSeq(tab:Tableau,valeur:Entier): Booléen
variable locale : i : Entier
i <- 1
tantQue ( i <= longueur(tab) ) faire
si (tab[i] = valeur) alors
retourner VRAI
finSi
Complexité en O(n)
i <- i+1
finTantQue
au pire et en
retourner FAUX
moyenne
finFonction rechercheSequentielle
Complexité en O(1)
au meilleur des cas
l'élément cherché pour garder le tableau trié
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche Linéaire
Commentaires
L’ensemble des données est un tableau ou une liste
Généralement cet algorithme est utilisé sur des structures
de données qui ne permettant pas un accès direct facile :
Listes chaînées
On s’arrête dès qu’on a trouvé l’élément recherché
Sinon on peut retourner l’algorithme sur le reste pour
savoir si l’élément est encore présent
Plutôt qu’un booléen, on peut retourner la place de
l’élément dans l’ensemble : le supprimer par exemple
La complexité peut être réduite si les éléments les plus
recherchés se trouvent en tête de la structure de donnée
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche auto-adaptative
Réorganiser l’ensemble au fur et à mesure des
recherches
Minimisation du nombre de comparaison lors des futures
recherches
Idée 1
Après chaque recherche, placer l’élément en tête de la
structure
Bonne solution pour implémentation chaînée
Mauvaise solution pour implémentation contiguë
Idée 2
Après chaque recherche, faire progresser l’élément d’une
place vers la tête de l’ensemble : Adaptée aux 2
implémentation
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche dichotomique
Méthode qui s'applique à un tableau trié et qui
consiste à chercher la valeur se trouvant au milieu
du tableau
Recherche dichotomique
Les éléments sont triés par ordre croissant
Principe de la recherche d’un mot dans un dictionnaire
Algorithme
Suivant le résultat de la comparaison, on applique la
méthode au sous-tableau supérieur ou inférieur par
rapport au milieu
Cette méthode peut être également réalisée de manière
récursive
On regarde l’élément qui est au milieu de la structure à
l’élément recherché
Si c’est = , c’est gagné
Si sa clé est < à la clé recherché, il reste à traiter la
partie droite
Si sa clé est > à la clé recherché, il reste à traiter la
partie gauche
Méthode pas adaptée à l’implémentation chaînée
Pas d’accès direct
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche dichotomique
Algorithme de recherche dichotomique dans un
tableau de N entier
Fonction recherche(e :Élément, tab:Tableau) : Booléen
Deux versions
Récursives
Itératives
Complexité en O(log n)
au pire et en moyenne
Complexité en O(1) au
meilleur des cas
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche dichotomique
Version récursive
Fonction recherche(e :Élément, tab:Tableau) : Booléen
retourner Recherche-aux(e,tab,1,longueur(tab))
finFonction recherche
Complexité en O(log n)
au pire et en moyenne
Complexité en O(1) au
meilleur des cas
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche dichotomique
Fonction recherche-aux(e :Élément , tab:Tableau, début :Entier,
fin :Entier) : Booléen
variable locales :
milieu : Entier ; temp :Élément
si (début <= fin) alors
milieu <- (fin+début) div 2
temp <- tab[milieu]
si ( temp = e) alors retourner VRAI
sinon
si (e < temp) alors
// il est peut être dans la moitie
gauche
retourner Recherche-aux(e,tab,debut,milieu-1)
sinon
// il est peut être dans la moitie
droite
retourner Recherche-aux(e,tab,milieu+1,fin)
finsi
finsi
sinon retourner FAUX
Finsi
finFonction recherche-aux
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Bibliographie et Webographie
C. PAOLI, Cours d'algorithmes et structures de données,
Université de Corse, 2005
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Recherche dichotomique
Version itérative
Complexité en O(log n)
au pire et en moyenne
Complexité en O(1) au
meilleur des cas
Fonction Recherche(e Élément, tab : Tableau) : Booléen
Variables locales : milieu, début, fin :Entier ; temp :Élément
début <- 1
fin <- longueur(tab)
tant que (début <= fin) faire
milieu <- (debut + fin) div 2
temp <- tab[milieu]
si ( e = temp) alors retourner VRAI
Sinon si (e < temp) alors // il est peut être dans la moitie gauche
fin <- milieu-1
sinon
// il est peut être dans la moitie droite
début <- milieu+1
finSi
finSi
FinTantQue
retourner FAUX // le tableau ne contient pas l’élément e
finFonction Recherche
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Téléchargement