• Aucun résultat trouvé

Les files

N/A
N/A
Protected

Academic year: 2022

Partager "Les files"

Copied!
11
0
0

Texte intégral

(1)

Amphi 3 1

Plan

• Files

• Recherche d'information: le hachage

• Exceptions en Java

Amphi 3 2

Piles et files d'attente

Une pile est une liste où les insertions et les suppressions se font toutes du même côté. LIFO Une file est une liste où les insertions se font d'un côté et les suppressions se font de l'autre côté. FIFO

Sommet de pile Début de file

Fin de file

Amphi 3 3

Les files

Début de file

Fin de file

Amphi 3 4

Opérations de base sur les files

Créer une file vide.

Tester si une file est vide.

Ajouter un élément en fin de file.

Valeur du début de la file.

Supprimer le début de la file.

(2)

Amphi 3 5

Propriétés abstraites du type "File"

• estVide(fileVide) = true

• valeur(ajouter(x, fileVide)) = x

• supprimer(ajouter(x, fileVide)) = fileVide

• estVide(ajouter(x, f)) = false Pour f ! fileVide

• valeur(ajouter(x, f)) = valeur(f)

• supprimer(ajouter(x, f)) =

ajouter(x, supprimer(f))

Amphi 3 6

Les files en Java

Solution 1 : listes...

Solution 2 : tableau circulaire et deux entiers repérant le début et la fin de la file.

0 1 2 3 4 5 6 7 8 9 f

6 2 7 0 9 8 2 2 0 4 5

1

début fin

La file contient les entiers 2, 7, 0, 9. Les indices de début et de fin sont manipulés modulo MaxF.

La classe File (1)

class File {

static final int maxF = 10;

int debut,fin;

int[] contenu;

File() {

debut = 0;

fin = 0;

contenu = new int[maxF];

} }

Les files en Java

La file contient les entiers 2, 0, 4, 6, 2, 7.

f

6 2 7 0 9 8 2 2 0 4 3

7

début fin

f

6 2 7 0 9 8 2 2 0 4 4

5

début fin

Une file pleine.

0 1 2 3 4 5 6 7 8 9

0 1 2 3 4 5 6 7 8 9

(3)

Amphi 3 9

La classe File (2)

static int successeur(int i) {

return (i + 1) % maxF;

}

static boolean estVide(File f) {

return f.debut == f.fin;

}

static boolean estPleine(File f) {

return f.debut == successeur(f.fin);

}

Amphi 3 10

La classe File (3)

static void viderFile(File f) {

f.fin = f.debut;

}

f

6 2 7 0 9 8 2 2 0 4 4

4

début fin

Une file vide

0 1 2 3 4 5 6 7 8 9

Amphi 3 11

La classe File (4)

static int valeur(File f) { // suppose la file non vide

return f.contenu[f.debut];

}

f

6 2 7 0 9 8 2 2 0 4 5

1

début fin

valeur : 2 0 1 2 3 4 5 6 7 8 9

Amphi 3 12

La classe File (5)

static void ajouter(int x, File f) { // suppose la file non pleine

f.contenu[f.fin] = x;

f.fin = successeur(f.fin);

}

static void supprimer(File f) { // suppose la file non vide

f.debut = successeur(f.debut);

}

(4)

Amphi 3 13

Plan

• Files

• Recherche d'information: le hachage

• Exceptions en Java

Amphi 3 14

Recherche d'information

Annuaire: on se donne un nom, trouver le numéro de téléphone.

Numéro de Sécurité Sociale --> accès à diverses informations.

On a un ensemble E de 1000000 de codes de carte bancaire (16 chiffres). Comment tester rapidement si un code donné est dans E ou pas ?

Les livres d'une bibliothèque sont repérés par leur numéro ISBN (9 chiffres). Comment mettre à jour rapidement la base de donnée ?

Représentation de l'information

Chaque élément est constitué de plusieurs champs:

• un champ clé (nom, numéro de sécurité sociale, numéro de carte bancaire, ISBN, etc.), élément d'un univers U totalement ordonné,

• un ou plusieurs champs information (numéro de téléphone, date de naissance, date de validité de la carte, auteur du livre, etc.).

Type abstrait dictionnaire

C'est un ensemble totalement ordonné (l'ensemble des clés), sur lequel on effectue trois types d'opérations:

• Rechercher un élément

• Insérer un élément

• Supprimer un élément

(5)

Amphi 3 17

Tables de hachage

