Les tables de hachage (Hash tables)

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

Architecture des Systèmes d Information Architecture des Systèmes d Information

Recherche dans un tableau

Initiation à la programmation en Python

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

ÉPREUVE COMMUNE DE TIPE Partie D

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Calculateur quantique: factorisation des entiers

Algorithmes de recherche

CHAPITRE VIII : Les circuits avec résistances ohmiques

1 Recherche en table par balayage

ARBRES BINAIRES DE RECHERCHE

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

Algorithmique, Structures de données et langage C

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

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Représentation des Nombres

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Algorithmes récursifs

Système binaire. Algèbre booléenne

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

EBS 204 E C B S. Publication : Novembre 96

Utiliser les supports d'exemplaires

Programmation linéaire

FONDEMENTS MATHÉMATIQUES 12 E ANNÉE. Mathématiques financières

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

SRAL Saint Raphaël. Maison des associations 213, rue de la Soleillette Saint Raphaël. : : dromain.jean-pierre@neuf.

Algorithme des fourmis appliqué à la détection et au suivi de contours dans une image

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

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

Structures algébriques

INF 4420: Sécurité Informatique Cryptographie II

Polynômes à plusieurs variables. Résultant

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

Introduction à l étude des Corps Finis

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

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

PIN Entry Plus Guide de l'utilisateur de la gestion des listes

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

NOTATIONS PRÉLIMINAIRES

Ordonnancement. N: nains de jardin. X: peinture extérieure. E: électricité T: toit. M: murs. F: fondations CHAPTER 1

Christophe CANDILLIER Cours de DataMining mars 2004 Page 1

RACCOURCIS CLAVIERS. DEFINITION : Une «combinaison de touches» est un appui simultané sur plusieurs touches.

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

ODH. Mon Espace. Manuel d utilisation. MON ESPACE ODH Manuel d utilisation. Une question? Contactez le service client au

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

Chapitre 7 - Relativité du mouvement

Cryptographie et fonctions à sens unique

LE MODELE CONCEPTUEL DE DONNEES

Nombres premiers. Comment reconnaître un nombre premier? Mais...

Navigation dans Windows

Théorie et codage de l information

Manuel d'utilisation

Systemes d'exploitation des ordinateurs

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

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

Cours d Informatique

PARAGON SYSTEM BACKUP 2010

Microprocesseur + Logiciel

CORRECTION EXERCICES ALGORITHME 1

D'UN THÉORÈME NOUVEAU

VIII- Circuits séquentiels. Mémoires

UTILISATION DE L'APPLICATION «PARTAGE DE FICHIERS EN LIGNE»

Distribution Uniforme Probabilité de Laplace Dénombrements Les Paris. Chapitre 2 Le calcul des probabilités

Utilisation d objets : String et ArrayList

Qu est-ce que le Fastt?

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

Le module Supply Chain pour un fonctionnement en réseau

CH.6 Propriétés des langages non contextuels

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

Modulo Bank - Groupe E.S.C Chambéry - prérequis à la formation - doc. interne - Ecoute active.doc Page 1

Cours Microfer Chartres

Méthodes de quadrature. Polytech Paris-UPMC. - p. 1/48

Parc des Bois de Grasse - 1 rue Louison Bobet GRASSE

Introduction a l'algorithmique des objets partages. Robert Cori. Antoine Petit. Lifac, ENS Cachan, Cachan Cedex. Resume

Cours Informatique Master STEP

Intégration et probabilités TD1 Espaces mesurés Corrigé

Conversion d un entier. Méthode par soustraction

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

Quelques Algorithmes simples

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Tune Sweeper Manuel de l'utilisateur

Journées MATHRICE "Dijon-Besançon" DIJON mars Projet MySafeKey Authentification par clé USB

Créer une base de données

1. Vocabulaire : Introduction au tableau élémentaire

1. Introduction Création d'une requête...2

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Exercices Alternatifs. Quelqu un aurait-il vu passer un polynôme?

Exercices Alternatifs. Quelqu un aurait-il vu passer un polynôme?

LE RESEAU GLOBAL INTERNET

DEVOIR MAISON : THEME : LES CLES DE CONTROLE. I. La clé des codes barres

