• Files • Recherche d`information: le hachage • Exceptions en Java

Transcription

• Files • Recherche d`information: le hachage • Exceptions en Java
Plan
• Files
• Recherche d'information: le hachage
• Exceptions en Java
Amphi 3
1
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
2
Les files
Début de file
Fin de
file
Amphi 3
3
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
4
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
5
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
6 2 7 0 9 8 2 2 0 4
f
1
début
5
fin
La file contient les entiers 2, 7, 0, 9. Les indices
de début et de fin sont manipulés modulo MaxF.
Amphi 3
6
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];
}
}
Amphi 3
7
Les files en Java
0 1 2 3 4 5 6 7 8 9
6 2 7 0 9 8 2 2 0 4
f
7
début
3
fin
La file contient les entiers 2, 0, 4, 6, 2, 7.
0 1 2 3 4 5 6 7 8 9
6 2 7 0 9 8 2 2 0 4
f
5
début
4
fin
Une file pleine.
Amphi 3
8
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
9
La classe File (3)
static void viderFile(File f)
{
f.fin = f.debut;
}
Une file vide
0 1 2 3 4 5 6 7 8 9
6 2 7 0 9 8 2 2 0 4
f
4
début
Amphi 3
4
fin
10
La classe File (4)
static int valeur(File f)
{ // suppose la file non vide
return f.contenu[f.debut];
}
0 1 2 3 4 5 6 7 8 9
6 2 7 0 9 8 2 2 0 4
f
1
début
Amphi 3
valeur : 2
5
fin
11
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
12
Plan
• Files
• Recherche d'information: le hachage
• Exceptions en Java
Amphi 3
13
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 ?
Amphi 3
14
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.).
Amphi 3
15
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
16
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
17
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
18
Exemple de hachage
25 32 43 51 67 89 20 11 13 53 57 59 14 15
5 2 3 1 7 9 0 1 3 3 7 9 4 5
0
1
2
(20, Martin)
(51, Pierre), (11, Sophie)
(32, Jean)
3
4
5
6
7
8
9
(43, Sylvie), (13, Robert), (53, Paul)
(14, Annie)
(25, Jacques), (15, Adeline)
h(k) = k mod 10
(67, Catherine), (57, Danièle)
(89, Julie), (59, Philippe)
Amphi 3
19
Une table de hachage
Amphi 3
20
Résolution des collisions par chaînage
Amphi 3
21
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 !
Amphi 3
22
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
Amphi 3
23
Plan
• Files
• Recherche d'information: le hachage
• Exceptions en Java
Amphi 3
24
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
25
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
26
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.
Amphi 3
27
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())
}
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
29
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.
Amphi 3
30
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.
Amphi 3
31
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
32
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
33
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
34
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
35
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
36
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
37
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!
Amphi 3
38
Piles: supprimer (avec exception)
static void supprimer(Pile p)
throws PileException
{
if (estVide(p))
throw new PileException("vide");
--p.hauteur;
}
>Pile vide!
Amphi 3
39
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
40
Files: valeur (avec exception)
static int valeur(File f)
throws FileException
{
if (estVide(f))
throw new FileException("vide");
return f.contenu[f.debut];
}
0 1 2 3 4 5 6 7 8 9
6 2 7 0 9 8 2 2 0 4
f
1
début
Amphi 3
valeur : 2
5
fin
41
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
42
Files: supprimer (avec exception)
static void supprimer(File f)
throws FileException
{
if (estVide(f))
throw new FileException("vide");
f.debut = successeur(f.debut);
}
Amphi 3
43