1.31k likes | 1.53k Views
Cours d’Algorithmique. Listes, piles et files. Arbres. Types de données abstraits. Implantations. Les grandes lignes du cours. Trier et chercher Listes et arbres Le back-track Arbres équilibrés Récursivité et induction sur la structure Divide and conquer Minimax Dérécursion
E N D
Cours d’Algorithmique Listes, piles et files. Arbres. Types de données abstraits. Implantations. Cours d'algorithmique 2 - Intranet
Les grandes lignes du cours • Trier et chercher • Listes et arbres • Le back-track • Arbres équilibrés • Récursivité et induction sur la structure • Divide and conquer • Minimax • Dérécursion • Divers problèmes particuliers • Logique de Hoare • Programmation dynamique • Complexité et calculabilité Cours d'algorithmique 2 - Intranet
Voici des listes ! 2 4 2 1 0 2 4 6 8 10 Tableau 4 6 2 2 2 10 1 -1 4 Cours d'algorithmique 2 - Intranet
2 1 Voici des listes ! 2 4 0 2 4 6 8 10 Tableau 4 6 2 2 2 10 1 -1 4 Cours d'algorithmique 2 - Intranet
Voici des listes ! 2 4 2 1 0 2 4 6 8 10 Tableau 4 6 2 2 2 10 1 -1 4 Cours d'algorithmique 2 - Intranet
Voici des listes ! 2 4 2 1 0 2 4 6 8 10 Tableau 4 6 2 2 2 10 1 -1 4 Cours d'algorithmique 2 - Intranet
Voici des listes ! 2 4 2 1 0 2 4 6 8 10 Tableau 4 6 2 2 2 10 1 -1 4 Cours d'algorithmique 2 - Intranet
Voici des listes ! 2 4 2 1 0 2 4 6 8 10 Tableau 4 6 2 2 2 10 1 -1 4 FIN Cours d'algorithmique 2 - Intranet
Caractérisations d’une liste ! • Un élément plus un lien vers le suivant. • Séquence ordonnée finie. • Suite ordonnée des mathématiques. • Un tableau peut être vu comme une liste, si on limite les accès aléatoires. • On lit T[0], puis T[1], etc, par exemple. • Une liste est caractérisée par • ses propriétés et fonctions d’accès • et non sa réalisation. Cours d'algorithmique 2 - Intranet
Constructeurs et prédicats sur listes----------------------------------------------------------------- Soit LT le type des listes d’éléments de type T. Le constructeur de la liste vide : cree_vide : void ->LT Cours d'algorithmique 2 - Intranet
Constructeurs et prédicats sur listes----------------------------------------------------------------- Soit LT le type des listes d’éléments de type T. Le constructeur de la liste vide : cree_vide : void -> LT Le constructeur général : ajout_liste : T x LT -> LT Cours d'algorithmique 2 - Intranet
Constructeurs et prédicats sur listes----------------------------------------------------------------- Soit LT le type des listes d’éléments de type T. Le constructeur de la liste vide : cree_vide : void -> LT Le constructeur général : ajout_liste : T x LT -> LT Le prédicat qui distingue les deux cas : est_vide : LT -> BOOL Cours d'algorithmique 2 - Intranet
Constructeurs et prédicats sur listes----------------------------------------------------------------- Les propriétés vérifiées par ces fonctions : est_vide( cree_vide () ) = Vrai est_vide ( ajout_liste ( e , l ) ) = Faux • La seule liste vide est celle créée par « cree_vide ». • Aucune liste obtenue par adjonction d’un élément « a » à une liste « l » n’est vide. • Salutations de la part de Monsieur de la Palisse ! Cours d'algorithmique 2 - Intranet
Fonctions d’accès sur listes----------------------------------------------------------------- La fonction d’accès à l’élément : tete_liste : LT -> T La fonction d’accès à la suite de la liste : queue_liste : LT -> LT Cours d'algorithmique 2 - Intranet
Fonctions d’accès sur listes----------------------------------------------------------------- La fonction d’accès à l’élément : tete_liste : LT -> T La fonction d’accès à la suite de la liste : queue_liste : LT -> LT Les propriétés vérifiées par ces fonctions : tete_liste( ajout_liste ( a , l ) ) = a queue_liste( ajout_liste ( a , l ) ) = l Cours d'algorithmique 2 - Intranet
Fonctions d’accès sur listes----------------------------------------------------------------- Les limitations d’application de ces fonctions, les appels suivants sont interdits : tete_liste( cree_vide () ) queue_liste( cree_vide () ) Cours d'algorithmique 2 - Intranet
Fonctions d’accès sur listes----------------------------------------------------------------- Les limitations d’application de ces fonctions, les appels suivants sont interdits : tete_liste( cree_vide () ) queue_liste( cree_vide () ) Ce qui est vraiment caractéristique d’une liste : tete_liste( ajout_liste ( a , l ) ) = a Cours d'algorithmique 2 - Intranet
Fonctions d’accès sur listes----------------------------------------------------------------- Les limitations d’application de ces fonctions, les appels suivants sont interdits : tete_liste( cree_vide () ) queue_liste( cree_vide () ) Ce qui est vraiment caractéristique d’une liste : tete_liste( ajout_liste ( a , l ) ) = a On parle d’une structure Last In - First Out (LIFO) Cours d'algorithmique 2 - Intranet
Types de données abstraits----------------------------------------------------------------- • Nous nous sommes donné des noms de types : • un type de base T, • un type de liste LT sur ce type de base. Cours d'algorithmique 2 - Intranet
Types de données abstraits----------------------------------------------------------------- • Nous nous sommes donné des noms de types : • un type de base T, • un type de liste LT sur ce type de base. • Nous nous sommes donné des fonctions et leurs propriétés : • cree_vide , ... , • est_vide ( cree_vide () ) = Vrai , … . Cours d'algorithmique 2 - Intranet
Types de données abstraits----------------------------------------------------------------- • Nous nous sommes donné des noms de types : • un type de base T, • un type de liste LT sur ce type de base. • Nous nous sommes donné des fonctions et leurs propriétés : • cree_vide , ... , • est_vide ( cree_vide () ) = Vrai , … . • Nous n’avons pas besoin de devenir plus concrets. Cours d'algorithmique 2 - Intranet
Types de données abstraits----------------------------------------------------------------- • Nous nous sommes donné des noms de types : • un type de base T, • un type de liste LT sur ce type de base. • Nous nous sommes donné des fonctions et leurs propriétés : • cree_vide , ... , • est_vide ( cree_vide () ) = Vrai , … . • Nous n’avons pas besoin de devenir plus concrets. C’est un type de données abstrait. Cours d'algorithmique 2 - Intranet
2 1 2 1 5 5 Exemple d’implantation----------------------------------------------------------------- ajout_liste( 5 , ) ajout_liste( 5 , cree_vide () ) Cours d'algorithmique 2 - Intranet
tete_liste( ) 5 2 1 5 Exemple d’implantation----------------------------------------------------------------- queue_liste( ) 2 1 5 2 1 Cours d'algorithmique 2 - Intranet
Listes et piles----------------------------------------------------------------- L I S T E S E T P I L E S ! ! ! Cours d'algorithmique 2 - Intranet
5 1 2 Listes et piles----------------------------------------------------------------- Cours d'algorithmique 2 - Intranet
5 1 2 Listes et piles----------------------------------------------------------------- 5 2 1 Cours d'algorithmique 2 - Intranet
5 1 2 Listes et piles----------------------------------------------------------------- 5 2 Pile ( d’assiettes ) stack en anglais 1 Cours d'algorithmique 2 - Intranet
5 1 2 Listes et piles----------------------------------------------------------------- ajout_liste = push = empiler tete_liste = top = sommet queue_liste = pop = dépiler 5 2 Pile ( d’assiettes ) stack en anglais 1 Cours d'algorithmique 2 - Intranet
5 1 2 LIFO ! Listes et piles----------------------------------------------------------------- ajout_liste = push = empiler tete_liste = top = sommet queue_liste = pop = dépiler 5 2 Pile ( d’assiettes ) stack en anglais 1 Cours d'algorithmique 2 - Intranet
Listes et piles : les différences----------------------------------------------------------------- • Les piles sont restreintes aux opérations : • top , pop et push ( et la détection de la pile vide ), • celles-ci sont réalisées de façon efficace dans le processeur, • par le biais d’un tableau !!! Cours d'algorithmique 2 - Intranet
Listes et piles : les différences----------------------------------------------------------------- • Les piles sont restreintes aux opérations : • top , pop et push ( et la détection de la pile vide ), • celles-ci sont réalisées de façon efficace dans le processeur, • par le biais d’un tableau !!! • Les listes peuvent comporter entre autres : • en plus de ajout_liste , tete_liste et queue_liste (+ liste vide), • des fonctions comme inserer_liste , supprimer_liste, … , • être doublement chaînées ( cf. TD ) ou circulaires, • et ne sont plus des tableaux ! Cours d'algorithmique 2 - Intranet
6 4 2 Listes et piles : les différences----------------------------------------------------------------- • Les piles sont restreintes aux opérations : • top , pop et push ( et la détection de la pile vide ), • celles-ci sont réalisées de façon efficace dans le processeur, • par le biais d’un tableau !!! • Les listes peuvent comporter entre autres : • en plus de ajout_liste , tete_liste et queue_liste (+ liste vide), • des fonctions comme inserer_liste , supprimer_liste, … , • être doublement chaînées ( cf. TD ) ou circulaires, • et ne sont plus des tableaux ! Cours d'algorithmique 2 - Intranet
Listes et piles : les différences----------------------------------------------------------------- • Les piles sont restreintes aux opérations : • top , pop et push ( et la détection de la pile vide ), • celles-ci sont réalisées de façon efficace dans le processeur, • par le biais d’un tableau !!! • Les listes peuvent comporter entre autres : • en plus de ajout_liste , tete_liste et queue_liste (+ liste vide), • des fonctions comme inserer_liste , supprimer_liste, … , • être doublement chaînées ( cf. TD ) ou circulaires, • et ne sont plus des tableaux ! 6 4 2 Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> typedef int type_base; typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste; Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> typedef int type_base; typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste; Le nom du type de base. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> typedef int type_base; typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste; Le nom du type de base. La structure elle-même. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> typedef int type_base; typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste; Le nom du type de base. La structure elle-même. La structure s’appelle t_maillon. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> typedef int type_base; typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste; Le nom du type de base La structure elle-même Le type du pointeur sur une telle structure s’appelle ptr_liste. La structure s’appelle t_maillon. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- S o y o n s p l u s c o n c r e t s !!! Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste cree_vide (void) { return( (ptr_liste)NULL ); } int est_vide (ptr_liste liste) { return( liste == (ptr_liste)NULL ); } type_base tete_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->valeur ); } ptr_liste queue_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->suivant ); } Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste cree_vide (void) { return( (ptr_liste)NULL ); } int est_vide (ptr_liste liste) { return( liste == (ptr_liste)NULL ); } type_base tete_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->valeur ); } ptr_liste queue_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->suivant ); } Création de la liste vide. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste cree_vide (void) { return( (ptr_liste)NULL ); } int est_vide (ptr_liste liste) { return( liste == (ptr_liste)NULL ); } type_base tete_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->valeur ); } ptr_liste queue_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->suivant ); } Création de la liste vide. Le prédicat de liste vide ou non. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste cree_vide (void) { return( (ptr_liste)NULL ); } int est_vide (ptr_liste liste) { return( liste == (ptr_liste)NULL ); } type_base tete_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->valeur ); } ptr_liste queue_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->suivant ); } Création de la liste vide. Le prédicat de liste vide ou non. Rendre la tête d’une liste non vide. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste cree_vide (void) { return( (ptr_liste)NULL ); } int est_vide (ptr_liste liste) { return( liste == (ptr_liste)NULL ); } type_base tete_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->valeur ); } ptr_liste queue_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->suivant ); } Création de la liste vide. Le prédicat de liste vide ou non. Rendre la tête d’une liste non vide. On s’assure que la liste n’est pas la liste vide. Préférable : ( liste != cree_vide() ) Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste cree_vide (void) { return( (ptr_liste)NULL ); } int est_vide (ptr_liste liste) { return( liste == (ptr_liste)NULL ); } type_base tete_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->valeur ); } ptr_liste queue_liste (ptr_liste liste) {assert( liste != (ptr_liste)NULL ); return( liste->suivant ); } Création de la liste vide. Le prédicat de liste vide ou non. Rendre la tête d’une liste non vide. Rendre la queue d’une liste non vide. Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste ajout_liste (type_base elt, ptr_liste liste) {ptr_liste ptr_auxil; ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon)); ptr_auxil->valeur = elt; ptr_auxil->suivant = liste; return( ptr_auxil );} Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste ajout_liste (type_base elt, ptr_liste liste) {ptr_liste ptr_auxil; ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon)); ptr_auxil->valeur = elt; ptr_auxil->suivant = liste; return( ptr_auxil );} ??? ptr_liste ??? Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste ajout_liste (type_base elt, ptr_liste liste) {ptr_liste ptr_auxil; ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon)); ptr_auxil->valeur = elt; ptr_auxil->suivant = liste; return( ptr_auxil );} ??? ptr_liste elt Cours d'algorithmique 2 - Intranet
Listes en langage C----------------------------------------------------------------- ptr_liste ajout_liste (type_base elt, ptr_liste liste) {ptr_liste ptr_auxil; ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon)); ptr_auxil->valeur = elt; ptr_auxil->suivant = liste; return( ptr_auxil );} liste ptr_liste elt Cours d'algorithmique 2 - Intranet