"! "#$ $ $ ""! %#& """! '& ( ")! )*+

Chapitre 10. Les interfaces Comparable et Comparator 1

IFT1215 Introduction aux systèmes informatiques

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Transcription:

Problématique Les tables de hachage (Hash tables) Avec une structure ordonnée (tableau trié ou ABR) : diminue le coup d'une recherche augmente le coup d'une insertion Si l'emplacement en mémoire était prédictible : diminuerait fortement le coup d'une recherche diminuerait fortement le coup d'une insertion Il serait donc intéressant d'avoir une relation direct clé @dresse mémoire Notion de «clé» Notion de «clé» Les données manipulées sont enregistrées dans des n- uplets. Ex : (Nom, Prénom, N d'étudiant) C'est la notion de schéma en Base de Donnée. Chaque enregistrement est appelé : entité Les entités sont distinguables les une des autres. Parmi les champs du schéma on peut trouver un sous ensemble caractérisant chaque entité. Cet identifiant est appelé : clé Ex : (Nom, Prénom, N d'étudiant) (Michel, SERALT, L) (Michel, SERALT, L) (Albert, DPONTEL, L) (Jean-pierre, MARIEL, L) (Jean, ROCHEFORT, L) (Daniel, PREVOST, L) (Albert, DPONTEL, L) (Jean-pierre, MARIEL, L) (Jean, ROCHEFORT, L) (Daniel, PREVOST, L) L L L L L Notion de «clé» Fonctions de hachage On appelle univers des clés () : l'ensemble des valeurs possibles des clés. En général, toutes les clés ne sont pas utilisées. On notera K l'ensemble des clés utilisées. On appelle Fonction de hachage : ne fonction qui détermine la place d'une entité uniquement d'après sa clé H : clés [..m] avec [..m] = Zone mémoire ATTENTION : Les clés ne sont pas le résultat d'une fonction de hachage. Elles résultent d'un choix du programmeur. L L L K L L L L C'est la composition de deux fonctions : ) Fonction de codage clés entiers ) Fonction d'adressage entiers [..m] Fonctions de codage Fonctions d'adressage direct ASCII : On considère la clé comme une chaîne de caractères. Chaque caractère est remplacé par son code ASCII Ex : H(hello) = = Codage des bits par un entier : On considère la représentation machine de la clé. On ré-interprète les bits comme le code d'un entier. Ex : H(hello) = = La fonction d'adressage la plus simple c'est : l'identité ou adressage direct L'@dresse de l'entité correspond au code de sa clé.

Limite de l'adressage direct Adressage en compression Dans la pratique le nombre de clés réellement conservées est très inférieur à l'ensemble des clés. D'où un gachi de mémoire. #(K) << #() K Pour économiser l'espace mémoire, la fonction d'adressage va compresser les clés On dit que la clé k a été hachée dans l'alvéole h(k) La fonction de hachage doit être déterministe : une clé est toujours hachée dans la même alvéole. K h() = h() = h() = h() = H() = Collisions Fonctions uniformes injectives Le problème c'est que clés peuvent être hachées dans la même alvéole. Si h(k A )=h(k B ) on dit que k A et k B sont en collision. K H() = h() = h() = h() = H() = La fonction de hachage doit bien repartir les clés. Elle doit être uniforme simple c'est-à-dire : h: K [..m] k, i, P( h(k)=i ) = /m La probabilité P inj que : «une fonction uniforme simple soit injective» P inj = (/m n ) m (m) (m-)... (m-n+) = (m!/(m-n)!) (/m n ) Si m= et n= alors P inj <, C'est le problème des anniversaires : «Si l'on réuni personnes, il y a plus d'une chance sur qu'au moins personnes aient leur anniversaire à la même date» Adressage par extraction Adressage par division Dans une fonction de hachage avec adressage par extraction, on extrait des bits de la clé pour obtenir la valeur de hachage. Ex : avec les bits,, et et un codage ASCII h(hello)= = = Inconvénient, la valeur de hachage ne dépend pas de l'intégralité de la clé : h(hello) = h(say hello)= ne bonne fonction de hachage doit faire intervenir tous les bits de la clé. Hachage avec adressage par division : h: K [..m] h(k) = k modulo m Ex : avec m= h()= Cette technique a une bonne répartition mais multiplie les collisions. On la combinera avec d'autres méthodes. Pour minimiser les collisions on doit choisir : m premier et éloigné des puissances de Adressage par multiplication Adressage par MAD Hachage avec adressage par multiplication : h: K [..m] h(k) = m (k A modulo ) avec A=cst Le choix de la constante de A dépend du type de clé Knuth a montré que la valeur A = ( )/ avait de grande chance de bien marcher. Ex : avec m = et A = ( )/ =,... h() =. ( (., ) modulo ) =. (, modulo ) =., =, = Hachage avec adressage par Multiplication, Addition et Division (MAD) : h: K [..m] h(k) = (ak + b) modulo m avec a> et b> Ex : avec m =, a = et b = h() = (. + ) modulo = ( + ) = modulo = Attention : La constante a ne doit pas être un multiple de m. Sinon toute valeur de hachage serait égale à b.

Adressage par compression Compression par addition Hachage avec adressage par compression : On découpe en morceaux de n bits le code de la clé On compresse les morceaux avec une opération : addition, et, ou, ou exclusif et polynomiale Avec l'addition se pose le problème de la retenue : Ex : h() = + + + = () Mais aussi de l'uniformité : «Probabilité de tirer un avec deux dés à faces» Compression par ET/O Compression par XOR Avec le ou le résultat est : toujours plus grand que les nombres d'origine. Il y aura collision en fin de tableau. Ex : h() = ou ou ou = = Avec le et le résultat est : toujours plus petit que les nombres d'origine. Il y aura collision en début de tableau. Ex : h() = et et et = = Avec le xor on évite les problèmes du ET et du O. Les valeurs sont uniformément reparties. Ex : h() = xor xor xor = = Mais on rencontre des collisions sur les permutations Ex : h() = xor xor xor = = = h() Briser les sous chaînes de bits Compression polynomiale ne bonne fonction de hachage doit : briser sous chaînes des bits de la clé. On garde le xor mais on ajoute des décalages : la sous chaîne n sera décalée vers la droite de n bits Ex : = h() = xor xor xor = = Ex : = h() = xor xor xor = = Dans la compression polynomiale : ) les sous chaînes ont des longueurs de, ou bits ) chaque sous chaîne représente un coefficient ) on calcule le polynôme : a a a a... a n P(z) = a + a z + a z + a z +... + a n z n très bonne méthode pour le type string. Il a été démontré que le choix de z= donne au plus collisions sur un ensemble de mots anglais Résolution des collisions Exemple général On ne peut pas éviter les collisions. Pour résoudre les collisions il y a deux méthodes : Hachage fermé : La fonction de hachage ne retourne qu'une valeur par clé (fermé sur cette valeur) et on range la clé à partir de cette valeur. Hachage ouvert : La fonction de hachage retourne un ensemble de valeurs. Cet ensemble représente les rangements possibles pour cette clé. Cet ensemble sera parcouru pour l'insertion comme pour la recherche. Pour toutes les méthodes de résolution de collision : On utilisera la fonction d'adressage : h(k) = k mod On insérera les clés ( code) suivantes : Rubis Jade Topaze Opale Perle Saphir Agate Grenat Onyx

Principe de la résolution par chaînage : Les éléments en collisions sont chaînés entre eux à l'extérieur du tableau de hachage. La table de hachage contient le début de ces listes chaînées. Calcul de la valeur de hachage : h(k) @ SI tab[@] contient la clé k ALORS SINON explore la liste jusqu'à trouver la clé k FIN SI A l'état initial, toutes les listes chaînées sont vides. On insère : (Rubis ), (Jade ) et (Topaze ) On insère : (Opale ), (Perle ) et (Saphir ) Rubis - Topaze - Jade - Saphir - Rubis - Topaze - Jade - Perle - Opale - On insère : (Agate ), (Grenat ) et (Onyx ) Saphir - Rubis - Topaze - Jade - Grenat- Agate - Perle - Onyx - Opale - Recherche facile Suppression facile Seul l'ordre des clés en collisions compte. ne allocation mémoire à chaque enregistrement. Taille : un pointeur supplémentaire pour chaque clé Rubis Jade Topaze Opale Perle Saphir Agate Grenat Onyx TOTAL : MOYENNE :, Principe de la résolution par coalescence : Lorsqu'il y a collision avec une autre clé on cherche une autre place disponible. On note cette place comme le NEXT de la première clé. Au fil des collisions, ces liens explicites forment une liste chaînée dans la table. Calcul de la valeur de hachage : h(k) @ TANQE tab[@] ne contient pas la clé k FAIRE SI next[@] = ALORS echec SINON @ next[@] FIN SI FIN TANQE

