TP n o 9 - Tables de hachage

Documents pareils
STAGE IREM 0- Premiers pas en Python

DM 1 : Montre Autoquartz ETA

ÉPREUVE COMMUNE DE TIPE Partie D

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Programmation C. Apprendre à développer des programmes simples dans le langage C

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Utilisation d objets : String et ArrayList

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Définitions. Numéro à préciser. (Durée : )

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Les fonctions de hachage, un domaine à la mode

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Algorithmique et Programmation, IMA

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Algorithme. Table des matières

1 Recherche en table par balayage

Présentation du langage et premières fonctions

TP 1. Prise en main du langage Python

Projet Matlab : un logiciel de cryptage

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

CRYPTOGRAPHIE. Signature électronique. E. Bresson. SGDN/DCSSI Laboratoire de cryptographie

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Bases de programmation. Cours 5. Structurer les données

Fonction de hachage et signatures électroniques

Initiation à la programmation en Python

Cours 1 : La compilation

TD3: tableaux avancées, première classe et chaînes

Représentation d un entier en base b

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Licence Sciences et Technologies Examen janvier 2010

Découverte de Python


Python - introduction à la programmation et calcul scientifique

AWS avancé. Surveiller votre utilisation d EC2

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

TP : Gestion d une image au format PGM

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

UE C avancé cours 1: introduction et révisions

1 Année LMD-STSM Algorithmique et Programmation. Série de TD 2

Introduction à l algorithmique et à la programmation (Info 2)

LES TYPES DE DONNÉES DU LANGAGE PASCAL

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Chapitre 1 I:\ Soyez courageux!

ALGORITHMIQUE ET PROGRAMMATION En C

Problèmes arithmétiques issus de la cryptographie reposant sur les réseaux

Recherche dans un tableau

Introduction à MATLAB R

I. Introduction aux fonctions : les fonctions standards

V- Manipulations de nombres en binaire

Programmer en JAVA. par Tama

Initiation à l algorithmique

TS 35 Numériser. Activité introductive - Exercice et démarche expérimentale en fin d activité Notions et contenus du programme de Terminale S

Exercices sur les interfaces

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Module 16 : Les fonctions de recherche et de référence

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Travaux Dirigés n 1 : chaînes de caractères

Le format OpenPGP. Traduit par : Sébastien Person. personseb@yahoo.fr. Matthieu Hautreux. matthieu.hautreux@insa-rouen.fr.

1 Lecture de fichiers

Notions fondamentales du langage C# Version 1.0

EBS 204 E C B S. Publication : Novembre 96

Cours d Algorithmique et de Langage C v 3.0

Utiliser un tableau de données

Algorithmique et programmation : les bases (VBA) Corrigé

Informatique Générale

Les arbres binaires de recherche

TP, première séquence d exercices.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Chap III : Les tableaux

Authentification de messages et mots de passe

Programmation C++ (débutant)/instructions for, while et do...while

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

TD : Codage des images

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Cours d algorithmique pour la classe de 2nde

TP Codage numérique des caractères. Un ordinateur ne manipule que des 0 et des 1 : Comment alors code-t-il du texte?

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Principes des langages de programmation INF 321. Eric Goubault

Cours Informatique Master STEP

1 Introduction au codage

Adama MBODJI MBODJ.SYSTEM

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

TD n o 8 - Domain Name System (DNS)

Cours d Analyse. Fonctions de plusieurs variables

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

INF 321 : mémento de la syntaxe de Java

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Le langage C. Séance n 4

Transcription:

L2 - Algorithmique et structures de données (Année 2011/2012) Delacourt, Phan Luong, Poupet TP n o 9 - Tables de hachage Exercice 1. En python En python les tables de hachage sont appelées dictionnaires. Dans un dictionnaire, on associe une valeur à une clé. Les clés peuvent être de presque n importe quel type : entiers, chaînes de caractères, fonctions, éléments d une classe, etc. (mais pas une liste python). On peut créer un dictionnaire de plusieurs manières : d = {"a" : 12, "blop" : "blip", 42 : [1, 2, 3]} d = {} d["a"] = 12 d["blop"] = "blip" d[42] = [1, 2, 3] l = [("a", 12), ("blop", "blip"), (42, [1, 2, 3])] d = dict(l) Pour accéder à la valeur d un dictionnaire d correspondant à la clé k on utilise la syntaxe d[k]. Par exemple, si d est le dictionnaire défini prédemment, d["blop"] vaut la chaîne de caractères "blip". 1. Choisissez 5 mots de la langue française et créez un dictionnaire qui associe à chacun de ces mots sa traduction en anglais. dic = { " chat " : " c a t ", " chien " : " dog ", " vache " : "cow", " t i g r e " : " t i g e r ", " l i c o r n e " : " unicorn " } 2. Ajoutez une entrée au dictionnaire de la question précédente (un nouveau mot et sa définition). dic [ " s o u r i s " ] = "mouse" Pour savoir si une clé k est présente dans un dictionnaire d on peut utiliser la syntaxe d.has_key(k) (qui renvoie True ou False). 3. Écrivez une fonction ajoute(mot1, mot2, d) qui prend en argument un mot en français, sa traduction en anglais et ajoute ces deux mots dans le dictionnaire d uniquement si mot1 n est pas une clé du dictionnaire (si mot1 apparaît dans d la fonction ne fait rien). def a j o u t e ( mot1, mot2, d ) : i f not d. has_key ( mot1 ) : d [ mot1 ] = mot2 Pour obtenir la liste de toutes les clés du dictionnaire, on utilise la syntaxe d.keys() qui renvoie une liste python contenant les clés. 4. Écrivez une fonction qui affiche à l écran toutes les valeurs correspondant aux clés qui sont dans votre dictionnaire (ici, tous les mots en anglais qui apparaissent dans votre dictionnaire). Indication : on exécute une boucle for sur tous les éléments de d.keys() et l on renvoie pour chacun la valeur qui lui est associée. 1

def valeurs ( d ) : for k in d. keys ( ) : print d [ k ] On aurait aussi pu utiliser la fonction d.values() qui renvoie une liste contenant les valeurs du dictionnaire : def valeurs ( d ) : for v in d. values ( ) : print v Pour supprimer une entrée du dictionnaire, on peut utiliser la fonction del (qui permet de supprimer une variable quelconque de manière générale). Ainsi, dans l exemple initial, pour supprimer l entrée correspondant à la clé "blop" on peut utiliser l instruction del(d["blop"]). 5. Écrivez une fonction delete(char, dict) qui prend en argument un caractère char et un dictionnaire dict et supprime du dictionnaire toutes les entrées correspondant à des clés qui commencent par la lettre char. def d e l e t e ( char, d i c t ) : for k in d i c t. keys ( ) : i f k [ 0 ] == char : del ( d [ k ] ) Exercice 2. Permutations On considère des clés sur un ensemble de 256 caractères (l alphabet ASCII 8 bits par exemple) et l on associe à chaque clé l entier qu elle représente en base 256. Ainsi, par exemple, puisque les caractères B, l, o et p correspondent aux valeurs 66, 108, 111 et 112 respectivement, la clé «Blop» est associée à l entier 66.256 3 + 108.256 2 + 111.256 + 112 = 1114402672 1. Écrivez une fonction python qui prend en entrée une chaîne de caractères en ASCII 8 bits et renvoie l entier associé. Indication : On pourra utiliser la fonction ord(c) qui renvoie la valeur ASCII du caractère c. def s t r _ t o _ i n t ( s ) : for c in s : n = n 256 + ord ( c ) Remarque : Cette fonction utilise le principe de la méthode de Horner pour évaluer le polynôme a 0 X d + a 1 X d 1 +... + a d 1 X + a d en X = 256, où a 0, a 1,... a d sont les entiers correspondant aux lettres de la chaîne s passée en argument. On peut aussi écrire une fonction au fonctionnement plus simple mais moins efficace : 2

