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.
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
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);
}
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
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
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
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()) }
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é
extendsclass 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.
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 { ... }
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.
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);
}