A l'état initial, toutes les cases sont disponibles. Disponible : {,,,,,,,,,,} On insère : (Rubis ), (Jade ) et (Topaze ) Rubis - Topaze - Jade - Disponible : {,,,,,,,} On insère : (Opale ), (Perle ) et (Saphir ) Saphir - Rubis - Topaze - Jade - Perle - Opale - Disponible : {,,,,} On insère : (Agate ), (Grenat ) et (Onyx ) Saphir - Onyx - Grenat- Rubis - Topaze - Jade - Agate - Perle - Opale - Disponible : {,} Pas d'allocation mémoire pour un enregistrement. Le nombre de clé est limité à la taille de la table. Taille : un lien supplémentaire pour chaque clé. La table dépend de l'ordre de toutes les clés. Suppression très compliquée (voir T.D.). Coalesc. Rubis Jade Topaze Opale Perle Saphir Agate Grenat Onyx TOTAL : MOYENNE :,, Principe par sondage linéaire : Lorsqu'il y a collision avec une autre clé on parcours circulairement la table pour chercher une place disponible. On parcours donc l'ensemble suivant : {@ @=(h(k) + i) mod m avec i [..m] } Calcul de la valeur de hachage : h(k) @ @ initiale TANQE tab[@] ne contient pas la clé k FAIRE @ (@ + ) mod m SI @ = @ initiale ALORS echec FIN TANQE On insère : (Rubis ), (Jade ) et (Topaze ) Rubis - Topaze - Jade - h(rubis) = ( mod + i ) mod avec i= : h(rubis)= h(jade) = ( mod + i ) mod avec i= : h(jade)= h(topaze) = ( mod + i ) mod avec i= : h(saphir)=

On insère : (Opale ), (Perle ) et (Saphir ) Saphir - Rubis - Topaze - Jade - Opale - Perle - h(opale) = ( mod + i ) mod avec i= : h(opale)= avec i= : h(opale)= h(perle) = ( mod + i ) mod avec i= : h(perle)= avec i= : h(perle)= avec i= : h(perle)= avec i= : h(perle)= h(saphir) = ( mod + i ) mod avec i= : h(saphir)= On insère : (Agate ), (Grenat ) et (Onyx ) Grenat- Onyx - Saphir - Rubis - Topaze - Jade - Opale - Perle - Agate - h(agate) = ( mod + i ) mod avec i= : h(agate)= avec i= : h(agate)= avec i= : h(agate)= avec i= : h(agate)= avec i= : h(agate)= avec i= : h(agate)= h(grenat) = ( mod + i ) mod avec i= : h(grenat)= avec i= : h(grenat)= avec i= : h(grenat)= mod = h(onyx) = ( mod + i ) mod avec i= : h(onyx)= avec i= : h(onyx)= avec i= : h(onyx)= avec i= : h(onyx)= avec i= : h(onyx)= avec i= : h(onyx)= avec i= : h(onyx)= Pas d'allocation mémoire pour un enregistrement. Recherche fructueuse facile Suppression facile Taille : réduite au minimum. Recherche infructueuse en O(n) Le nombre de clé est limité à la taille de la table. La table dépend de l'ordre de toutes les clés. Formation d'amas dans la table. Coalesc. Sond. Lin. Rubis Jade Topaze Opale Perle Saphir Agate Grenat Onyx TOTAL : MOYENNE :,,, Principe par double-hachage : Lorsqu'il y a collision avec une autre clé on parcours circulairement la table, avec un pas donné par une autre fonction de hachage, pour chercher une place disponible. On parcours donc l'ensemble suivant : {@ @ =(h (k) + i h (k)) mod m avec i [..m] } Calcul de la valeur de hachage : h (k) @ TANQE tab[@] ne contient pas la clé k FAIRE @ (@ + h (k)) mod m SI @ déjà parcouru ALORS echec FIN TANQE A l'état initial, toutes les cases de la table sont vides. Pour l'exemple on considérera : h(k) = (h (k) + i h (k)) mod Avec : h (k) = k mod h (k) = k/ + On insère : (Rubis ), (Jade ) et (Topaze ) Rubis - Topaze - Jade - h (Rubis) = mod = h (Rubis) = / + = h(rubis) = ( + i x ) mod avec i= : h(rubis)= h (Jade) = mod = h (Jade) = / + = h(jade) = ( + i x ) mod avec i= : h(jade)= h (Topaze) = mod = h (Topaze) = / + = h(topaze) = ( + i x ) mod avec i= : h(topaze)= On insère : (Opale ), (Perle ) et (Saphir ) Perle - Saphir - Rubis - Topaze - Jade - Opale - h (Opale) = et h (Opale) = / + = h(opale) = ( + i x ) mod avec i= : h(opale)= avec i= : h(opale)= h (Perle) = et h (Perle) = / + = h(perle) = ( + i x ) mod avec i= : h(perle)= avec i= : h(perle)= mod = h (Saphir) = et h (Saphir) = / + = h(saphir) = ( + i x ) mod avec i= : h(saphir)=

