2.01k likes | 2.41k Views
Structures de Données. Algorithmique et Conception Objet. But du cours. Ce cours se propose de traiter des problèmes algorithmiques relatifs aux Structures de Données autrement appelées Conteneurs. Plan du cours. Mise en œuvre de conteneurs - Généralités
E N D
StructuresdeDonnées Algorithmique et Conception Objet
But du cours Ce cours se propose de traiter des problèmes algorithmiques relatifs aux Structures de Données autrement appelées Conteneurs. Structures de Données, 2
Plan du cours • Mise en œuvre de conteneurs - Généralités • Conteneurs linéaires : TABLES & LISTES • Conteneurs arborescents : ARBRES • Conteneurs en réseaux : GRAPHES Structures de Données, 3
Chapitre I Mise en œuvre de conteneurs définition sémantique de référence ou de valeur généricité conclusion Structures de Données, 4
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité • Un conteneur, ou collection, est un objet qui réalise une structure de données qui « contient » d’autres objets. • Les conteneurs fondamentaux sont : • les tables, • les listes, • les piles, • les files, • les arbres, • les graphes, • les dictionnaires, • pour ne citer que les plus importants. Structures de Données, 5
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité La puissance apportée par la Conception Objet ne vient pas tant de ce que celle-ci sait faire, mais plutôt de ce qu’elle est capable d’apprendre. Autrement dit, la logique de gestion du conteneur étant indépendante du contenu, on ne s ’attachera qu’à définir le comportement du conteneur. L ’outil privilégié qu’offre la Conception Objet est la GENERICITE Factorisation du type contenu Structures de Données, 6
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité • La spécification d ’un conteneur pose deux questions essentielles, auxquelles il est nécessaire de répondre : • Le conteneur est-il homogène ou hétérogène ? • A-t-il une sémantique de référence ou une sémantique de valeur ? Structures de Données, 7
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Homogène ou Hétérogène ? Un conteneur qui contient des objets d ’un seul type est dit homogène. Inversement, un conteneur qui contient des objets de types différents est dit hétérogène. De tels conteneurs contiennent souvent des objets qui sont tous dérivés d’une classe de base commune. Structures de Données, 8
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Sémantique de référence ou de valeur ? Les conteneurs qui contiennent des objets sont dits avoir une sémantique par valeur. Les conteneurs ayant une sémantique de référence ne contiennent pas des copies de valeurs, ils stockent des références sur des objets. Structures de Données, 9
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité • Sémantique de valeur • Aucun objet n’est contenu dans deux conteneurs ou plus ( il n’y a pas de partage). • Un objet est copié dans un conteneur ; si vous dites Allouer ConteneurVal de Chose conteneur construire (conteneur) Allouer Chose t construire (t) conteneur.ajout(t) une nouvelle Chose est créée dans le conteneur (constructeur par copie). Les modifications futures de la Chose dans le conteneur n ’affecteront pas t et inversement. • Lorsque le conteneur est détruit, les objets qu’il contient sont aussi détruits. Structures de Données, 10
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité • Sémantique de référence • Un objet peut être « dans » plus d ’un conteneur puisque chaque conteneur contient juste une référence sur l’objet. • Mettre un objet dans un conteneur ne nécessite pas une copie de l ’objet. • Lorsque le conteneur est détruit, les objets qu’il contient ne sont pas détruits. • Il y a un problème lorsque l’objet contenu dans un conteneur est détruit. En l’absence d’un mécanisme qui permette de notifier la destruction de cet objet au conteneur, le conteneur restera avec une référence pendante. Structures de Données, 11
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Hétérogène avec une sémantique par valeur Ces conteneurs sont difficiles à concevoir. Ce type conteneur étant basé, pour ce qui relève du mécanisme d ’ajout, sur le constructeur par copie de l’objet contenu, le problème majeur vient du fait qu’un conteneur hétérogène ne connaît pas le type réel de l ’objet et par conséquent ne peut pas appeler le constructeur par copie de l ’objet. Structures de Données, 12
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Homogène avec une sémantique par valeur Les patrons ou types paramètrés supportent directement ce type de conteneur. Cf. Généricité et Cours de Y. Rémion Structures de Données, 13
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Sémantique par référence (homogène ou hétérogène) Ce type de conteneur repose sur l ’utilisation de pointeurs qui permettent le partage par plusieurs conteneurs d’un même objet. Pour un conteneur hétérogène, les pointeurs pointent sur une classe de base commune ; cela permet d’ajouter dans le conteneur des pointeurs sur des classes dérivées. Lorsqu’un conteneur est détruit, les objets référencés ne doivent pas être détruits systématiquement (ils sont peut-être partagés ). Structures de Données, 14
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Une collection de N possède de façon intrinsèque beaucoup de mécanismes analogues (du point de vue de la gestion de la collection) à une collection de R. Structures de Données, 15
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Principe Un algorithme classique est, la plupart du temps, dépendant des données qu’il manipule. Toute modification de ces données, même minime, peut engendrer des effets de bords indésirables. La démarche Objet permet de dissocier l’algorithme des données sur lesquelles il opère. Ce principe, appelé généricité, repose sur une mise en facteurs des moyens nécessaires à la gestion d’un type X de données. Structures de Données, 16
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Algorithmes génériques Plus généralement, un outil générique est un outil dans lequel certaines informations n’ont pas été précisées et devront l’être plus tard. Classe A Algorithme instancié A Algorithme générique Algorithme instancié B Classe B Structures de Données, 17
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité • Concevoir « générique » • Dans beaucoup de cas, l’algorithme que l’on recherche existe déjà sur d’autres types de données. Le choix d’implémentation est alors : • soit de le transposer sur le nouveau type d ’objets, • soit de le rendre générique, puis l ’instancier sur le nouveau type d ’objets. • La différence entre ces deux choix réside dans le caractère de généralité du résultat obtenu. Structures de Données, 18
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité • Le premier choix repose sur une vision algorithmique conventionnelle (copier-coller). Il impose une réécriture systématique de l ’algorithme, dès lors que le type varie. • Le second choix impose un effort d ’abstraction supérieur par rapport au premier. Il n’est pas facile en effet, lors de la résolution d’un nouveau problème sur lequel l’attention est nécessairement concentrée, d’oublier le court terme. Structures de Données, 19
Généralités Conteneurs Linéaires définition sémantique du conteneur généricité Algorithme A Algorithme X Algorithme B Classe B Algorithme B Algorithme C Classe C Algorithme C Algorithme D Classe D Algorithme D Généricité Structures de Données, 20
Généralités Conteneurs Linéaires En résumé : Une classe est générique si un ou plusieurs des types d’objets qui y sont employés ne sont pas encore définis, et devront donc être spécifiés ultérieurement lors de l’instanciation de la classe. L’intérêt de passer par une conception générique d’un conteneur, quel que soit son type, va permettre de focaliser toute l ’attention du concepteur sur les moyens que devra mettre en œuvre ce conteneur. Structures de Données, 21
Chapitre II Conteneurs linéaires introduction tables listes (chaînage simple, double et circulaire) piles et files graphe d’héritage des conteneurs linéaires conclusion Structures de Données, 22
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Introduction Les applications usuelles de l’informatique sont appelées à traiter des collections d’objets construites en assemblant quantité d ’objets homogènes. L’exemple le plus banal de ces collections est fourni par les conteneurs linéaires dans lesquels les objets d’un même type sont déposés les uns à côté des autres. COLLECTION CONTENEUR LINEAIRE TABLE LISTE Structures de Données, 23
COLLECTION CONTENEUR LINEAIRE TABLE LISTE Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Introduction « objets d’un même type sont déposés les uns à côté des autres » Conceptuellement & sous sa forme mémoire Conceptuellement 0 1 2 3 2 0 1 3 Structures de Données, 24
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Introduction Le choix de la structure de données sous-jacente dépend alors de l ’usage du conteneur. Si l’objectif majeur du conteneur repose sur ses performances à l’exécution, un conteneur de type TABLE se présentera comme le meilleur compromis. Si celui-ci s’insère dans un traitement où les éléments sont fréquemment insérés ou supprimés rien n’interdit d’opter pour un conteneur de type LISTE, ce dernier étant réhabillé de sorte que l ’utilisateur le perçoive comme une table. Structures de Données, 25
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Introduction L’intérêt de la COO permet ici de cacher la gestion interne du conteneur. Le choix d ’implémentation de tel ou tel conteneur est un acte qui relève du concepteur de l’application. Structures de Données, 26
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion • La TABLE implante un conteneur dans lequel les objets d’un même type sont déposés les uns à côté des autres, dans des espaces mémoires contigus. • Accès direct aux objets de rang n est une fonctionnalité naturelle pour ce type de conteneur, • Moyen de stockage simple quand la « volatilité » des objets contenus est faible (peu insertion ou peu de suppression), • Structure statique. A savoir que l’opération de re-dimensionnement impose pour l ’utilisateur un choix volontariste et pour le concepteur, une opération explicite. Structures de Données, 27
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Nom : Tab de X Dépend de : X, type de l ’objet contenu Rôle : Implantation du conteneur TABLE. Interface utilisateur Variables Globales / Champs Publics : Fonctions et opérateur : construire(acreer ex Tab de X, n nouv N, z nouv Z, x nouv X) indéxée par [z,z+n[ construire(acreer ex Tab de X, n nouv N, x nouv X) indéxée par [0,n[ construire(acreer ex Tab de X, x nouv X) indéxée par [0,1[ construire(acreer ex Tab de X, t cons Tab de X) op = (acreer ex Tab de X, t cons Tab de X) res ex Tab de X constructeur par copie et réaffecteur (même espace d’indexation allocation même taille recopie des éléments) détruire(adet ex Tab de X) destructeur (libère espace alloué) p 1/2 Structures de Données, 28
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Autres fonctions : IndexPremierElem (t cons Tab de X) res nouv Z Index de début IndexDernierElem (t cons Tab de X) res nouv Z Index de fin (dernier utilisé : z+n-1) NombreElem (t cons Tab de X) res nouv N n IndexValide (t cons Tab de X) res nouv B Déroutable par ErrIndexInvalide z dans espace indexation de t ? op [ ] (t ex Tab de X, Z nouv z) res ex X Déroutable par ErrIndexInvalide accès à l'élément n° z écrire Indisponible, utiliser la fonction écrire du type X saisir Indisponible, utiliser la fonction saisir du type X p 2/2 Propriétés : Aucune propriété particulière imposée au type X Structures de Données, 29
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion La construction construire(acreer ex Tab de X, n nouv N, z nouv Z, x nouv X) Indice du premier élément Taille de la table Référence sur la table acreer de X Référence sur l’étalon de construction Structures de Données, 30
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Allouer Tab de N tb construire (tb, 8, 2, N éphémère (8)) tb[i] 8 8 8 8 8 8 8 8 i [2,9] i 2 3 4 5 6 7 8 9 Allouer Tab de N tb construire (tb, 8, N éphémère (3)) tb[i] 3 3 3 3 3 3 3 3 i [0,7] i 0 1 2 3 4 5 6 7 Structures de Données, 31
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Allouer Tab de N tb construire (tb, N éphémère (8)) tb[i] 8 i [0,1[ i 0 Allouer Tab de N tin, tout construire (tin, 8, N éphémère (3)) construire (tout, tin) tin[i] 3 3 3 3 3 3 3 3 i 0 1 2 3 4 5 6 7 i [0,7] tout[i] 3 3 3 3 3 3 3 3 Structures de Données, 32
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion • Réalisation des constructeurs de Tab • réserver un espace mémoire de nb X, • maintenir l’adresse retournée, • initialiser le nombre maximum d’occurrences, • initialiser l’indice de la première occurrence. • Le mécanisme mis en œuvre est comparable à la création d’objets durables non nommés (Cf. Cours Algo) pour lequel on va : • réserver nb espace(s) mémoires contigus typés de type X, • mémoriser l ’adresse du premier élément. Structures de Données, 33
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Rappel sur les Objets durables non nommés Il est utile de savoir créer des objets non nommés durables (nb et valeurs inconnus à la compilation) Pour ce faire les méta-fonctions suivantes seront supposées exister pour tout type T et toute liste de paramètres licite pour construire un T : T durable ( paramètres ) res nouv Adr de T début Allouer T t construire (t, paramètres) construire (res, Adresse(t)) Fin[, Eliminerparamètres/copie] [, Oublier t, paramètres/référence ] Structures de Données, 34
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion & Res nouv Adr de X tb[i] 8 8 8 8 8 8 8 8 i 2 3 4 5 6 7 8 9 • réserver sur le tas un espace mémoire de nb X, • maintenir l’adresse retournée, • initialiser le nombre maximum d’occurrences, • initialiser l’indice de la première occurrence. i [2,9] Allouer Tab de N tb construire (tb, 8, 2, N éphémère (8)) Structures de Données, 35
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Recyclage des erreurs à la construction La réservation de Xs durables est ici explicitement définie par le concepteur de la classe Tab. Cette étape est susceptible de provoquer des erreurs qu’il est obligatoire de prendre en compte. Mise en place d’un mécanisme d’exception adapté ErrAllocationMémoire construire(acreer ex Tab de X, ???) Déroutable par ErrAllocationMémoire Structures de Données, 36
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Recyclage des erreurs à la construction construire (acreer ex Tab de X, n nouv N, x ex X) Déroutable par ErrAllocationMémoire Début Si « réservation des n Xs est effectuée sans anomalie » Alors Deb ?? Fin Sinon Dérouter par ErrAllocationMémoire éphémère () Fin Eliminer n,??, Oublier acreer,x,?? Structures de Données, 37
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion • Le destructeur • Cette fonctionnalité doit veiller à restituer l’ensemble de la mémoire consommée par la table adet. • détruire (adet ex Tab de X) • Son objectif consiste à : • détruire les instances de adet, • rendre l’espace mémoire affecté à ces instances, ce qui revient à oublier l’adresse retournée lors de la construction de adet Structures de Données, 38
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion • Le réaffecteur • op = (dst ex Tab de X, src ex Tab de X) • res ex Tab de X • Déroutable par ErrAllocationMémoire • Son objectif consiste à : • éliminer dst (détruire et rendre), • allouer dst (cf. Constructeur par copie) • copier le contenu de src dans dst (cf. Constructeur par copie). Structures de Données, 39
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion L’opérateur d’indexation [ ] op [] (t ex Tab de X, z nouv Z) res ex X Déroutable par ErrIndexInvalide Allouer Tab de N tb construire (tb, 8, 2, N éphémère (8)) tb[i] 8 8 8 8 8 8 8 8 i [2,9] i 2 3 4 5 6 7 8 9 Structures de Données, 40
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion tb[3]=6 tb[7]=0 tb[i] 8 6 8 8 8 0 8 8 i [2,9] i 2 3 4 5 6 7 8 9 tb[12]=9 tb[0] =5 ErrIndexInvalide i [2,9] Structures de Données, 41
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion • L’opérateur d’indexation [ z nouv Z] • Son principe algorithmique repose sur : • identification de l ’adresse Adr1 de X d ’implantation mémoire de la table, • décalage par rapport à cette adresse de Adr2 de X = Adr1 de X + index * taille_de(X) • déréférencement d ’un X en Adr2 de X, Structures de Données, 42
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Nom : Adr de T Dépend de : T, type de l ’objet pointé Rôle : Pointeur de T, objet mémorisant l ’adresse d ’un objet de type T, on dit aussi « pointant sur » un objet de type T. Interface utilisateur Propriétés : Aucune propriété particulière imposée au type T Structures de Données, 43
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion L ’opérateur d ’indexation [ z nouv Z] Allouer Tab de N tb construire (tb, 8, 2, N éphémère (8)) tb[i] 8 8 8 8 8 6 8 8 i [2,9] i 2 3 4 5 6 7 8 9 … tb[7]=6 … Adr1 Adr2 = Adr1 + 5 * taille de X 8 Arithmétique pointeur Structures de Données, 44
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Autres fonctionnalités Programme test_tab Début Allouer Tab de N tb construire (tb, 8, 2, N éphémère (0)) écrire (IndexPremierElem(tb), OUT) écrire (IndexDernierElem(tb), OUT) écrire (NombreElem(tb), OUT) écrire (IndexValide(tb, 5), OUT) Fin Eliminer tb $ test_tab 2 9 8 Oui $ Structures de Données, 45
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Problème du parcours d’une TABLE L’idée la plus simple consiste à parcourir la table dans l’ordre croissant de ses indices. On obtient ainsi le schéma d’énumération séquentiel “de gauche à droite” des éléments de la table. Allouer Z i Allouer Tab de N tb construire (tb, 8, 2, N éphémère (8)) construire (i, IndexPremierElem (tb)) … tantque i <= IndexDernierElem (tb) Faire deb écrire (tb[i], OUT) i = i + 1 fin … Structures de Données, 46
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Algorithmes d’accès à un élément d’une TABLE Soit une table T[imin … imax]. L’accès par position est défini par la fonction d’indexation T[i]. L’accès associatif est le plus courant. Soit elem une variable contenant une valeur de même type que celles contenues dans T, on veut déterminer s’il existe un indice i [imin … imax] tel que T[i] = elem. Cet accès peut être réalisé de plusieurs manières suivant que l’on suppose T trié ou non. Structures de Données, 47
Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Recherche séquentielle / TABLE non triée • Raisonnement par récurrence : • Supposons traités les i-1 ( [z < i < z + n[ ) premiers éléments de la table T, et que elem T[z … i-1]. • i = z + n elem T[z … z + n[ l’algorithme est terminé, elem T. • i < z + n • T[i] = elem elem [z … z + n[, l’algorithme est terminé, elem T • T[i] elem elem T[z … i], l ’exécution de l ’instruction i = i + 1 permet de déclencher l’assertion elem T[z … i-1]. Structures de Données, 48
A B A et B vrai vrai vrai vrai faux faux faux non examiné faux Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Recherche séquentielle / TABLE non triée INVARIANT • Initialisation • l’action i = z permet de déclencher l ’assertion précédente • Progression • i = i + 1 • Test d ’arrêt • i < z + n Et T[i] elem Structures de Données, 49
i = z + n vrai faux (i < z + n) faux (i < z + n) T[i] = elem non examiné vrai faux résultat faux vrai faux Généralités Conteneurs Linéaires introduction tables / listes / piles / files graphe héritage conclusion Recherche séquentielle / TABLE non triée Phase de progression Structures de Données, 50