cours de programmation orientee objet n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
COURS DE PROGRAMMATION ORIENTEE OBJET : PowerPoint Presentation
Download Presentation
COURS DE PROGRAMMATION ORIENTEE OBJET :

Loading in 2 Seconds...

play fullscreen
1 / 147

COURS DE PROGRAMMATION ORIENTEE OBJET : - PowerPoint PPT Presentation


  • 106 Views
  • Uploaded on

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é

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'COURS DE PROGRAMMATION ORIENTEE OBJET :' - pavel


Download Now An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
cours de programmation orientee objet

COURS DE PROGRAMMATION ORIENTEE OBJET :

Types Abstraits de Données

TAD

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.

slide3

Les principes de conception

Modularité

Abstraction des données

Encapsulation

Types Abstraits de Données(TAD)

slide4

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)

slide5

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)

slide6

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)

slide7
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)

slide8
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)

slide9

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)

slide10

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)

slide11

Réalisation d’un TAD en Java

Java fournit les mécanismes suivants:

Classes

Exceptions

Généricité

Types Abstraits de Données(TAD)

slide12

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)

slide13

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)

slide14

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)

slide15
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)

slide16

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)

slide17

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)

slide18

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)

slide19

Plan d’étude

Les structures linéaires

Les arbres

Les ensembles

Les tables

Types Abstraits de Données(TAD)

a les structures lin aires
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
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 listes1
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 listes2
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 listes3
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 listes4
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 listes5
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 listes6
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 listes7
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
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 liste1
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
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 pile1
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 pile2
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 pile3
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 pile4
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 pile5
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 pile6
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
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 file1
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 file2
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
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 s1
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 s2
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 s3
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
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 java1
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 java2
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 java3
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 java4
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 java5
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é

}

6 impl mentation en java6
6 – Implémentation en Java

//sélecteurs

public boolean equals(Object o) {

if (o==this)

return true;

if (o==null)

return false;

if (o.getClass() != this.getClass())

return false;

...

6 impl mentation en java7
6 – Implémentation en Java

ListeChainee liste = (ListeChainee) o;

if (liste.longueur() != this.longueur())

return false;

Noeud courant1 = liste.tete;

Noeud courant2 = this.tete;

while (courant1 != null){

if(!courant1.valeur.equals(courant2.valeur))

return false;

courant1 = courant1.suivant;

courant2 = courant2.suivant;

}

return true;

}//fin de la méthode equals

6 impl mentation en java8
6 – Implémentation en Java

public boolean rechercher(Object o) {

Noeud courant = this.tete;

while (courant != null){

if ((courant.valeur).equals(o))

return true;

else

courant = courant.suivant;

}

return false;

}

6 impl mentation en java9
6 – Implémentation en Java

public boolean estVide() {

return (this.tete == null);

}

public int longueur() {

return longueur;

}

public Object tete()

throws ListeVideException {

if (estVide())

throw new ListeVideException();

return tete.valeur;

}

6 impl mentation en java10
6 – Implémentation en Java

public String toString(){

String s ="[";

Noeud courant = this.tete;

if (courant !=null)

s = s+""+courant.valeur;

while (courant !=null){

s = s +","+ courant.valeur;

courant = courant.suivant;

}

return s + "]";

}

}

}

6 impl mentation en java11
6 – Implémentation en Java

package listes;

public class ListeVideException

extends RuntimeException{

public ListeVideException() {

super("Votre liste est vide");

}

}

6 impl mentation en java12
6 – Implémentation en Java

Spécification du TAD Pile

package pile;

public interface Pile {

//modificateurs

void empiler(Object element);

Object depiler()

throws PileVideException;

void effacer();

//selecteurs

boolean estVide();

Object sommet()

throws PileVideException;

int longueur();

boolean equals(Object o);

}

6 impl mentation en java13
6 – Implémentation en Java

Spécification du TAD File

package file;

public interface File {

// modificateurs

void deposer(Object element);

Object prelever()

throws FileVideException;

void effacer();

// selecteurs

boolean fileVide();

boolean equals (Object o);

Object tete()

throws FileVideException;

int longueur();

}

b les arbres
B – LES ARBRES

Introduction

Un arbre est une collection d’éléments organisés suivant une structure hiérarchique.

Dans de nombreux problèmes, les données sont naturellement structurées de manière arborescente:

