210 likes | 456 Views
ALGORITHMES RECURSIFS. Méthodes de recherches et de tris récursives. 1. Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris. Recherches et tris récursifs. Certains traitements récursifs s'appliquent particulièrement bien à la problématique des recherches et des tris.
E N D
ALGORITHMES RECURSIFS Méthodes de recherches et de tris récursives 1 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherches et tris récursifs • Certains traitements récursifs s'appliquent particulièrement bien à la problématique des recherches et des tris. • Pour appliquer la récursivité il faut que le problème à résoudre puisse être décomposé en sous-problème de même nature. L'arrêt de l'appel récursif se fait à la résolution du problème élémentaire • Il faut donc une modélisation du problème de la recherche ou du tri qui soit récursive. 2 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherches et tris récursifs Recherche dichotomique : La recherche dans un tableau de taille N conduit à découper le problème en deux sous problèmes de même nature et à rechercher dans un sous tableau de taille N/2. Tri quicksort : Trier une collection d'objets conduit à : (pré-traitement) identifier un pivot, répartir la collection en deux sous-collections les plus petits et les plus grands. (appel récursif) relancer le tri sur les 2 sous-collections. (post-traitement) Le résultat sera la concaténation des deux sous-collections revenues triées. 3 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherche dichotomique Attention uniquement si la collection d’objet est déjà triée. A chaque étape : • Tester si le tableau est vide (en ce cas arrêt des appels récursifs avec échec) • Calculer l'indice moyen (indice max + indice min)/2 • Comparer la valeur présente à l’indice moyen avec l’objet recherché, • si l'objet recherché est à l'indice moyen (arrêt succès) • si l’objet est supérieur ou égal à la valeur t[moyen] relancer la recherche avec le tableau supérieur, • sinon relancer la recherche avec le tableau inférieur. 4 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherche dichotomique - principe objet = 11 : objet<t[moy] moy = (max + min) / 2 min max max moy min 5 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherche dichotomique – tests d'arrêt intRDRec(intmin, int max, int objet, int t[]) { intmilieu ; if (min >= max)return -1; milieu = (max+min)/2; if(t[milieu] == objet) return milieu; . . . } Tests d'arrêt 6 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherche dichotomique – appel récursif sur un sous problème intRDRec(intmin, int max, int objet, int t[]) { intmilieu ; if (min >= max) return -1; milieu = (max+min)/2; if (t[milieu] == objet) return milieu; if (objet < t[milieu]) return RDRec(min, milieu -1, objet, t); if (objet > t[milieu]) return RDRec(milieu +1, max, objet, t); return –1; } Rappel récursif sur un sous-problème 7 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherche dichotomique – arrêts et appels récursif intRDRec(intmin, int max, int objet, int t[]) { intmilieu ; if (min >= max)return -1; milieu = (max+min)/2; if (t[milieu] == objet) return milieu; if (objet < t[milieu]) return RDRec(min, milieu -1, objet, t); if (objet > t[milieu]) return RDRec(milieu +1, max, objet, t); return –1; } Rappel récursif sur un sous-problème Tests d'arrêt 8 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Recherche dichotomique – code intRDRec(intmin, int max, int objet, int t[]) { intmilieu ; if (min >= max) return -1; milieu = (max+min)/2; if (t[milieu] == objet) return milieu; if (objet < t[milieu]) return RDRec(min, milieu -1, objet, t); if (objet > t[milieu]) return RDRec(milieu +1, max, objet, t); return –1; } 9 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort - principe • A l’étape courante soit : • L : liste vide – elle est retournée (triée par définition) • L : non vide – choix d'un pivot P dans la liste (premier élément) • Découpage de L en deux sous listes : • Li: liste des éléments inférieurs au pivot, • Ls: liste des éléments supérieurs au pivot. • Tri récursif rappelé sur Li et Lson obtient :Li-triée et Ls-triée • Liste résultat à l’étape courante : • concaténation de Li-triéeet Ls-triéeavec la valeur du pivot P entre. • Retour à la fonction appelante de L-triée 10 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort – exemple d'appel 5 7 3 4 1 2 9 Pré traitement 3 4 1 2 7 9 1 2 4 9 2 Post traitement 2 4 1 2 9 1 2 3 4 7 9 1 2 3 4 5 7 9 11 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort : définition de la liste Structure dumaillon de la liste : typedefstructmaillon { char info[NMAX] ; structmaillon* suiv; } MAIL ; • intQScmp(MAIL * A, MAIL * B) retourne 0, 1 ou -1 • suivant si le champ info du maillon A est égal, supérieur ou inférieur au champ info du maillon B 12 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort : fonctions utilisées MAIL* tete(MAIL* L) retourne la tête d’une liste L, c'est à dire le premier élément de la liste. MAIL* reste(MAIL* L) retourne le reste d'une liste L, c'est à dire le pointeur vers le deuxième élément de la liste. MAIL* ajouter-tete(MAIL* P, MAIL* L) retourne une liste dont la tête est P et le reste L (ajout en tête). MAIL* concatener(MAIL* D, MAIL* F) retourne la liste constituée par tous les éléments de la liste D suivis de tous les éléments de la liste F. 13 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort – test d'arrêt Test d'arrêt MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu; if (L == NULL) return NULL; . . . } 14 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort – pré traitement MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu ; if (L == NULL) return NULL; P = tete(L); for(R= reste(L) ; R!= NULL ; R= reste(R)) { T= tete(R); if (QScmp(P,T) < 0) Ls= ajtete(Ls, T); else Li= ajtete(Li, T); } . . . } pré-traitement 15 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort – appel récursif MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu; if (L == NULL) return NULL; P = tete(L); for(R= reste(L) ; R!= NULL ; R= reste(R)) { T= tete(R); if (QScmp(P,T) < 0) Ls= ajtete(Ls, T); else Li= ajtete(Li, T); } Li = QS(Li); Ls = QS(Ls); Res = ajtete(P, Ls); Res = concatener(Li, Res); return Res ; } Rappel récursif 16 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort – post traitement MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu; if (L == NULL) return NULL; P = tete(L); for(R= reste(L) ; R!= NULL ; R= reste(R)) { T= tete(R); if (QScmp(P,T) < 0) Ls= ajtete(Ls, T); else Li= ajtete(Li, T); } Li = QS(Li); Ls = QS(Ls); Res = ajtete(P, Ls); Res = concatener(Li, Res); return Res ; } post-traitement 17 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort - anatomie Test d'arrêt MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu ; if (L == NULL) return NULL; P = tete(L); for(R= reste(L) ; R!= NULL ; R= reste(R)) { T= tete(R); if (QScmp(P,T) < 0) Ls= ajtete(Ls, T); else Li= ajtete(Li, T); } Li = QS(Li); Ls = QS(Ls); Res = ajtete(P, Ls); Res = concatener(Li, Res); return Res ; } Rappel récursif pré-traitement post-traitement 18 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris
Tri quicksort - code MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu; if (L == NULL) return NULL; P = tete(L); for(R= reste(L) ; R!= NULL ; R= reste(R)) { T= tete(R); if (QScmp(P,T) < 0) Ls= ajtete(Ls, T); else Li= ajtete(Li, T); } Li = QS(Li); Ls = QS(Ls); Res = ajtete(P, Ls); Res = concatener(Li, Res); return Res ; } 19 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris