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)