Arbre généalogique, organigrammes

Arbre syntaxique

Arbre de décision

Table des matières d’un livre

b les arbres1
B – LES ARBRES

Introduction

Les structures d’arbres permettent d’implémenter efficacement des algorithmes d’insertion, de suppression, de recherche et de tri.

Les arbres conviennent particulièrement bien comme structure de données pour implanter des dictionnaires informatiques.

Les différents SGBD font appels à des arbres particuliers pour l’organisation physique des données et en particulier pour gérer les index.

b les arbres2
B – LES ARBRES

Exemple :Représentation arborescente d’une table des matières

Livre

chapitre2

chapitre3

chapitre1

s11

s12

s21

s22

s23

s31

s32

s221

s222

b les arbres3
B – LES ARBRES

Définition1 d’un arbre

Un arbre est composé de deux ensembles N et A appelés respectivement l’ensemble des nœuds et l’ensemble de arcs et d’un noeud particulier appelé racine de l’arbre.Les éléments de A sont des paires (n1, n2) d’éléments de N.A doit être tel que chaque nœud, excepté la racine, a exactement un parent.

b les arbres4
B – LES ARBRES

Définition2 d’un arbre (récursive)

Un arbre est soit un ensemble vide, soit une paire A(r,S), r étant un nœud et S étant un ensemble d’arbres disjoints ne contenant pas r.

A

r

A1

A2

A3

S

b les arbres5
B – LES ARBRES

Définitions usuelles

Un arbre vide est un arbre ne comportant aucun nœud;

Une feuille est un nœud n’ayant aucun fils;

Un nœud interne est un nœud qui n’est pas une feuille;

Un sous-arbre est un sous-ensemble des nœuds d’un arbre ayant une structure d’arbre.

b les arbres6
B – LES ARBRES

Définitions usuelles

La taille d’un arbre est égale au nombre de nœuds qu’il contient.

L’étiquette d’un nœud est l’information associée à celui-ci.

Le degré d’un nœud est égal au nombre de ses fils;

Le degré d’un arbre est égal au maximum des degrés de tous ses nœuds;

b les arbres7
B – LES ARBRES

Plan d’étude

Les arbres seront traités dans un premier temps comme des TAD.

Les arbres binaires

Les arbres binaires de recherche

On abordera ensuite leur utilisation comme structure de données très efficaces pour implanter plusieurs autres TAD tels que les dictionnaires

1 les arbres binaires
1 – LES ARBRES BINAIRES

Généralités

Définition 1 Un arbre binaire est un arbre de degré deux.Les fils sont appelés fils gauche et fils droit.

Définition2 (récursive)Un arbre binaire est soit vide, soit constitué d’un nœud racine possédant un sous-arbre binaire gauche et un sous-arbre binaire droit.

1 les arbres binaires1
1 – LES ARBRES BINAIRES

TAD Arbre binaire

Construteur

Créer un arbre vide

Modificateurs

Remplacer l’étiquette d’une racine

Accrocher un arbre comme sous-arbre gauche ou droit d’un arbre

Décrocher le sous-arbre gauche ou droit d’un arbre

Effacer le contenu d’un arbre

1 les arbres binaires2
1 – LES ARBRES BINAIRES

TAD Arbre binaire

Sélecteurs

Vérifier si deux arbres sont égaux

Savoir si un arbre est vide

Déterminer l’étiquette de la racine

Obtenir le sous-arbre gauche d’un arbre

Obtenir le sous-arbre droit d’un arbre

1 les arbres binaires3
1 – LES ARBRES BINAIRES

Parcours d’un arbre binaireIl y a plusieurs façon de visiter tous les nœuds d’un arbre pour les afficher ou leur appliquer un traitement.

On va étudier les parcours les plus utilisés :

Parcours préordonné appelé aussi préfixé ou en profondeur

Parcours symétrique

Parcours postordonné appelé aussi postfixé

Parcours en largeur

1 les arbres binaires4
1 – LES ARBRES BINAIRES

Le parcours préordonnéAlgorithme :Si l’arbre n’est pas vide alors

traiter la racine de l’arbre

effectuer le parcours préordonné du sous-arbre gauche

effectuer le parcours préordonné du sous-arbre droit

Fin si

1 les arbres binaires5
1 – LES ARBRES BINAIRES

