Tables et hachage, grammaire et langage

publicité
Algorithmique P2
Tables et Hachage
Ulg, 2009-2010
R.Dumont
Tables
Table = Ensemble d'entrées.
Entrées = Couples de type (clef, information)
Tables - Représentation
Par tableau
◦ Entrée = (indice, données)
char Ville[25]
Ville[5] = "Liège"
◦ Recherche par "accès directe", O(1)
Par tableaux non ordonnés
◦ Entrée = (données, données)
char Ville[25]
int CP[4]
◦ Recherche "séquentielle", O(n)
Par tableaux ordonnés
◦ Entrée = (données, données)
char Ville[25]
int CP[4]
◦ Recherche "dichotomique", O(log n)
Tables de hachage
Compromis Temps-Espace
Principe
◦ Problème de la Table = perte d'espace si U >> K
◦ Table de hachage = table limitée au nécessaire
◦ Une table T contient des alvéoles (=cases de T)
◦ Une fonction (de hachage) permettant de répartir
(distribuer) les informations à partir de leur clé dans T
est de la forme
h : U [0..m-1]
◦ Pour chaque clé k de U, la fonction de hachage renvoie
h(k), qui désigne une des m alvéoles de T.
En théorie, chaque clé doit avoir autant de chance d’être
hachée vers n'importe quelle des cases de T
◦ On dit que h(k) est le haché (condensé, résumé,…) de k.
Fonctionnement
Algorithmes et Structures de données, B. Jacob, 2010, INF601, Université
Le Mans
Tables de hachage
Au lieu de U valeurs à réserver lors de la
déclaration de T (cas de la table), on se contente de
m possibilités (cas de la table de hachage)
◦ m fixé par la fonction de hachage
◦ Besoin réduit en espace
◦ Mais problème si deux clés ont le même haché (plusieurs
hachés pour une même alvéole)
Problème de collision (voir k2 et k5)
Tables de hachage - Collisions
Solution :
◦ Eviter les collisions ?
Par définition, impossible (car |U| > m et h est
déterministe)
En pratique, utilisation de fonctions de hachage
"aléatoires" qui diminue les collisions
Mais phénomène impossible à juguler, donc…
◦ Gestion des collisions
Chainage
Adressage ouvert
Tables de hachage - Chainage
Chaque alvéole pointe sur une liste chainée
contenant les éléments de même haché
Chaque alvéole de T pointe vers
◦ une liste d'éléments, ou
◦ NIL
Taux de remplissage de T (contenant M alvéoles et
N éléments)
◦ = N/M = α
◦ = Nombre moyen d'éléments stockés dans une chaine
Tables de hachage - Chainage
Les performances moyennes du hachage
dépendent de la manière avec laquelle la fonction
de hachage h répartit en moyenne l’ensemble des
clés à stocker parmi les m alvéoles.
◦ Propriété de répartition uniforme
Si la fonction de hachage valide cette propriété,
on démontre que l'opération de recherche
s'effectue en temps constant, soit O(1).
Insertion et suppression sont également O(1), si
listes doublement chainées.
Permet α > 1
Hachage - Fonctions
Plusieurs techniques :
◦ Méthode de la division
h(k) = k mod m
Choix du m :
Éviter les puissances de 2
Premier, sans être proche trop d'une puissance de 2
Exemple :
N = 2000 chaines de caractères, chainage souhaité de
maximum 3 éléments
M = 701, car premier, proche de 2000/3, distant de 512
et 1024
Hachage - Fonctions
◦ Méthode de la multiplication
h(k) = ⌊m(k.A mod 1)⌋
avec 0<A<1 de la forme s/2w et où w représente la
taille des mots sur une machine donnée
Knuth : A proche de (√5 -1)/2 = 0.618033…
m est du type 2p
◦ Exemple
Soit k =123456, w =32, p=14 ( m=16384)
A proche de (√5 − 1)/2, soit A =2654435769/232
h(k) = ⌊214(123456. 2654435769/232 mod 1)⌋=67
Adressage Ouvert
Les alvéoles ne contiennent qu'au plus un
élément
On remplit la table alvéole par alvéole.
Il n'y a plus de pointeurs de liste
Insertion
◦ Conséquence : la table peut être pleine
◦ Taux de remplissage < 1
◦ L'espace mémoire libéré est utilisé pour la table
◦ Conséquence : + d'alvéoles, moins de collisions
◦ Sondage jusqu'à trouver une alvéole vide
Sondage linéaire
Sondage quadratique
Double hachage
Adressage Ouvert – S. linéaire
h(k,i) = (h'(k)+i) mod m
◦ h'(k) est appelé fonction de
hachage auxiliaire
◦ Principe :
On sonde d'abord T[h'(k)]. Si
vide, on insère k dans cette
alvéole.
Sinon, on sonde T[h'(k)+1],
etc. jusqu'à T[m-1], puis on
revient à T[0], T[1],… jusque
T[h'(k)-1].
Problème des grappes fortes
(primary clustering)
◦ Groupes de blocs consécutifs
occupés
Augmentation du temps de
recherche
Utilisable jusqu'à α <0.75
Jean-Eric Pin, Liafa, Jussieu, 1998
Sondage quadratique
h(k, i) = (h'(k) + c1i + c2i2) mod m
avec h’ la fonction de hachage auxiliaire
i = 0, 1, . . . , m − 1, c1 et c2 ≠ de 0
Dépend de i et non de la clé
◦ Problème des grappes faibles (secondary clustering)
Suite d'alvéoles occupées par des clés de même valeur
de hachage
Utilisable si α <0.5
Double hachage
h(k, i) = (h1(k) + i.h2(k)) mod m
Évite les regroupement autour de i+1
Exemple (avec m=13, k=14)
◦ soit h1(k)=k mod 13 et h2(k) =1+(k mod 11)
◦ Donc, h1(14) = 1 et h2(14) = 4
◦ h(14, 0) = h1(14) = 1
case occupée
◦ h(14, 1) = (h1(14) + h2(14)) mod 13 = 5
case occupée
◦ h(14, 2) = (h1(14) + 2 × h2(14)) mod 13 = 9
case libre
Dépend de la clé et non plus de i
Conclusion - En pratique
Une fonction de hachage transforme la valeur d'un élément (la
clé) en l'indice d'une table
◦ Elle doit être déterministe
◦ Elle doit être facilement calculable
Difficulté : répartir le plus uniformément possible les valeurs
de hachage
En pratique, une bonne fonction de hachage permet à 2 clés
de motifs très proches d’avoir des valeurs de hachage très
différentes
Exemple (MD5 – 128 bits)
◦ "tester"
◦ "Tester"
◦ "testera"
:
:
:
f5d1278e8109edd94e1e4197e04873b9
3095c3e4f1465133e5e6be134eb2ebe2
a91fb03faec54384901f13f01d2ba0e3
Algorithmique P2
Langage et grammaire
Ulg, 2009-2010
R.Dumont
Langage
Langage = ensemble de chaines de caractères
Chaines de caractères = les phrases du
langage
Chaque phrase possède une structure
◦ qui peut être décrite par un arbre
◦ dont les règles de construction sont définies par
une grammaire
Exemple : langage de programmation
◦ Phrases = les programmes
◦ Programme = chaine constituée de mots
◦ Mot = séquence de caractères dont la structure est
spécifiée par une grammaire.
Langage et Syntaxe
Exemple :
◦ en français, une phrase valide est formée par un
sujet suivi d'un verbe (cas général).
◦ Grammaire (simplifiée)
Phrase = sujet verbe
Sujet = "Pol" | "Sophie"
Verbe = "mange" | "dort"
◦ Fournit
Pol mange
Sophie mange
Sophie dort
Pol dort
phrase
sujet
verbe
Pol
dort
Dont l'arbre syntaxique est donné ci-contre
A
Langage
id
Pour une expression plus
complexe, le principe reste
identique, mais l'arbre
se complexifie
Soit la grammaire suivante
◦
◦
◦
◦
◦
A := "id" "=" E
E := T | E "+" T
T := F | T "*" E
F := "id" | "cst" | "(" E ")"
Peut par exemple fournir
id = id
id = cst
id = (id + cst) + cst * id
Dont l'arbre syntaxique est
donné ci-contre
=
E
E
+
T
T
F
(
E
T
E
+
id
*
E
F
T
cst
F
)
T
F
…
F
T
cst
id
Grammaire et tokens
Règle d'une grammaire
T := n
Où
T est un symbole non terminal
n est une chaine composée de terminaux (lexèmes, tokens,
jetons) ou de non-terminaux (variables)
Définition d'une grammaire:
◦ collection de règles permettant de substituer un nonterminal par une suite de symboles (terminaux et nonterminaux)
Définition d'un token:
◦ Symbole terminal représentant la plus petite unité
lexicale d'un langage.
BNF (Backus
(Backus Naur Form)
Form)
métalangage utilisé pour décrire un autre
langage
Inventé par John Backus pour décrire Algol 58
(simplifié par la suite par Peter Naur)
Règles d'écriture
◦ ::= "est défini comme"
◦ | "ou"
◦ < > encadrent les symboles non-terminaux (par
opposition aux terminaux représentés tel-quel).
◦ On encadre par " " les symboles terminaux d’un seul
caractère.
BNF (Backus
(Backus Naur Form)
Form)
Exemple pour un programme écrit dans un langage
élémentaire :
<programme> ::= PROGRAMME <suite_de_declarations> debut <suite_d_instructions> fin ;
◦ Mot clef "PROGRAMME" suivi de déclarations, suivi du motclef "debut", suivi par des instructions, suivi du mot-clef
"fin" et d'un point-virgule.
Simplifications d'écriture par deux constructions
supplémentaires ( EBNF)
EBNF :
◦ {x} exprime la répétition : zéro, une ou plusieurs
occurrences de x.
Par exemple pour un nom qui doit commencer par une lettre de
l’alphabet pouvant être suivie par tout autre caractère :
<identifiant> ::= <lettre> { <lettre> | <digit> }
◦ [x] exprime l'option : zéro ou une occurrence de x.
<clause_si> ::= si <oui_ou_non> alors <suite_d_instructions> [ sinon <suite_d_instructions>
] fin si ;
Retour à Python
Définition des listes
expression, expression_list, target_list,
old_expression sont également définis…
Algorithmique P2
Compilateur et interpréteur
Ulg, 2009-2010
R.Dumont
Compilateur - Interpréteur
Problème :
langage humain VS langage machine
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
Langage de programmation
Solution : langage de programmation
◦ Ada Lovelace : premier programme informatique
Machine Analytique de
Babbage (1843)
◦ Années 50 : premiers langages "modernes" répandus
FORTRAN : FORmula TRANslator (Backus)
LISP : LISt Processor (McCarthy)
COBOL : Common Business Oriented Language (Hopper)
ALGOL 60 : ALGOrithmic Language
Langage de programmation
Le langage de programmation permet
l’écriture (et a fortiori la lecture) du code
source par un humain (le programmeur)
Evolution constante
◦ Versioning (PHP 4 PHP 5)
◦ Réactualisation d'anciens langages (COBOL COBOL 2002)
◦ Héritage historique (LISP Scheme)
Se comptent par centaines
Exécution
Un CPU ne peut pas exécuter un code source
'brut'.
Celui-ci doit être traité préalablement
◦ Transformé (compilation)
◦ Evalué (interprétation)
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
Compilateur
Programme qui transforme du code source
(en entrée) en du code exécutable par une
machine (en sortie)
L'exécutable sera ensuite utilisé pour traiter
les données (en entrée) afin de fournir des
résultats (en sortie)
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
Compilateur
Compilateurs classiques
◦ C, JAVA
En C
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
Interpréteur
Programme qui prend un code source et des
données (en entrée) et l’exécute directement afin
de fournir des résultats (en sortie)
Interpréteurs classiques
◦ Ruby
◦ Shells Unix
Comp. Vs Interp.
◦ Rapidité d’exécution
◦ Souplesse d'utilisation
◦ Facilité de développement
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
Machine virtuelle ?
Couche supplémentaire entre le code source et la
machine physique
Objectif : meilleure portabilité
◦ Indépendance de la machine (cf. problème compilateurs C
p.ex.)
Interpréteur pour le langage machine
Services :
◦
◦
◦
◦
Exécution
Gestion de la mémoire
Chargement dynamique
Parallélisme, synchronisation, gestion des ressources
Java utilise notamment ce principe
Structure d'un compilateur
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
Structure d'un compilateur
Analyse Lexicale
◦ Extraire les jetons du flux de caractères que
représente le code source
◦ Exemple : for(i=0;i<N;i++){printf("%d\n",i);}
Mot clé "for"
Symbole "("
Identifiant "i"
Symbole "="
Entier "0"
Symbole ";"
etc.
Structure d'un compilateur
Analyse Syntaxique
◦ Reconstruire la structure syntaxique à partir des
lexèmes
◦ Les règles syntaxiques d'un langage sont décrites
dans sa grammaire.
grammaire
Exemple : « Mon frère étudie. »
Mon
Article défini
frère
étudie
.
Nom commun
Verbe
conjugué
Symbole de
terminaison
Groupe nominal
sujet
Groupe verbal
Phrase
Symboles de
ponctuation
Structure d'un compilateur
Analyse Sémantique
◦ Vérification du sens et de sa cohérence
Exemple : « Le ciel mange une télévision.»
Syntaxe : OK
Sens : NOK
Génération du code
◦ Code dans le langage demandé grâce aux informations
fournies par les étapes précédentes
◦ Eventuellement en plusieurs étapes
Langage intermédiaire
Si le langage initial est très éloigné du langage cible
Compilateur optimisant
Compilateur dont on peut spécifier l'architecture de la
machine cible
Structure d'un interpréteur
Théorie et construction des compilateurs, Jean Privat, 2009-10,
Univ. Québec, http://www.info2.uqam.ca/~privat/ens/compil/
En résumé
•
•
•
La Syntaxe:
Syntaxe: la forme (ou structure) des expressions
La Sémantique:
Sémantique: la signification des expressions
La définition d'un langage est donnée par sa
syntaxe et sa sémantique
– Qui utilise la définition?
• Les concepteurs
• Ceux qui effectuent l'implémentation
• Les programmeurs (usagers)
Téléchargement