Tables de hachage. ENSIIE: Programmation avancée, Dictionnaires 1

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

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

Les structures de données. Rajae El Ouazzani

Programme Compte bancaire (code)

ARBRES BINAIRES DE RECHERCHE

Les arbres binaires de recherche

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours de Programmation 2

Algorithmique, Structures de données et langage C

Recherche dans un tableau

Programmation Par Objets

Package Java.util Classe générique

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Cours 1 : La compilation

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

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

Analyse de sécurité de logiciels système par typage statique

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

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

Cours d initiation à la programmation en C++ Johann Cuenin

Chapitre 10. Les interfaces Comparable et Comparator 1

Introduction à la programmation concurrente

1 Recherche en table par balayage

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

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

Conventions d écriture et outils de mise au point

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

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Représentation d un entier en base b

Programmation Orientée Objet Java

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

1.6- Génération de nombres aléatoires

Introduction au langage C

Corrigés des premiers exercices sur les classes

# 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>

Programmation avec des objets : Cours 7. Menu du jour

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Principes des langages de programmation INF 321. Eric Goubault

Algorithmique I. Algorithmique I p.1/??

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

OS Réseaux et Programmation Système - C5

Arguments d un programme

Classes et Objets en Ocaml.

Premiers Pas en Programmation Objet : les Classes et les Objets

Objets et Programmation. origine des langages orientés-objet

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

BASES DE DONNEES TP POSTGRESQL

Java Licence Professionnelle CISII,

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Plateforme PAYZEN. Définition de Web-services

Perl Orienté Objet BioPerl There is more than one way to do it

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)

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Programmer en JAVA. par Tama

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)

AWS avancé. Surveiller votre utilisation d EC2

Les processus légers : threads. Système L3, /31

Programmation Orientée Objet

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Définition des Webservices Ordre de paiement par . Version 1.0

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Un ordonnanceur stupide

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

Machines Virtuelles. et bazard autour. Rémi Forax

STAGE IREM 0- Premiers pas en Python

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

Utilitaires méconnus de StrataFrame

Optimisations des SGBDR. Étude de cas : MySQL

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

Projet de programmation (IK3) : TP n 1 Correction

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

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Licence Sciences et Technologies Examen janvier 2010

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

Algorithmique et Programmation, IMA

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Utilisation d objets : String et ArrayList

Flux de données Lecture/Ecriture Fichiers

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

ACTIVITÉ DE PROGRAMMATION

Chapitre 7. Récurrences

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Cryptographie. Cours 3/8 - Chiffrement asymétrique

Corrigé des exercices sur les références

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

TRIGONOMETRIE Algorithme : mesure principale

TP3 : Manipulation et implantation de systèmes de fichiers 1

Le prototype de la fonction main()

Programmation Classique en langage C

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

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

Initiation à l algorithmique

Transcription:

Tables de hachage ENSIIE: Programmation avancée, Dictionnaires 1

Recherche en temps constant Pour n très grand, O(log n) peut être encore trop Idée : utiliser un tableau en utilisant les clefs comme indices (accès aux éléments en temps constant) Problème : nombre de clefs possibles potentiellement trop grand Exemple : Dictionnaire de la langue française 26 25 > 10 35 entrées potentielles (en supposant que le mot le plus long de la langue francaise est anticonstitutionnellement) ENSIIE: Programmation avancée, Dictionnaires 2

Hachage L idée est de restreindre les indices possible en regroupant les clefs. On considére une fonction hash qui va de l ensemble des clefs dans [0..m-1] pour m approximativement égal au nombre de clés à stocker dans le dictionnaire On stocke le couple (key,value) dans la case hash(key) d un tableau de m éléments ENSIIE: Programmation avancée, Dictionnaires 3

hash hash hash hash hash hash ENSIIE: Programmation avancée, Dictionnaires 4

Collision Comme les clefs potentielles sont bien plus nombreuses que la taille du tableau (c est qui a motivé la fonction de hachage), la fonction hash ne peut être injective : plusieurs clefs pour une case du tableau Solution : mettre dans les cases une liste d association au lieu d un unique couple ENSIIE: Programmation avancée, Dictionnaires 5

hash hash ENSIIE: Programmation avancée, Dictionnaires 6

Choix de la fonction de hachage Pour vraiment gagner par rapport aux listes d association, il faut limiter les collisions le choix de la fonction de hachage est essentiel Exemple : dictionnaire de la langue française, 2 16 entrées si on prend comme fonction de hachage la valeur en ASCII des deux premières lettres, il y aura beaucoup de collisions! (beaucoup de mots en ch, peu en zx) Le choix de la fonction de hachage dépend des clefs et de leur répartition dans l ensemble des clefs potentielles Hachage uniforme : pour toute clef k et tout i [0 m 1], la probabilité que hash(k) = i est de 1 m ENSIIE: Programmation avancée, Dictionnaires 7