Le parcours préordonnéApplication à l’arbre suivant:Résultat : A B F G E I

A

B

E

F

G

I

1 les arbres binaires6
1 – LES ARBRES BINAIRES

Le parcours symétriqueAlgorithme :Si l’arbre n’est pas vide alors

effectuer le parcours symétrique du sous-arbre gauche

traiter la racine de l’arbre

effectuer le parcours symétrique du sous-arbre droit

Fin si

Résultat : F B G A I E

1 les arbres binaires7
1 – LES ARBRES BINAIRES

Le parcours postordonnéAlgorithme :Si l’arbre n’est pas vide alorseffectuer le parcours postordonné du sous-arbre gauche

effectuer le parcours postordonné du sous-arbre droit

traiter la racine de l’arbre

Fin si

Résultat : F G B I E A

1 les arbres binaires8
1 – LES ARBRES BINAIRES

Le parcours en largeur

Algorithme :Créer une file videSi l’arbre n’est pas vide alorsdéposer la racine de l’arbre dans la filetantque la file n’est pas vide boucler prélever un nœud dans la file traiter ce nœud pour chaque fils de ce nœud, pris de gauche à droite,boucler

déposer ce nœud dans la file

fin boucler

fin boucler

Fin si

Résultat : A B E F G I

1 les arbres binaires9
1 – LES ARBRES BINAIRES

Application des parcours: les arbres d’expression

Définition d’une expression arithmétique : Combinaison d’opérateurs arithmétiques ( +, -, *, /), d’opérandes et de parenthèses exprimant les priorités des opérations.Chaque expression arithmétique peut être représentée par un arbre binaire appelé arbre d’expression :(a * (b – c)) *

a

-

b

c

1 les arbres binaires10
1 – LES ARBRES BINAIRES

Construction de l’arbre d’expression associé à une expression arithmétique donnée

Construction récursive à l’aide des règles suivantes:

L’arbre d’expression d’un seul opérande est un nœud racine unique le contenant.

Si E1 et E2 sont des expressions représentées par les arbres T1, T2 et si op est un opérateur, alors l’arbre d’expression E1 op E2 est composé d’un nœud racine contenant op et de deux sous-arbres T1 et T2.

1 les arbres binaires11
1 – LES ARBRES BINAIRES

Conversion d’une expression arithmétique exprimée en notation infixée en notation postfixée:A partir de l’arbre d’expression associé à l’expression arithmétique, on peut exprimer l’expression arithmétique en notationpostfixée en utilisant un parcours postordonné.

1 les arbres binaires12
1 – LES ARBRES BINAIRES

Différentes représentations du TAD Arbre Binaire

1. Représentation contiguë par un tableau de nœudsUn nœud est caractérisé par une étiquette, un champ gauche et un champ droite de type entier.Gauche et droite sont des indices permettant de retrouver les sous-arbres gauche et droit d’un nœud.On affectera à gauche (resp. droite) la valeur -1 quand le nœud n’a pas de sous-arbre gauche (resp. droit).

1 les arbres binaires13
1 – LES ARBRES BINAIRES

Différentes représentations du TAD Arbre Binaire

Exemple :

A

B

E

C

D

F

I

G

H

0

1

2

3

4

5

6

7

8

gauche

étiquette

droite

1 les arbres binaires14
1 – LES ARBRES BINAIRES

Différentes représentations du TAD Arbre binaire

2. Représentation chaînéeChaque nœud est caractérisé par

une étiquette

un pointeur vers le fils gauche

un pointeur vers le fils droit

1 les arbres binaires15
1 – LES ARBRES BINAIRES

Différentes représentations du TAD Arbre binaire

2. Représentation chaînée

A

B

E

C

D

F

I

G

H

racine

1 les arbres binaires16
1 – LES ARBRES BINAIRES

Spécification du TAD Arbre binaire en JAVA

package arbresBinaires;