def s t r _ t o _ i n t ( s ) : for i in range ( len ( s ) ) : n = n + ord ( s [ i ] ) 256 ( len ( s ) i 1) Si l on utilise la fonction de hachage h : x (x mod 255) pour tout mot x, si un mot y est obtenu à partir de x par permutation de ses lettres (mêmes lettres, même nombre d occurrences, mais l ordre est quelconque) alors h(x) = h(y). 2. Écrivez la fonction h en python qui prend en argument une chaîne de caractères, la convertit en entier puis le hache et vérifiez la propriété annoncée sur quelques exemples. def hachage ( s ) : return s t r _ t o _ i n t ( s ) % 255 On peut ensuite remarquer que hachage("chien") et hachage("niche") renvoient la même valeur (en l occurrence 9). Remarque : Dès que les mots sont un peu longs (c est déjà le cas pour «chien» et «niche»), le résultat de la fonction hachage est un entier long (ce qui est indiqué en Python par la lettre «L» après la valeur numérique), bien que sa valeur soit petite (comprise entre 0 et 255). C est dû au fait que le calcul intermédiaire (la fonction str_to_int) passe par un entier très grand avant de calculer le résultat modulo 255. On pourrait alléger le calcul en effectuant le modulo après chaque étape de calcul dans le calcul de la fonction str_to_int : def hachage ( s ) : for c in s : n = ( n 256 + ord ( c ) ) % 255 Or, on remarque en faisant ceci que puisque 256 1 [255] la ligne n = ( n 256 + ord ( c ) ) % 255 peut être remplacée par n = ( n + ord ( c ) ) % 255 ce qui simplifie encore le calcul, et permet de comprendre pourquoi l ordre des lettres dans le mot de départ n a pas d importance... 3. Expliquez. Comme il a été dit dans la réponse à la question précédente, puisque 256 1 [255], il est également vrai que pour tout k, 256 k 1 [255]. Ainsi, la fonction de hachage associe à une suite d entiers a 0, a 1,..., a d correspondant à une chaîne de caractères s la valeur (a 0.256 d + a 1.256 d 1 +... + a d 1.256 + a d ) mod 256 = (a 0 + a 1 +... + a d 1 + a d ) mod 256 Le résultat est donc simplement la somme des valeurs de chaque lettre, modulo 256, et ne dépend donc pas de l ordre dans lequel les lettres apparaissent dans le mot de départ. 3

Exercice 3. Le paradoxe des anniversaires 1. Si l on considère un groupe de N personnes, quelle est la probabilité que deux d entre elles soient nées le même jour de l année? (donnez simplement une expression de la probabilité) On calcule d abord la probabilité que toutes les personnes soient nées un jour différent (on néglige le 29 février et on compte donc une année de 365 jours). La première personne ne pose pas de problème, la seconde a une probabilité 364/365 d être née un jour différent de la première, la troisième a une probabilité 363/365 d être née un jour différent des deux précédentes, et ainsi de suite. Finalement la probabilité que tous soient nés un jour différent est N 1 i=1 365 i 365 et donc la probabilité que deux personnes aient un anniversaire en commun est N 1 1 i=1 365 i 365 2. Écrivez la fonction python anniversaires(n) qui calcule la valeur numérique de la probabilité qu il existe 2 personnes parmi un groupe de n personnes ayant leur anniversaire le même jour. En particulier, combien vaut cette probabilité pour un groupe de 23 personnes? def a n n i v e r s a i r e ( n ) : p = 1. p = p (365 i ) /365 return 1 p Remarque : Pour des raisons d arrondis, cette fonction déclare que la probabilité pour plus de 153 personnes est 1. On pourrait calculer la valeur exacte sous la forme d un rapport de deux entiers en utilisant la fonction def a n n i v e r s a i r e ( n ) : numerateur = 1 numerateur = numerateur (365 i ) denominateur = 365 (n 1) r e t u r n ( denominateur numerateur, denominateur ) Cette fonction renvoie un couple qui représente le numérateur et le dénominateur de la probabilité recherchée. Comme Python est capable de gérer des entiers arbitrairement grands il n y a aucune erreur d arrondi. 3. Quel est le rapport avec les tables de hachage? La probabilité d avoir une collision (deux clés hachées sur la même valeur) en insérant n clés dans une table de hachage de taille 365 est la même que la probabilité d avoir un conflits d anniversaires. De manière générale, en remplaçant 365 par la taille de la table de hachage, on a la probabilité d avoir une collision en insérant n valeurs. 4. Généralisez la fonction anniversaire pour qu elle calcule la probabilité que l on obtienne une collision en ajoutant n valeurs dans une table de hachage de taille m. 4

def c o l l i s i o n s ( n, m) : p = 1. p = p (m i ) /m return 1 p Remarque : On peut vérifier expérimentalement à l aide de cette fonction que le nombre de clés à insérer pour avoir une probabilité fixée d avoir une collision est de l ordre de m (le plus simple est de calculer les valeurs collisions(n, n 2 ) pour des valeurs de n de plus en plus grandes et de remarquer que la probabilité converge). 5