Utile lorsque l'ensemble des clés est beaucoup plus petit que l'univers U.

Par exemple, l'ensemble des noms figurant dans l'annuaire est très petit par rapport au nombre de chaînes de caractères (même en se limitant aux chaînes de longueur ! 16).

Amphi 3 18

Principe du hachage

• Les clés ne sont pas triées.

• La table est divisée en m listes. Une fonction, dite de hachage,

h : U --> [0 .. m-1]

donne, pour chaque clé k, le numéro h(k) de la liste associée à k.

• Taux de remplissage : r = n/m, où n est le nombre de clés utilisées.

Amphi 3 19

Exemple de hachage

25 32 43 51 67 89 20 11 13 53 57 59 14 15 3

5 2 1 7 9 0 1 3 3 7 9 4 5

0 (20, Martin)

1 (51, Pierre), (11, Sophie) 2 (32, Jean)

3 (43, Sylvie), (13, Robert), (53, Paul) 4 (14, Annie)

5 (25, Jacques), (15, Adeline) 6

7 (67, Catherine), (57, Danièle) 8

9 (89, Julie), (59, Philippe)

h(k) = k mod 10

Amphi 3 20

Une table de hachage

(6)

Amphi 3 21

Résolution des collisions par chaînage

Amphi 3 22

Complexité

n clés à ranger, table de taille m, r = n/m

Calcul du hachage : O(1)

Temps total moyen, calcul du hachage inclus:

Succès : 2 + r/2 - 1/2m Echec : 1 + r Si r = 1,4 on trouve 2,7 et 2,4

On notera que cette valeur ne dépend pas de n, mais de r. Ainsi, on retrouve un élément en temps constant en moyenne !

Choix des fonctions de hachage

Un choix classique est

h(k) = k mod m où m est un nombre premier.

Pour des clés alphabétiques, on peut choisir

h(k) = (k[0]Bn-1 + k[1]Bn-2 + … + k[n-1]) mod m où B = 256 et m est premier.

Exemple k = PASCAL, m = 143

h(k) = (80. 2565 + 65. 2564 + 83. 2563 + 67. 2562 + 65. 256 + 76) mod 143

Plan

• Files

• Recherche d'information: le hachage

• Exceptions en Java

(7)

Amphi 3 25

Exceptions

class Lecture {

static int lire(String s) {

return Integer.parseInt(s);

}

public static void main(String[] args) {

int i = lire(args[0]);

System.out.println(i*i);

}

} // Affiche le carré d'un entier

Amphi 3 26

Exceptions

> java Lecture m

> Exception in thread "main"

java.lang.NumberFormatException: m

at java.lang.Integer.parseInt(Integer.java:414) at java.lang.Integer.parseInt(Integer.java:463) at Lecture.lire(Lecture.java:3)

at Lecture.main(Lecture.java:6)

Java détecte une erreur de format de nombre et remonte la pile d'exécution...

Amphi 3 27

Le mécanisme des exceptions

Une erreur n'arrête pas immédiat le programme, mais crée et propage, en remontant les méthodes concernées, un objet particulier, appelé une exception, qui contient une information sur l'erreur.

Le programmeur peut intercepter (capter) cet objet et effectuer un traitement approprié. Si aucun traitement n'est prévu, la propagation continue et provoque finalement l'arrêt du programme.

class PileException extends Exception { PileException(String x) {

super("Pile " + x + "!");

} }

static int valeur(Pile p) throws PileException { if (estVide(p))

throw new PileException("vide");

return p.contenu[p.hauteur-1];

}

Pile p = new Pile();

try { // Exécution contrôlée System.out.println(valeur(p));

}

catch(PileException e) {

System.out.println(e.getMessage()) }

(8)

Amphi 3 29

La classe Exception

class Exception

{ // constructeur sans paramètre Exception() { ... }

// s: message à transmettre Exception(String s) { ... }

// pour récupérer le message...

String getMessage() { ... } }

Amphi 3 30

Mécanismes d'exception : le cas des piles

• Dans le cas des piles, les erreurs sont

– dépiler une pile vide

– demander la valeur d'une pile vide – ajouter à une pile pleine

• Traitement des erreurs

– la pile ne traite pas les erreurs

– elle peut les transmettre pour traitement par la méthode appelante, par des exceptions.

Sous-classes : le transparent interdit...

Une sous-classe est déclarée avec le mot clé

extends

class SousClasse extends Classe {

...

}

SousClasse utilise toutes les méthodes de la classe Classe. On peut aussi utiliser la