public interface ArbreBinaire {

//modificateurs

public void effacer();

public void modifierRacine(Object e) throws

ArbreBinaireVideException;

public void accrocherGauche(ArbreBinaire a) throws ArbreBinaireVideException;

public void accrocherDroit(ArbreBinaire a) throws ArbreBinaireVideException;

public ArbreBinaire decrocherGauche() throws ArbreBinaireVideException;

public ArbreBinaire decrocherDroit() throws ArbreBinaireVideException;

1 les arbres binaires17
1 – LES ARBRES BINAIRES

Spécification du TAD Arbre binaire en JAVA

//selecteurs

public boolean estVide();

public Object racine() throws ArbreBinaireVideException;

public ArbreBinaire droit() throws ArbreBinaireVideException;

public ArbreBinaire gauche() throws ArbreBinaireVideException;

//parcours pour affichage

public void parcoursSymetrique();

public void parcoursPreOrdonne() ;

public void parcoursPostOrdonne() ;

public void parcoursLargeur() ;

}

1 les arbres binaires18
1 – LES ARBRES BINAIRES

Implantation du TAD Arbre binaire en JAVA en utilisant une structure de données chainée.

package arbresBinaires;

public class Noeud {

protected Object etiquette;

protected Noeud ng;

protected Noeud nd;

public Noeud(Object o) {

etiquette=o;

ng =null;

nd =null;

}

}

1 les arbres binaires19
1 – LES ARBRES BINAIRES

Implantation du TAD Arbre binaire en JAVA

package arbresBinaires;

public class ArbreBinaireVideException extends RuntimeException{

public ArbreBinaireVideException() {

super("Votre arbre est vide");

}

public ArbreBinaireVideException(String msg) {

super(msg);

}

}

1 les arbres binaires20
1 – LES ARBRES BINAIRES

Implantation du TAD Arbre binaire en JAVA

package arbresBinaires;

