La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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

Présentations similaires


Présentation au sujet: "ALGORITHMES RECURSIFS Méthodes de recherches et de tris récursives Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 1."— Transcription de la présentation:

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

2 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. Recherches et tris récursifs Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 2

3 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. Recherches et tris récursifs Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 3

4 Recherche dichotomique Attention uniquement si la collection dobjet 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 à lindice moyen avec lobjet recherché, 1. si l'objet recherché est à l'indice moyen (arrêt succès) 2. si lobjet est supérieur ou égal à la valeur t[moyen] relancer la recherche avec le tableau supérieur, 3. sinon relancer la recherche avec le tableau inférieur. Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 4

5 Recherche dichotomique - principe objet = 11 : objet

6 Recherche dichotomique – tests d'arrêt int RDRec(int min, int max, int objet, int t[]) { int milieu ; if (min >= max) return -1; milieu = (max+min)/2; if (t[milieu] == objet) return milieu;... } Tests d'arrêt Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 6

7 Recherche dichotomique – appel récursif sur un sous problème int RDRec(int min, int max, int objet, int t[]) { int milieu ; 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; } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 7 Rappel récursif sur un sous-problème

8 Recherche dichotomique – arrêts et appels récursif int RDRec(int min, int max, int objet, int t[]) { int milieu ; 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; } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 8 Rappel récursif sur un sous-problème Tests d'arrêt

9 Recherche dichotomique – code int RDRec(int min, int max, int objet, int t[]) { int milieu ; 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; } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 9

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 Ls on obtient : Li-triée et Ls-triée Liste résultat à létape courante : concaténation de Li-triée et Ls-triée avec la valeur du pivot P entre. Retour à la fonction appelante de L-triée Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 10

11 Tri quicksort – exemple d'appel Pré traitement Post traitement Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 11

12 Tri quicksort : définition de la liste Structure du maillon de la liste : typedef struct maillon { char info[NMAX] ; struct maillon* suiv; } MAIL ; int QScmp(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 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 12

13 Tri quicksort : fonctions utilisées MAIL* tete(MAIL* L) retourne la tête dune 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. Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 13

14 Tri quicksort – test d'arrêt MAIL * QS(MAIL* L) { MAIL *P, *R, *T, *Li=NULL, *Ls=NULL,*Resu ; if (L == NULL) return NULL;... } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 14 Test d'arrêt

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); }... } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 15 pré-traitement

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 ; } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 16 Rappel récursif

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 ; } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 17 post-traitement

18 Tri quicksort - anatomie 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 ; } Test d'arrêt pré-traitement Rappel récursif post-traitement Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 18

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 ; } Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 19


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

Présentations similaires


Annonces Google