Exemple de bonnes fonctions de hachage Dans le cas où les clefs sont des entiers répartis de façon homogène, on peut utiliser les fonctions de hachage suivantes : Méthode de la division : on prend hash(k) = k mod m Problème : ne marche bien que si m est un nombre premier éloigné d une puissance de 2 Méthode de la multiplication On considère une constante réelle 0 < A < 1 On prend la partie fractionnaire f = ka ka de k A On retourne la partie entière de m f En pratique, on choisit pour m une puissance de 2 pour avoir une version plus efficace de l algorithme ci-dessus La valeur A = 5 1 2 donne de bons résultats ENSIIE: Programmation avancée, Dictionnaires 8

Structure de données En OCaml : type ( k, v) dict = (( k, v) Liste_assoc.dict) array Réutilisation En C : struct bucket = { key key; value val; struct bucket* next; }; struct dict_base { unsigned int taille; struct bucket** contenu; }; ENSIIE: Programmation avancée, Dictionnaires 9

Création creer(i) On crée un tableau de taille i dont les éléments sont des listes chaînées contenant des couples clef, valeur En OCaml : let creer i = Array.make i (Liste_assoc.creer 2) En C : dict creer(int i) { int j; dict res = malloc(sizeof(struct dict_base)); res->taille = i; res->contenu = calloc(i, sizeof(struct bucket*)); for (j=0; j<i; j++) res->contenu[j] = NULL; return res; } ENSIIE: Programmation avancée, Dictionnaires 10

Insertion inserer(d,k,v) on calcule hash(k) on ajoute le couple k,v en tête de la liste chaînée à la position hash(k) du tableau ENSIIE: Programmation avancée, Dictionnaires 11

Implémentation (insertion) En OCaml : let inserer d k v = let h = hash k mod Array.length d in d.(h) <- Liste_assoc.inserer d.(h) k v; d En C : dict inserer(dict d, key k, value v) { unsigned int h = hash(k) % d->taille; d->contenu[h] = cons(k, v, d->contenu[h]); return d; } ENSIIE: Programmation avancée, Dictionnaires 12

Recherche rechercher(d,k) on calcule hash(k) on recherche un couple k,v dans la liste chaînée à la position hash(k) du tableau ENSIIE: Programmation avancée, Dictionnaires 13

Implémentation (recherche) En OCaml : let rechercher d k = let h = hash k mod Array.length d in Liste_assoc.rechercher d.(h) k En C : dict rechercher(dict d, key k) { unsigned int h = hash(k) % d->taille; struct bucket* b = d->contenu[h]; while (b!= NULL) { if (b->key == k) return b->val; b = b->next; } return NULL; } ENSIIE: Programmation avancée, Dictionnaires 14

Suppression supprimer(d,k) on calcule hash(k) on supprimer les couple k,v dans la liste chaînée à la position hash(k) du tableau ENSIIE: Programmation avancée, Dictionnaires 15

En OCaml : let supprimer d k = let h = hash k mod Array.length d in d.(h) <- Liste_assoc.supprimer d.(h) k En C : dict supprimer(dict d, key k) { unsigned int h = hash(k) % d->taille; struct bucket* b = d->contenu[h]; if (b == NULL) return d; if (b->key == k && b->next == NULL) d->contenu[h] = NULL; while (b->next!= NULL) { if (b->next->key == k) b->next = b->next->next; else b = b->next; }; return d; } ENSIIE: Programmation avancée, Dictionnaires 16

Complexité Complexité Moyenne Pire inserer O(1) O(1) rechercher O(1 + α) O(n) supprimer O(1 + α) O(n) où α = n m Le cas le pire est quand on n a que des collisions Pour la complexité en moyenne, on suppose que la fonction de hachage est uniforme ENSIIE: Programmation avancée, Dictionnaires 17

Redimensionnement dynamique Pour obtenir une complexité constante en moyenne, on peut faire grossir le tableau quand les entrées sont trop nombreuses (typiquement quand n >m) On créer un nouveau tableau de taille 2m On insère les anciennes associations dans le nouveau tableau, à l aide d une fonction de hachage sur [0..2m-1] Coût de la copie en O(n), mais n est nécessaire que pour n = 2 k en moyenne, coût de l insertion, de la recherche et de la suppression en O(1) ENSIIE: Programmation avancée, Dictionnaires 18

Résumé en moyenne rechercher insérer supprimer listes d association O(n) O(1) O(n) ABR O(log n) O(log n) O(log n) arbres AVL O(log n) O(log n) O(log n) tables de hachage O(1) O(1) O(1) dans le pire des cas rechercher insérer supprimer listes d association O(n) O(1) O(n) ABR O(n) O(n) O(n) arbres AVL O(log n) O(log n) O(log n) tables de hachage O(n) O(n) O(n) ENSIIE: Programmation avancée, Dictionnaires 19