public class ABChaine implements ArbreBinaire{

protected Noeud racine;

public ABChaine() {

racine = null;

}

public ABChaine(Noeud n) {

racine = n;

}

1 les arbres binaires21
1 – LES ARBRES BINAIRES

//modificateurs

public void effacer(){

racine = null;

}

public void modifierRacine(Object e) throws ArbreBinaireVideException{

if (estVide()) throw new ArbreBinaireVideException();

racine.etiquette=e;

}

1 les arbres binaires22
1 – LES ARBRES BINAIRES

public void accrocherDroit(ArbreBinaire a) throws ArbreBinaireVideException{

if (estVide())

throw new ArbreBinaireVideException();

ABChaine ad = (ABChaine)a;

racine.nd = ad.racine;

1 les arbres binaires23
1 – LES ARBRES BINAIRES

public void accrocherGauche(ArbreBinaire a) throws ArbreBinaireVideException{

if (estVide()) throw new ArbreBinaireVideException();

ABChaine ag = (ABChaine)a;

racine.ng = ag.racine;

}

1 les arbres binaires24
1 – LES ARBRES BINAIRES

public ArbreBinaire decrocherDroit() throws ArbreBinaireVideException{

if (estVide()) throw new ArbreBinaireVideException();

ArbreBinaire a= new ABChaine(racine.nd);

racine.nd= null;

return a;

}

public ArbreBinaire decrocherGauche() throws ArbreBinaireVideException{

if (estVide()) throw new ArbreBinaireVideException();

ArbreBinaire a= new ABChaine(racine.ng);

racine.ng= null;

return a;

}

1 les arbres binaires25
1 – LES ARBRES BINAIRES

//sélecteurs

public ArbreBinaire droit() throws ArbreBinaireVideException{

if (estVide()) throw new ArbreBinaireVideException();

return new ABChaine(racine.nd);

}

public ArbreBinaire gauche() throws ArbreBinaireVideException{

if (estVide()) throw new ArbreBinaireVideException();

return new ABChaine(racine.ng);

}

1 les arbres binaires26
1 – LES ARBRES BINAIRES

public boolean estVide() {

return (racine==null);

}

public Object racine()

throws ArbreBinaireVideException{

if (estVide())

throw new ArbreBinaireVideException();

return racine.etiquette;

}

1 les arbres binaires27
1 – LES ARBRES BINAIRES

public void parcoursSymetrique(){

cf td}

public void parcoursPreOrdonne(){

cf td}

public void parcoursPostOrdonne(){

cf td}

public void parcoursLargeur(){

// todo in td

}

}

2 arbres binaires de recherche
2 - Arbres binaires de recherche

DéfinitionUn arbre binaire de recherche est un arbre binaire satisfaisant aux propriétés suivantes:

L’étiquette de chaque nœud contient une valeur particulière d’un type ordonné appelée clé;

Pour tout sous-arbre, la clé de la racine est strictement supérieure à toutes les clés du sous-arbre gauche et strictement inférieure à toutes les clés du sous-arbre droit.

2 arbres binaires de recherche2
2 - Arbres binaires de recherche

Le TAD arbre binaire de recherche

Constructeur

Créer un arbre vide

Modificateurs

Effacer le contenu d’un arbre

Insérer un élément dans un arbre en fonction de sa clé

Supprimer un élément dans un arbre

2 arbres binaires de recherche3
2 - Arbres binaires de recherche

Le TAD arbre binaire de recherche

Sélecteurs

Les mêmes que pour le TAD arbre binaire

Rechercher un élément dans un arbre

2 arbres binaires de recherche4
2 - Arbres binaires de recherche

Algorithme de recherche d’un élément

si l’arbre est vide alors

signaler que l’élément est introuvable

sinon si(clé de l’élément < clé de la racine)alors rechercher l’élément dans le sous-arbre gauche

sinon si(clé de l’élément > clé de la racine)alors rechercher l’élément dans le sous-arbre droit

sinon retourner la racine

fin si

fin si

fin si

2 arbres binaires de recherche5
2 - Arbres binaires de recherche

Algorithme d’insertion d’un élément

si l’arbre est vide alors

créer une feuille contenant cet élément [=racine]

sinon si(clé de l’élément < clé de la racine)alors insérer l’élément dans le sous-arbre gauche

sinon si(clé de l’élément > clé de la racine)alors insérer l’élément dans le sous-arbre droit

sinon erreur : élément existe déjà dans l’arbre

fin si

fin si

fin si

2 arbres binaires de recherche6
2 - Arbres binaires de recherche

Algorithme de suppression d’un élément

Localiser le nœud à supprimer par une recherche récursive.

Une fois le nœud trouvé, il faut distinguer 3 cas:

Le nœud n’a pas de fils droit;

Le nœud possède un fils droit mais pas de fils gauche;

Le nœud possède deux fils.

Cas 1 et 2, il suffit de court-circuiter le nœud à supprimer.

Cas 3 :

Rechercher la clé maximale dans le sous arbre gauche du nœud à supprimer.

Recopier cet élément dans le nœud à supprimer.

Supprimer le nœud que l’on vient de recopier (cas 1).

2 arbres binaires de recherche7
2 - Arbres binaires de recherche

Algorithme de suppression d’un élément

si l’arbre est vide alors

signaler une erreur (élément introuvable)

sinon si l’arbre ne contient qu’un nœud dont la clé est égale à la clé de l’élément alors retourner l’arbre vide

sinon si(clé de l’élément < clé de la racine)alors supprimer l’élément dans le sous-arbre gauche

sinon si(clé de l’élément > clé de la racine)alors supprimer l’élément dans le sous-arbre droit

sinon //la racine contient l’élément à supprimer et n’est pas une feuille

fin si

fin si

fin si

fin si

2 arbres binaires de recherche8
2 - Arbres binaires de recherche

Algorithme de suppression d’un élément suite

sinon //la racine contient l’élément à supprimer et n’est pas une feuille

si le sous-arbre droit est vide //cas1 alors remplacer l’arbre par son sous-arbre gauche

sinon si le sous-arbre gauche est vide //cas2 alors remplacer l’arbre par son sous-arbre droit

sinon //cas3

rechercher le plus grand élément du sous arbre gauche

remplacer l’étiquette de la racine par celle de ce plus grand élément et supprimer l’élément

fin si

fin si

fin si

fin si

fin si

2 arbres binaires de recherche9
2 - Arbres binaires de recherche

Parcours d’un arbre binaire de recherche

La propriété 2) des arbres binaires de recherche permet

d’afficher toutes les clés de l’arbre dans l’ordre croissant

à l’aide d’un parcours symétrique.

2 arbres binaires de recherche10
2 - Arbres binaires de recherche

Application : On peut donc trier des éléments en utilisant un arbre de recherche :

Insertion des éléments dans l’arbre de recherche

Parcours symétrique de l’arbre obtenu.

L’intérêt réside dans l’efficacité de ce tri.

Complexité : O(nlog(n)).

Il faut cependant faire l’hypothèse que l’arbre n’est

pas trop déséquilibré, i.e. pour chaque nœud, il y a

