ALGORITHMES RECURSIFS

Slides:



Advertisements
Présentations similaires
Tris.
Advertisements

Chap. 4 Recherche en Table
Chapitre 3 Les arbres binaires
Chapitre annexe. Récursivité
Les fonctions A quoi ça sert ?
Rappels C.
Fonctions & procédures
Sensibilisation à l’Algorithmique et structure de données
Calculs de complexité d'algorithmes
GEF 243B Programmation informatique appliquée Listes chaînées II §15.1 – 15.2.
GEF 243B Programmation informatique appliquée
Problème de 8 dames: Sachant que dans un jeu des échecs, une dame peut pendre toute pièce se trouvant sur la colonne ou sur la ligne ou sur les diagonales.
1 UMLV Optimalité des tris par comparaisons : O(n logn) Classements linéaires Tris lexicographiques Tri lexicographique.
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Chap. 1 Structures séquentielles : listes linéaires
Construction de Box-Plot ou diagrammes en boîtes ou boîtes à moustaches Construire une boîte à moustaches …
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
IPA – Catherine Faron Zucke et Anne Marie Deryr. suite ordonnée d'éléments de taille variable ArrayList liste; liste = new ArrayList (); Ne peuvent contenir.
OCaml - Les listes L3 MI.
Récursivité.
Les structures de données arborescentes
II. Chaînage, SDD séquentielles
Les algorithmes: complexité et notation asymptotique
Introduction à la récursivité
RECURSIVITE ARBRES BINAIRES
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Méthode des k plus proches voisins
Définition d’un maillon de liste
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Les tris.
Test bilan de calcul mental N°1 :
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Abder Alikacem Semaine 13 La récursivité
Arbres Rouge noir Démo : INF3105 Structures de données et algorithmes
Modèles d’implantation
Structures de données IFT-2000
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
COURS DE PROGRAMMATION ORIENTEE OBJET :

Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Programmation linéaire en nombres entiers : les méthodes de troncature
III. Récursivité Principe et exemples
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
Structures des données
Le langage C Structures de données
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
Ch. PAUL - Piles et Files à l'aide de listes chainées
Algorithmique Les structures Rappel L'enchaînement séquentiel
ALGORITHMIQUE Recherches : Tris : séquentielle, dichotomique
LES PILES ET FILES.
ITI1520 Lab #8: Récursivité Gilbert Arbez, Mohamad Eid, Daniel Amyot, Sylvia Boyd, Diana Inkpen et Alan Williams.
Chapitre 6 Les traitements avancés
Méthodes de tri.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Structures de données élémentaires dans le contexte du TP #1
Arbres binaires et tables de hachage
ETNA – 1ème année Guillaume Belmas –
1 1 Huitième journée Quelques algorithmes. 2 Définition Description des tâches pour que celles-ci soient aisément programmables Différent d’une méthode.
La Récursivité.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
Algorithmes de tri.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Semaine 14 Les algorithmes de tri Département d’informatique et de génie logiciel Édition septembre 2009.
CSI25101 Tri Plus efficace. CSI25102 Tri récursif Le tri récursif divise les données de grande taille en deux presque moitiés et est appelé récursivement.
1. Tri rapide ou Quicksort Principe : La méthode du Quicksort due au C.A. Hoare (1962) utilise les principes généraux de division et équilibrage. 2.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Techniques de décomposition
1 RECURSIVITE PRESENTATION Ch. PAUL ALGORITHMIQUE Présentation de la récursivité.
Transcription de la présentation:

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

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

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

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

Recherche dichotomique - principe objet = 11 : objet<t[moy] moy = (max + min) / 2 min max 7 9 11 12 33 max  moy min 7 9 11 12 33 Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 5

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

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; } Rappel récursif sur un sous-problème Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 7

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; } Rappel récursif sur un sous-problème Tests d'arrêt Ch. PAUL EMSE ALGORITHMIQUE - RECURSIVITE Recherche et Tris 8

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

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

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

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

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

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

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

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

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

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

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