1 / 19

ALGORITHMES RECURSIFS

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.

maine
Télécharger la présentation

ALGORITHMES RECURSIFS

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ALGORITHMES RECURSIFS Méthodes de recherches et de tris récursives 1 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

More Related