approximativement autant de nœud dans le sous

arbre gauche que dans le sous-arbre droit.

2 arbres binaires de recherche11
2 - Arbres binaires de recherche

Il y a deux approches pour s’assurer qu’un arbre de recherche soit équilibré:

L’équilibrer de temps en temps

Imposer l’équilibrage comme contrainte supplémentaire pour l’arbre de recherche. On obtient alors un arbre AVL.

c les ensembles
C – LES ENSEMBLES

DéfinitionUn ensemble est une collection d’éléments uniques.

Notation : S = {a, b, c}

Les opérations principales sur les ensembles :

Union

Intersection

Complément relatif ou différence

c les ensembles1
C – LES ENSEMBLES

Le TAD ensemble

//constructeurs

Construire un ensemble vide

Construire un ensemble par union de deux autres ensembles

Construire un ensemble par intersection de deux autres ensembles

Construire un ensemble par différence de deux autres ensembles

//modificateurs

Insérer un élément dans un ensemble

Supprimer un élément d’un ensemble

Effacer tous les éléments d’un ensemble

c les ensembles2
C – LES ENSEMBLES

Le TAD ensemble

//sélecteurs

Vérifier qu’un élément fait partie d’un ensemble

Vérifier que deux ensembles sont égaux

Savoir si un ensemble est vide

c les ensembles3
C – LES ENSEMBLES

Les implantations du TAD ensemble

Cas où les ensembles sont des sous-ensembles d’un ensemble universel constitué des entiers 1, …, N pour un N donné:

L’implémentation la plus simple et efficace

consiste à utiliser un tableau de booléens T

tel que T[i]= 1 si i appartient à l’ensemble

T[i] = 0 sinon.

c les ensembles4
C – LES ENSEMBLES

Les implantations du TAD ensemble

Les opérations d’insertion, de suppression et de recherche d’un élément sont réalisées en temps constant (O(1)).

La réunion, l’intersection et la différence dans un temps proportionnel à la taille de l’ensemble universel.

c les ensembles5
C – LES ENSEMBLES

Les implantations du TAD ensemble

Cas général : on peut aussi utiliser une liste chaînée. Pas de limitation à des sous-ensembles d’un ensemble universel d’entiers.

c les ensembles6
C – LES ENSEMBLES

Les dictionnaires

Pas toujours besoin des opérations telles que

l’union et l’intersection.

On a souvent besoin de manipuler un ensemble d’objets avec seulement des insertions, des suppressions et d’effectuer des recherches.

Le TAD ensemble avec uniquement ces trois opérations est appelé un dictionnaire.

c les ensembles7
C – LES ENSEMBLES

Spécification du TAD dictionnaire

package dictionnaire;

public interface Dictionnaire {

//modificateurs

public void effacer();

public void inserer(Object x);

public void supprimer(Object x)

throws DicoVideException;

//selecteurs

public boolean estVide();

public boolean rechercher(Object x) ;

}

c les ensembles8
C – LES ENSEMBLES

Les implantations du TAD dictionnaire

par des structures de données simples : tableau, listes chaînées

par tables de hachage

par arbres binaires de recherche

c les ensembles9
C – LES ENSEMBLES

1- Utilisation des structures de données simples:

Tableau avec un pointeur sur le dernier élémentEnvisageable si on sait que la taille des ensembles ne dépassera jamais la taille du tableau.

Avantage : simplicité

Inconvénients : suppression plus lente, l’espace n’est pas

utilisé de manière efficace quand les ensembles sont de taille

variable.

Liste chaînée

c les ensembles10
C – LES ENSEMBLES

Complexité des algorithmes

L’implantation par tableau ou par liste chaînée du dictionnaire demande, en moyenne, n opérations pour exécuter une insertion, une suppression ou une recherche. Complexité : O(n).

On va étudier une technique très utilisée pour implanter des dictionnaires : le hachage.Cette technique demande, en moyenne, un temps constant pour les trois opérations.Complexité : O(1).

c les ensembles11
C – LES ENSEMBLES

2- Les tables de hachage

La structure de données table de hachage est idéalement un tableau de taille N fixée contenant les éléments de l’ensemble.

La répartition des éléments de l’ensemble dans le tableau se fait en utilisant une fonction appelée fonction de hachage.

c les ensembles12
C – LES ENSEMBLES