méthode super(), qui appelle le constructeur de la classe Classe.

Syntaxe des exceptions

class PileException extends Exception {

PileException(String x) {

super("Pile " + x + "!");

} }

PileException utilise toutes les méthodes de la classe Exception. La méthode super() appelle le constructeur de la classe Exception.

(9)

Amphi 3 33

Levée d'exception par throw new .

static int valeur(Pile p) throws PileException {

if (estVide(p))

throw new PileException("vide");

return p.contenu[p.hauteur-1];

} Effets :

(1) création d'un objet de la classe PileException (2) sortie de la méthode en cours.

(3) recherche dans la pile d'appel d'un bloc qui capte l'exception

Amphi 3 34

Capture par try {...} catch

Après levée d'exception, recherche dans la pile d'appel d'un bloc qui capte l'exception.

Pile p = new Pile();

try // Exécution contrôlée

{

System.out.println(valeur(p));

}

catch(PileException e) {

System.out.println(e.getMessage()) }

Amphi 3 35

Traitement de l'exception : le bloc catch

En cas d'erreur dans le bloc try, le bloc catch est exécuté. Son argument est l'objet e créé lors de la levée d'exception.

try

{ // Exécution contrôlée

System.out.println(valeur(p));

}

catch(PileException e) {

System.out.println(e.getMessage()) }

Amphi 3 36

Plusieurs blocs catch sont possibles...

try // Exécution contrôlée {

readFromFile("monFichier");

}

catch(FileNotFoundException e) { ... } // Fichier non trouvé...

catch(IOException e)

{ ... } // Erreur d'entrée-sortie catch(Exception e)// Autres erreurs { ... }

(10)

Amphi 3 37

Piles: ajouter (avec exception)

static void ajouter(int x, Pile p) throws PileException

{

if (estPleine(p))

throw new PileException("pleine");

p.contenu[p.hauteur++] = x;

}

>Pile pleine!

Amphi 3 38

Piles: valeur (avec exception)

static int valeur(Pile p) throws PileException {

if (estVide(p))

throw new PileException("vide");

return p.contenu[p.hauteur-1];

}

>Pile vide!

Piles: supprimer (avec exception)

static void supprimer(Pile p) throws PileException

{

if (estVide(p))

throw new PileException("vide");

--p.hauteur;

}

>Pile vide!

Un mécanisme d'exception pour les files

class FileException extends Exception {

FileException(String x) {

super("File " + x + "!");

} }

super renvoie au constructeur de la superclasse, ici, la classe Exception.

(11)

Amphi 3 41

Files: valeur (avec exception)

static int valeur(File f) throws FileException {

if (estVide(f))

throw new FileException("vide");

return f.contenu[f.debut];

}

f

6 2 7 0 9 8 2 2 0 4 5

1

début fin

valeur : 2 0 1 2 3 4 5 6 7 8 9

Amphi 3 42

Files: ajouter (avec exception)

static void ajouter(int x, File f) throws FileException

{

if (estPleine(f))

throw new FileException("pleine");

f.contenu[f.fin] = x;

f.fin = successeur(f.fin);

}

Amphi 3 43

Files: supprimer (avec exception)

static void supprimer(File f) throws FileException

{

if (estVide(f))

throw new FileException("vide");

f.debut = successeur(f.debut);

}

Références

Documents relatifs

Vivre dans une vill’appart en souplex, c’est faire le choix d’un sublime logement atypique.. Conçu sur deux niveaux, le souplex est le compromis parfait entre la maison

Repeating the same procedure for other algebraic effects is difficult: in order to interpret the handling construct, the handlers have to be correct in the sense that the

On s’intéresse dans tout ce problème à une suite infinie de lancers d’une pièce équilibrée autour duquel deux joueurs J et J 0 s’affrontent. Le joueur J l’emporte si

Alors H est

• Développement de la petite enfance inclusif pour tous les enfants handicapés dans les secteurs de la nutrition, de la santé, de l’éducation et de l’assainisement:

Je vous joins la liste des produits en vous signalant que si certains produits seront inclus dans les abonnements mensuels souscrits auprès de Philaposte, certains seront

De fait, sept ans plus tard, la gauche ne reconstituera pas l’ORTF, mais créera une autorité indépendante, sur le modèle anglo-saxon de séparation de l’audiovisuel et de

Selon le patron "Procuration/Proxy", installez un mandataire (classe ListeProxyHttp) qui pour chaque opération sur la liste locale (classe ListeImpl) engendre cette