On insère : (Agate ), (Grenat ) et (Onyx ) Perle - Onyx - Saphir - Rubis - Topaze - Jade - Agate - Grenat - Opale - h (Agate) = et h (Agate) = / + = h(agate) = ( + i x ) mod avec i= : h(agate)= avec i= : h(agate)= h (Grenat) = et h (Grenat) = / + = h(grenat) = ( + i x ) mod avec i= : h(grenat)= h (Onyx) = et h (Onyx) = / + = h(onyx) = ( + i x ) mod avec i= : h(onyx)= avec i= : h(onyx)= avec i= : h(onyx)= mod = Pour s'assurer de bien parcourir toute la table : h (k) doit être premier avec m (le nombre de cases) Par exemple prenons une table de m= cases : On garde la même fonction : h (k) = k mod et h (k) = k/ + On insère : Louis VI le gros, Jean II le bon, Charles IV le bel Louis VI le gros Jean II le bon Charles IV le bel Avec i=, h(louis VI le gros)= qui est libre Avec i=, h(jean II le bon)= qui est libre Avec i=, h(charles IV le bel)= qui est libre Pour s'assurer de bien parcourir toute la table : h (k) doit être premier avec m (le nombre de cases) Maintenant on veut insérer : Louis X le hutin h (Louis X le hutin) = mod = h (Louis X le hutin) = / + = Louis VI le gros Avec i=, h(louis X le hutin)= Jean II le bon Avec i=, h(louis X le hutin)=( + )mod= Avec i=, h(louis X le hutin)=( + )mod= Charles IV le bel Avec i=, h(louis X le hutin)=( + )mod= On boucle sur les cases déjà occupées :-( Pas d'allocation mémoire pour un enregistrement. Recherche fructueuse facile Suppression facile Taille : réduite au minimum. Évite la formation d'amas dans la table. Recherche infructueuse en O(n) Le nombre de clé est limité à la taille de la table. La table dépend de l'ordre de toutes les clés. Conclusion Coalesc. Sond. Lin. Double h. Rubis Jade Topaze Opale Perle Saphir Agate Grenat Onyx TOTAL : MOYENNE :,,,, Les tables de hachage se résument à un compromis entre espace mémoire et collisions : Avec une mémoire infini : on évite toutes collisions : @ = Avec une mémoire minimum : toutes les clés sont en collision. Elles sont rangées dans une liste. Nombre de Collisions Espace mémoire Conclusion Sequentiel Dichotomie ABR ABR Equilibré Hachage Complexité moyenne Recherche Insertion / Retrait Complexité du pire cas Recherche Insertion / Retrait (n) (n) (n) (n) (log (n)) (n) (log (n)) (n) (log (n)) (log (n)) (n) (n) (log (n)) (log (n)) (log (n)) (log (n)) () () (n) (n)