2- Les tables de hachage

Une fonction de hachage est une fonction h qui, pour chaque élément x de l’ensemble, calcule une valeur h(x) comprise entre 0 et N-1 correspondant à un indice du tableau.

Table de hachage

0

1

2

N-1

c les ensembles13
C – LES ENSEMBLES

2- Les tables de hachage

En utilisant la même fonction de hachage pour l’insertion et la recherche, l’exécution de ces opérations demande se fait en temps constant.

En pratique, ce cas idéal n’existe pas du fait de collisions.

c les ensembles14
C – LES ENSEMBLES

2- Les tables de hachage

Collision : pour deux éléments différents de l’ensemble, la fonction de hachage produit la même valeur.

Exemple

0

1

2

N-1

c les ensembles15
C – LES ENSEMBLES

2- Les tables de hachage

Une bonne fonction de hachage doit calculer rapidement une valeur mais aussi diminuer le nombre de collisions.

Exemple de fonction de hachage pour un ensemble dont les éléments sont des chaînes de caractères :

taille du tableau

c les ensembles16
C – LES ENSEMBLES

2- Les tables de hachage

Application à l’ensemble

{ Jean, Jacques, Vincent, Lucien, Pierre}

et une table de taille 10.

0

1

2

3

4

chaîne

h(chaîne)

5

6

7

8

9

c les ensembles17
C – LES ENSEMBLES

2- Les tables de hachage

En cas de collision, deux approches sont utilisées:

Gestion par hachage ouvert

Gestion par hachage fermé

slide125

C – LES ENSEMBLES

2- Les tables de hachage

Gestion par hachage ouvertEn cas de collision, le tableau est «ouvert» vers la droite.

Inconvénient :

Plus il y a de collisions

->Plus les listes sont longues

->Moins la recherche est efficace

5

Jacques

Vincent

Pierre

6

Jean

7

8

9

Lucien

c les ensembles18
C – LES ENSEMBLES

2- Les tables de hachage

Gestion par hachage ferméOn cherche à replacer l’élément en collision ailleurs dans le tableau en appliquant une fonction de rehachage qui calcule un nouvel indice et ceci jusqu’à ce que la nouvelle entrée soit libre.

c les ensembles19
C – LES ENSEMBLES

2- Les tables de hachage

Gestion par hachage fermé

Exemple de fonction de rehachage :

Fonction qui incrémente de 1 l’indice

obtenu.

Ce choix conduit à une dégradation des performances dès que le taux de remplissage de la table dépasse 90%.

c les ensembles20
C – LES ENSEMBLES

2- Implantation du TAD dictionnaire par table de hachage, gestion par hachage ouvert

package dictionnaire;

import listes.*;

public class DicoHachageOuvert implements Dictionnaire{

private int taille;

private static final int MASK = 0x7FFFFFFF;//forme hexadecimale

//MASK = 2147483647

private ListeChainee[] tableau; //tableau de listes

c les ensembles21
C – LES ENSEMBLES

public DicoHachageOuvert(int dimension) {

taille = dimension;

//initialiser le tableau

tableau = new ListeChainee[taille];

for (int i=0; i<taille; i++){

tableau[i] = new ListeChainee();

}

}

private int hachage(Object c){

return (c.hashCode()&MASK)%taille; //somme //modulo taille

//n&MASK permet de supprimer le signe de //l'entier n

}

c les ensembles22
C – LES ENSEMBLES

public void effacer() {

for (int i=0; i<taille; i++){

tableau[i].effacer();

}

}

public boolean estVide() {

for (int i=0; i<taille; i++){

if (!tableau[i].estVide())

return false;

}

return true;

}

c les ensembles23
C – LES ENSEMBLES

public void inserer(Object x) {

if(!rechercher(x)) tableau[hachage(x)].insererAuDebut(x)

}

public void supprimer(Object x) throws DicoVideException {

if (estVide()) throw new DicoVideException();

Liste courant=null;

courant=tableau[hachage(x)];

boolean b = courant.effacerElement(x);

}

c les ensembles24
C – LES ENSEMBLES

public boolean rechercher(Object x) {

int i =hachage(x);

return tableau[i].rechercher(x);

}

}//fin de la classe DicoHachageOuvert

c les ensembles25
C – LES ENSEMBLES

3- Les arbres binaires de recherche

