1.49k likes | 1.7k Views
COURS DE PROGRAMMATION ORIENTEE OBJET :. Types Abstraits de Données TAD. Types Abstraits de Données(TAD). Les TAD sont nés des problèmes liés au développement d’applications: maîtriser la complexité -> modularité
E N D
COURS DE PROGRAMMATION ORIENTEE OBJET : Types Abstraits de Données TAD
Types Abstraits de Données(TAD) Les TAD sont nés des problèmes liés au développement d’applications: maîtriser la complexité -> modularité réutiliser du code existant -> fournir des solutions pour des familles de problèmes (bibliothèques à usage générale). traiter des problèmes de haut niveau en s’affranchissant des problèmes de niveau inférieur déjà résolus -> abstraction des données.
Les principes de conception Modularité Abstraction des données Encapsulation Types Abstraits de Données(TAD)
Idée directrice Parallèle avec les types primitifs Le type int : représente un entier, est fourni avec des opérations : + - / * %. Il n’est pas nécessaire de connaître la représentation interne ou les algorithmes de ces opérations pour les utiliser. Types Abstraits de Données(TAD)
Idée directrice Faire de même pour des types plus complexesindépendamment d’un langage de programmation Créer un type, dont la représentation interne est cachée. Offrir les opérations de haut niveau nécessaires. Types Abstraits de Données(TAD)
Définition Un TAD est un type de données l’ensemble des opérations permettant de gérer ces données les détails de l’implantation restant cachés Types Abstraits de Données(TAD)
Exemple : le TAD liste TypeLISTE Utilise Element, Boolean, Place Les opérations : Constructeurs Creer: =>Liste (crée une liste vide) Ajouter: Element × Liste => Liste AjouterPos: Element × Liste × Place => Liste Types Abstraits de Données(TAD)
Exemple : le TAD liste Selecteurs tete : Liste => Element queue : Liste=>Liste longueur : Liste=> Element estVide : Liste => Boolean Modificateurs Enlever : Liste × Place => Liste Modifier : Liste × Place × Element => Liste Types Abstraits de Données(TAD)
Réalisation d’un TAD Définition : Une structure de données est une construction du langage de programmation permettant de représenter un TAD. Exemple : On peut utiliser comme structure de données un tableau pour implanter une liste. Types Abstraits de Données(TAD)
Intégration du principe de l’encapsulation: On pourra construire plusieurs structures de données pour un même TAD. Un TAD peut être vu comme un fournisseur de services sur un sujet précis (vecteurs, listes…) concrétisé par une structure de données appropriée Types Abstraits de Données(TAD)
Réalisation d’un TAD en Java Java fournit les mécanismes suivants: Classes Exceptions Généricité Types Abstraits de Données(TAD)
Réalisation d’un TAD en Java ClassesMasquage de la structure interne du TAD : Visibilité privée pour les attributs de la classe décrivant la structure de donnée choisie. Visibilité publique pour les méthodes. Exceptions Permettent une gestion de erreurs pouvant survenir lors de l’utilisation d’un TAD. Types Abstraits de Données(TAD)
Réalisation d’un TAD en Java Généricité Avant la JDK5.0, la généricité consiste à écrire du code en utilisant la classe Object.Inconvénient : possibilité d’ajouter à la structure des éléments de différents types -> structures de données non homogènes. Depuis la JDK5.0, Java propose une gestion de types « génériques » permettant de contrôler le type de éléments insérés. Types Abstraits de Données(TAD)
Spécification d’un TAD en Java Java propose le concept d’interface Degré d’abstraction plus élevé. Définition formelle d’un TAD. Déclaration des méthodes de manière abstraite. La classe qui implante l’interface encapsule la structure de données choisie et fournit le code des méthodes déclarées dans l’interface. Types Abstraits de Données(TAD)
Il existe différentes familles de types de données abstraits. Nous allons nous intéresser aux Types Abstraits de Données décrivant les organisations complexes (containers). Types Abstraits de Données(TAD)
Exemples: Gestion d’un annuaire : Insertion de personnes Suppression de personnes Recherche de personnes suivant leur nom Gestion d’une file d’attente: Ajouter des personnes en fin de file Traiter la personne en début de file Types Abstraits de Données(TAD)
Les objectifs : Définir les différents types d’ensembles dynamiques. Présenter les techniques permettant de les implanter efficacement en fonction du problème. Types Abstraits de Données(TAD)
Les opérations sur un TAD sont de quatre types : Constructeurs Modificateurs Sélecteurs Itérateurs Autres dénominations : Constructeurs/Extenseurs Types Abstraits de Données(TAD)
Plan d’étude Les structures linéaires Les arbres Les ensembles Les tables Types Abstraits de Données(TAD)
A – Les structures linéaires Les listes Le TAD liste Le TAD pile Le TAD file Le TAD file de priorités Implémentation en Java
1 - Les listes Généralités Définition: Une liste est formée d’une séquence d’éléments d’un type donné, dont le nombre peut être borné ou illimité. Exemples : liste de passage à un examen, file d’attente à un guichet. Une liste pourra être triée ou non.
1 - Les listes Deux structures de données pour implémenter une liste: Implémentation statique par un tableau Implémentation dynamique par une liste chaînée
1 - Les listes Implémentation par un tableau Représentation Oblige à faire une estimation du nombre maximum d’éléments dans la liste. Entraîne des temps de calculs importants pour réaliser les insertions et les suppressions [ou tableau chainage] 1 2 3 taille info2 info3 info1 début fin
1 - Les listes Implantation par une liste chaînée Une liste chaînée est une structure de données dans laquelle les objets sont arrangés linéairement. Chaque élément de la liste devra indiquer l’adresse de l’élément suivant. Un élément est donc représenté par un couple composé d’une information et d’une adresse, appelé cellule.
1 - Les listes Implantation par une liste chaînée Une liste chaînée est constituée d’un ensemble de cellules chaînées entre elles. C’est l’adresse de la première cellule qui détermine la liste b a c liste
1 - Les listes Implantation par une liste chaînée Allocation dynamique à la demande. Les éléments sont dispersés en mémoire centrale. Pas de déplacement des éléments en cas d’insertion ou de suppression. b b a d c a d c x Suppression de l’élément c Insertion d’un élément x
1 - Les listes Accès aux éléments d’une liste Comment caractériser les opérations sur les listes? La recherche d’un élément dont on connaît une partie de l’information : pas d’ambiguïté L’insertion, la suppression et la consultation nécessitent la mention de la position où s’effectue l’opération.
1 - Les listes Accès aux éléments d’une liste Il existe plusieurs TAD classiques suivant les types d’insertion et de suppression choisis : Liste : rien de défini Pile (LIFO) : insertion et suppression à la fin. File (FIFO) : suppression au début, insertion à la fin. File de priorité : insertion suivant un critère d’ordre, suppression au début.
2 – TAD liste Les opérations Constructeur Créer une liste vide Modificateurs Insérer une valeur au début d’une liste Supprimer un élément d’une liste Supprimer tous les éléments d’une liste
2 – TAD liste Les opérations Sélecteurs Savoir si une liste est vide Obtenir la longueur d’une liste Déterminer la valeur du début d’une liste Rechercher un élément dans une liste Vérifier si une liste est égale à une autre liste
3 - TAD pile Définition: Une pile est une liste pour laquelle l’insertion et la suppression ont lieu toutes les deux au sommet. Analogie avec la pile d’assiettes Applications : Analyse des expressions par un compilateur Allocation de la mémoire pour les variables locales lors de l’exécution des procédures Empiler [PUSH] (insérer) Dépiler [POP] (supprimer) Sommet de la pile
3 - TAD pile Les opérations Constructeur Créer une pile vide Modificateurs Empiler une valeur au sommet de la pile (push) Désempiler (pop) Supprimer tous les éléments
3 - TAD pile Les opérations Sélecteur Savoir si une pile est vide Obtenir la longueur d’une pile Déterminer la valeur du sommet d’une pile Vérifier si une pile est égale à une autre pile
3 - TAD pile Application 1: Ecrire un algorithme qui vérifie qu’un texte contenant des caractères standards est syntaxiquement correct du point de vue des parenthèses. Les parenthèses sont de trois types : (, {, [ et leurs parenthèses fermantes correspondantes sont respectivement ), }, ]. La correction syntaxique implique qu’à chaque parenthèse ouvrante corresponde une parenthèse fermante du même type, plus loin dans le texte. Le texte compris entre ces deux parenthèses devra également être correct du point de vue des parenthèses.
3 - TAD pile Application 1: Solution Données : c un tableau de N caractères qui contient le texte. Algorithme : créer une pile de caractères p vide. pour i = 0 à N-1 faire si (c[i] est une parenthèse ouvrante) alors p.empiler(c[i]) sinon si (c[i] est une parenthèse fermante) { si (p.estVide()) { stop « erreur : il manque une parenthèse ouvrante » } si (p.sommet() est du même type que c[i]) { p.depiler() } sinon { stop « erreur : la parenthèse fermante n’est pas du bon type » } finsi finsi finsi finPour si (p.estVide()) alors afficher « la syntaxe est correcte » sinon afficher « il manque une parenthèse fermante » finsi
3 - TAD pile Application 2: Les piles sont utilisées pour implémenter la récursivité par les langages de programmation. Chaque langage, autorisant la récursivité,utilise une pile «d’enregistrements actifs » pour enregistrer les informations relatives à chaque procédure active du programme.
3 - TAD pile Application 2: Utilisation des piles par la JVM en cas d’appels récursifs d’une méthode: La JVM garde en mémoire la chaîne des méthodes actives dans une pile. Quand une méthode est appelée, la JVM empile un cadre contenant les variables locales, les valeurs à retourner et l’adresse de retour, i.e. le point où cette méthode a été appelée par la méthode appelante. Quand une méthode est terminée, son cadre est retiré de la pile et le contrôle est passé à la nouvelle méthode du haut de la pile au point indiqué par l’adresse de retour.
4 - TAD File Définition : Une file est une liste pour laquelle l’insertion a lieu à la fin (dépôt) et la suppression ( prélèvement) au début. Analogie avec une file d’attente Applications :Une file sera utilisée quand il faudra gérer l’allocation d’une ressource à plusieurs clients. File d’impression Simulation de files réelles (guichet, trafic automobile…) prélever déposer tête de la file fin de la file
4 - TAD File Les opérations Constructeur Créer une file vide Modificateurs Déposer une valeur à la fin de la file Prélever la valeur de début de la file Effacer tous les éléments de la file
4 - TAD File Les opérations Sélecteur Savoir si une file est vide Obtenir la longueur d’une file Déterminer la valeur du début d’une file Vérifier si une file est égale à une autre file
5 - TAD File de priorités Définition : Une file de priorités est une file pour laquelle le dépôt a lieu en fonction d’un critère d’ordre appelé priorité de la file. Le prélèvement est tel que l’élément avec la priorité la plus élevée est le premier à sortir. La file est donc toujours triée selon le critère de priorité.
5 - TAD File de priorités Applications: Ce type de file est largement utilisé dans les systèmes informatisés. Si plusieurs ordinateurs connectés à une même imprimante lancent des tâches d’impression en même temps, on peut décider d’établir un ordre de passage suivant la taille du document.
5 - TAD File de priorités Les opérations: Par rapport à une file, seul le dépôt change. l’élément de fin peut être supprimé car il ne joue aucun rôle particulier.
5 - TAD File de priorités Complexité : Comme le dépôt dépend des éléments déjà présents dans la file de priorités, la complexité est O(n2). Cette complexité peut être abaissée à O(nlog(n)) en utilisant un tas qui est une structure de données arborescente.
6 – Implémentation en Java Spécification du TAD liste package listes; public interface Liste { //modificateur void insererAuDebut(Object element); void effacer(); boolean effacerElement(Object element); //selecteurs boolean estVide(); int longueur(); Object tete() throws ListeVideException; boolean rechercher (Object element); boolean equals(Object o); }
6 – Implémentation en Java Le TAD liste peut être implanter à l’aide de deux structures de données : Un tableau Une structure chaînée
6 – Implémentation en Java Implantation avec une structure chaînée package listes; class Noeud{ protected Object valeur; protected Noeud suivant; public Noeud(){ } public Noeud (Object o){ this.valeur = o; this.suivant=null; } //construire un noeud par copie public Noeud (Noeud n){ this.valeur = n.valeur; this.suivant=n.suivant; } }
6 – Implémentation en Java public class ListeChainee implements Liste{ private Noeud tete; private int longueur; //constructeurs public ListeChainee() { tete = null; longueur =0; } public ListeChainee(ListeChainee listeSource){ tete = listeSource.tete; longueur =listeSource.longueur; } ...
6 – Implémentation en Java //modificateurs public void insererAuDebut (Object element) { Noeud nouveau = new Noeud (element); nouveau.suivant = tete; tete = nouveau; longueur ++; } public void effacer () { tete = null; longueur=0; }
6 – Implémentation en Java public boolean effacerElement( Object element ) { Noeud courant = this.tete; Noeud precedent = null; while (courant != null){ if ((courant.valeur).equals(element)){ longueur--; if (courant == tete){ tete = courant.suivant; return true; } else { precedent.suivant = courant.suivant; return true; } } else { precedent = courant; courant = courant.suivant;} } return false; //élément non trouvé }