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