Cette structure de données permet d’implanter les ensembles dont les éléments sont ordonnés.

Moins efficace que les tables de hachage pour les insertions, les suppressions et les recherches.

Plus efficace pour trier les données : parcours symétrique de la structure à condition que l’arbre soit équilibré.

d les tables
D – LES TABLES

Définitions

Une table est un conteneur qui permet un accès direct par type d’index.

Un table est une séquence de lignes constituées de paires (clé, valeur):

la clé sert d’index dans la table.

la valeur du composant clé. Elle contient les informations recherchées.

Exemple : le dictionnaire

La clé est le mot consulté

La valeur est la définition du mot

d les tables1
D – LES TABLES

Exemple de tablePaires (prénom, âge) où on suppose que le prénom peut être pris comme clé (toutes les personnes enregistrées ont des prénoms différents)

Prénom

âge

d les tables2
D – LES TABLES

Le TAD Table

//constructeurs

Construire une table vide

//modificateurs

Insérer une ligne dans la table

Remplacer une ligne dans la table

Extraire une ligne dans la table

Effacer toutes les ligne de la table

//sélecteurs

Rechercher une valeur dans la table en fonction de la clé

Savoir si une table est vide

d les tables3
D – LES TABLES

Les implantations du TAD Table

Par un tableau ou une liste

Par un arbre de recherche

Par une table de hachage

d les tables4
D – LES TABLES

Implantation du TAD Table par un tableau ou une liste

Deux types de recherche peuvent être envisagés

Recherche séquentielle si la position des paires à l’intérieur de la structure est

quelconque. Complexité : O(n).

Recherche par dichotomie qui nécessite une table triée et une implantation par tableau pour avoir un accès direct aux paires. Complexité : O(log(n))

d les tables5
D – LES TABLES

Implantation du TAD Table par un arbre de recherche

Lucien

10

Jean

Vincent

18

10

Jacques

Pierre

21

14

d les tables6
D – LES TABLES

Implantation du TAD Table par un arbre de rechercheLa recherche est plus performante que la recherche par dichotomie car même complexité O(log(n)) mais le tri est réalisé implicitement à l’insertion des paires.

d les tables7
D – LES TABLES

Implantation du TAD Table par table de hachageOn applique une fonction de hachage qui détermine l’indice du tableau à partir de la valeur de la clé.Complexité insertion et recherche :O(1) (en théorie)

d les tables8
D – LES TABLES

Implantation du TAD Table par table de hachage

0

1

2

clé

h(clé)

3

4

5

6

7

8

9

d les tables9
D – LES TABLES

Réalisation du TAD Table

Spécification de la ligne de la table

Les opérations sur une table nécessitent de pouvoir comparer les lignes entre elles en fonction de leur clé.

Chaque ligne doit

fournir sa clé

pouvoir être comparée à une autre ligne

être traitée (affichée par exemple).

d les tables10
D – LES TABLES

Réalisation du TAD Table

Solution : Une ligne est spécifiée par l’interface TypeComparable:public interface TypeComparable{

//calculer la clé de la lignepublic Comparable cle();//établir un ordre entre les lignespublic int compare(Object o);//Appliquer un traitement à la lignepublic void traiter();

}

d les tables11
D – LES TABLES

Réalisation du TAD Table

Application à une ligne (prénom, âge):

class PairePrenomAge implements TypeComparable{ String prenom;

int age;

public PairePrenomAge(String prenom, int age){

this.prenom = prenom;

this.age = age;

}

d les tables12
D – LES TABLES

public int compare(Object o){

PairePrenomAge pa = (PairePrenomAge)o;

return ((this.cle().compareTo(pa.cle()));

}

public Comparable cle(){

return prenom;

}

public void traiter(){

System.out.print(«Prenom:» + prenom);

System.out.println(«Age:» + age);

}

}

d les tables13
D – LES TABLES

Réalisation du TAD Table

public interface Table {

//modificateurs

public voideffacer ();

public void inserer ( TypeComparable ligne) throws TablePleineException, LigneEnDoubleException;

public voidremplacer ( TypeComparable ligne) throws LigneIntrouvableException;

public TypeComparable extraire( TypeComparable ligne) throws LigneIntrouvableException;

//sélecteurs

public boolean rechercher ( TypeComparable ligne);

public boolean estVide();

}