Hash Tables. Ilaria Castelli A.A. 2009/2010. Università degli Studi di Siena Dipartimento di Ingegneria dell Informazione



Documenti analoghi
TABELLE AD INDIRIZZAMENTO DIRETTO

Dizionario. Marina Zanella Algoritmi e strutture dati Tabelle hash 1

Implementazione di dizionari

Heap scenario. Ho un insieme dinamico di oggetti, ciascuno identificato con una priorità. (la priorità è semplicemente un numero);

Tabelle Hash. Implementazioni Dizionario. Implementazione. Tabelle ad accesso diretto. Tempo richiesto dall operazione più costosa:

Algoritmi e Strutture Dati

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Tavole (o tabelle) hash

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Tavole hash. Alcune possibili implementazioni dell ADT Dizionario. Tavole ad accesso diretto. Tempo richiesto dall operazione più costosa:

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Università degli Studi G.d Annunzio Chieti Pescara Corso di Laurea in Economia Informatica

Sommario. Tabelle ad indirizzamento diretto e hash Funzioni Hash

Algoritmi e Strutture Dati

Risoluzione delle collisioni con indirizzamento aperto

Analisi dell Hashing

Massimo Benerecetti Tabelle Hash: gestione delle collisioni

Tabelle hash. Vittorio Maniezzo - Università di Bologna

Gianpiero Cabodi e Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Look up table, caso generale

Massimo Benerecetti Tabelle Hash

Esercizi Capitolo 7 - Hash

Informatica 3. Informatica 3. LEZIONE 22: Politiche di risoluzione delle collisioni. Lezione 23 - Modulo 1. Politiche di risoluzione delle collisioni

argomenti Hashing Funzioni hash per file Tabelle hash Funzioni hash e metodi per generarle Inserimento e risoluzione delle collisioni Eliminazione

Algoritmi e Strutture Dati

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH

Tabelle Hash! Presentare le tabelle hash e la nozione di funzione di hashing Discutere la complessità di questa realizzazione per le Tavole

Hash file. idea di base : il file è organizzato in B bucket, i record sono assegnati ai bucket in ragione del valore di chiave.

Tabelle Hash. Massimo Benerecetti. Informatica. Lezione n. Parole chiave: Inserire testo. Corso di Laurea:

Informatica 3. Informatica 3. LEZIONE 21: Ricerca su liste e tecniche di hashing. Lezione 21 - Modulo 1. Introduzione (1) Introduzione (2) Ricerca:

05EIP. Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino

Algoritmi 2 - Dr. Simone Faro - Esercizi sulle Tabelle Hash 1

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Organizzazioni hash. Corso di Basi di Dati e Sistemi Informativi

Tecnica HASH. Corso di Linguaggi di Programmazione. Stefano Ferilli. Pasquale Lops.

Alberi binari di ricerca

Esercitazione 5 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Dizionari. Hashtables.

Il TDA Map. Tabelle hash

Definizione informale. Il TDA Map memorizza coppie formate da una chiave k e da un valore v. La coppia è chiamata entry. Ogni chiave deve essere unica

Il TDA Map. Definizione informale. I metodi del TDA Map 2. I metodi del TDA Map 1. Interfaccia Map 1 NO_SUCH_KEY. Tabelle hash

FILE E INDICI Architettura DBMS

Tipo di dato Dizionario

ADT Mappa. Le chiavi (il mezzo per accedere agli elementi) hanno lo scopo di rendere efficiente la ricerca. Strutture Dati

Corso di Informatica

Strutture dati e loro organizzazione. Gabriella Trucco

Tabelle hash. Damiano Macedonio Università Ca' Foscari di Venezia.

Strutture fisiche e strutture di accesso ai dati

Organizzazione Fisica dei Dati (Parte II)

Ordinamenti per confronto: albero di decisione

Strutture Dati. Parte I: pile, code, liste, tabelle hash

ORDINE DI INSERIMENTO DELLE CHIAVI <35 >35

Somma di numeri floating point. Algoritmi di moltiplicazione e divisione per numeri interi

Altro di ADT. Dominio. Funzioni. Dominio. Funzioni. Costanti - Collezioni

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

algoritmi e strutture di dati

Una breve introduzione all implementazione in C di algoritmi su grafo

Notazione posizionale. Codifica binaria. Rappresentazioni medianti basi diverse. Multipli del byte

Strutture Dati. (parte I: pile, code, liste, tabelle hash)

Elaborato di Algoritmi e Strutture Dati. Traficante Nicola

Informazione e Registri - 2

Algoritmi e Strutture Dati

Strutture dati per insiemi disgiunti

Strutture di accesso ai dati: B + -tree

Basi di Dati e Sistemi Informativi. Organizzazione fisica dei dati. Corso di Laurea in Ing. Informatica Ing. Gestionale Magistrale

ALGORITMI CORSO DI STUDIO IN INFORMATICA (laurea triennale) UNIVERSITÀ DEGLI STUDI DI CATANIA ANNO ACCADEMICO 2014/15

Calcolare x n = x x x (n volte)

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Dati e Algoritmi 1: A. Pietracaprina. Mappa (I parte)

Memorizzazione di una relazione

TIPO DI DATO ASTRATTO

Algoritmi e Strutture di Dati

Strutture dati - Parte 1

Strutture di accesso ai dati: B + -tree

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

Databases. Architettura di un DBMS: Struttura ad indice per i files, B + -Trees

ADT Dizionario. Come nella Mappa: Diversamente dalla Mappa:

PROVA SCRITTA DEL MODULO DI NOME: COGNOME: MATRICOLA:

PROVA SCRITTA DEL MODULO INTEGRATO E DEL CORSO DI NOME: COGNOME: MATRICOLA: CFU:

Architettura dei sistemi di elaborazione: La memoria (parte 2)

Analogico vs. Digitale. LEZIONE II La codifica binaria. Analogico vs digitale. Analogico. Digitale

Lunghezza media. Teorema Codice D-ario prefisso per v.c. X soddisfa. L H D (X). Uguaglianza vale sse D l i. = p i. . p.1/27

La codifica dei numeri

Hashing. Dott. Ezio Bartocci, Dott. Francesco De Angelis. Laboratorio di Algoritmi e strutture Dati - AA 2006/2007

Concetti di teoria dei campioni ad uso degli studenti di Statistica Economica e Finanziaria, A.A. 2017/2018. Giovanni Lafratta

Problemi, istanze, soluzioni

Rappresentazione dell informazione

Moltiplicazione e Divisione tra numeri relativi

Strutture dati per insiemi disgiunti (union-find)

Moltiplicazione tra numeri interi. Moltiplicazione e Divisione tra numeri relativi. Moltiplicazione: algoritmo carta e penna (base 2)

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

Esercitazione E3 File System

Transcript:

Hash Tables Ilaria Castelli castelli@dii.unisi.it Università degli Studi di Siena Dipartimento di Ingegneria dell Informazione A.A. 2009/2010 I. Castelli Hash Tables, A.A. 2009/2010 1/42

Hash Tables Indirizzamento diretto Tabelle Hash Risoluzione di collisioni Indirizzamento aperto I. Castelli Hash Tables, A.A. 2009/2010 2/42

Introduzione A volte è necessario disporre di strutture dati che fungano da dizionario. inserimento ricerca rimozione NON sono necessarie altre operazioni (massimo, minimo, ordinamento... ) Le hash tables sono strutture dati efficienti utili a questo scopo...non sono l unica soluzione possibile... sotto alcune condizioni sono la soluzione più vantaggiosa I. Castelli Hash Tables, A.A. 2009/2010 3/42

Indirizzamento Problema dell indirizzamento: Disponiamo di un insieme di chiavi prelevate da un universo U = {k 0, k 1,... k m1 }. Ad ogni chiave sono associati una serie di dati. i dati sono costituiti da un insieme di record un record è una struttura dati eterogenea, contenente una combinazione di elementi di diverso tipo. Gli elementi di un record sono detti anche campi. key dati aggiuntivi k0 Ilaria Castelli 201 castelli@dii.unisi.it k1 Edmondo Trentin... 211 trentin@dii.unisi.it...... k(m1) Marco Maggini 118 maggini@dii.unisi.it I. Castelli Hash Tables, A.A. 2009/2010 4/42

Indirizzamento Scopo: 1 avere tempi di ricerca (look-up) rapidi (costanti O(1)) 2 ottimizzare l uso della memoria key dati aggiuntivi k0 Ilaria Castelli 201 castelli@dii.unisi.it k1 Edmondo Trentin... 211 trentin@dii.unisi.it...... k(m1) Marco Maggini 118 maggini@dii.unisi.it I. Castelli Hash Tables, A.A. 2009/2010 5/42

Indirizzamento diretto Soluzione semplice: tabelle ad indirizzamento diretto creare uno spazio di memoria per ogni possibile chiave ci sarà una corrispondenza diretta tra la chiave e lo spazio assegnato al relativo record Chiavi Indici Record Edmondo Trentin 1 Ilaria Castelli 201 castelli@dii.unisi.it Marco Maggini 2... Edmondo Trentin... 211 trentin@dii.unisi.it...... Ilaria Castelli 99 Marco Maggini 118 maggini@dii.unisi.it I. Castelli Hash Tables, A.A. 2009/2010 6/42

Indirizzamento diretto Semplificazione: consideriamo come chiavi i numeri interi L indirizzamento diretto è comodo quando l insieme delle chiavi U è piccolo U (insieme di tutte le chiavi) T[0...8] 1 8 2 0 1 2 key dati aggiuntivi 4 7 0 3 4 3 K (chiavi effettive) 3 6 5 5 6 7 5 6 8 I. Castelli Hash Tables, A.A. 2009/2010 7/42

Indirizzamento diretto Per rappresentare l insieme si usa un array T [0...(m 1)] Ogni posizione è associata ad una e una sola chiave dell insieme U Si assume che non esistano più elementi con la stessa chiave T [k i ] punta all elemento dell insieme con la chiave k i (e alle sue informazioni aggiuntive) T [k i ] = NIL se non esiste nessun elemento con chiave k i I. Castelli Hash Tables, A.A. 2009/2010 8/42

Indirizzamento diretto - Operazioni DIRECTADDRESSSEARCH(T, k ) r e t u r n T[ k ] Ricerca DIRECTADDRESSINSERT (T, x ) T[ key [ x ] ] = x Inserimento DIRECTADDRESSDELETE(T, x ) T[ key [ x ] ] = NIL Rimozione Queste tre operazioni richiedono tempo O(1) I. Castelli Hash Tables, A.A. 2009/2010 9/42

Indirizzamento diretto - Considerazioni Gli elementi dell insieme (i record) vengono memorizzati in strutture dati esterne Ogni posizione della tabella T contiene un puntatore alla struttura dati corrispondente È superfluo memorizzare la chiave dell elemento In alcune applicazioni gli elementi possono essere memorizzati direttamente nella tabella I. Castelli Hash Tables, A.A. 2009/2010 10/42

Indirizzamento diretto - Considerazioni Se U non è grande, allora l array ha dimensioni modeste In tal caso l utilizzo dell indirizzamento diretto è efficiente Ricorda: deve esistere una posizione nell array per ogni possibile valore della chiave Se il numero di chiavi necessarie è piccolo rispetto all intero universo delle chiavi sprechiamo molto spazio Se U è molto grande può essere difficile (o impossibile) allocare la memoria necessaria Le hash tables sono un alternativa efficiente alle tabelle con indirizzamento diretto I. Castelli Hash Tables, A.A. 2009/2010 11/42

Indirizzamento diretto Esempio Consideriamo un dizionario della lingua italiana con circa 130.000 parole. K è l insieme delle parole della lingua italiana = K = 130.000 L = {a, b, c,..., z} è l alfabeto = L = 26 U è l universo di tutte le possibili parole che possiamo costruire a partire da L. Supponiamo parole di lunghezza massima 15. U = 15 i=1 K = 130.000 L i 7 10 19 I. Castelli Hash Tables, A.A. 2009/2010 12/42

Hash Tables Ind. diretto = l elemento con chiave k è associato alla posizione k Hashing = l elemento con chiave k è associato alla posizione h(k) U (insieme di tutte le chiavi) K (chiavi effettive)... k0 k1 k2 k3 T[0,...,m1] h(k0) = h(k1) h(k2) h(k3) I. Castelli Hash Tables, A.A. 2009/2010 13/42

Hash Function h(k) è detta funzione hash h : U {0, 1,..., m 1} Consente di calcolare la posizione nell array, a partire dalla chiave k h(k) è il valore hash della chiave k L obiettivo è ridurre la dimensione dell array Non sono necessarie U locazioni di memoria, ma solo m I. Castelli Hash Tables, A.A. 2009/2010 14/42

Hash Tables Se K U con gli array ad indirizzamento diretto si spreca molta memoria! Con le hash tables la quantità di memoria necessaria può essere ridotta a Θ( K ) Il tempo necessario per una ricerca resta O(1) nel caso medio Si ottiene un buon compromesso tra lo spazio occupato e il tempo necessario per effettuare una ricerca È possibile che vi siano collisioni se key i key j e h(key i ) = h(key j ) Se la funzione hash distribuisce in modo uniforme le chiavi nelle posizioni dell array, la probabilità di collisioni diminuisce U > m, quindi evitare del tutto le collisioni è impossibile I. Castelli Hash Tables, A.A. 2009/2010 15/42

Gestione delle collisioni - Chaining Si inseriscono tutti gli elementi con lo stesso valore hash in una lista concatenata U (insieme di tutte le chiavi) T[0,...,m1]... k0 k1 K (chiavi effettive) k0 k2 k1 k3 k2 k3 I. Castelli Hash Tables, A.A. 2009/2010 16/42

Gestione delle collisioni - Chaining T [h(k)] contiene un puntatore all inizio della lista concatenata in cui sono inseriti gli elementi con lo stesso valore hash h(k) Set T [h(k)] = NIL non c è nessun elemento con valore hash h(k) Operazioni CHAINEDHASHSEARCH(T, k ) / c e r c a l a c h i a v e k n e l l a l i s t a T[ h ( k ) ] / LISTSEARCH(T[ h ( k ) ], k ) Ricerca CHAINEDHASHINSERT (T, x ) / i n s e r i s c i x n e l l a l i s t a T[ h ( key [ x ] ) ] / LISTINSERT (T[ h ( key [ x ] ) ], x ) Inserimento CHAINEDHASHDELETE(T, x ) / e l i m i n a x d a l l a l i s t a T[ h ( key [ x ] ) ] / LISTDELETE(T[ h ( key [ x ] ) ], x ) Rimozione I. Castelli Hash Tables, A.A. 2009/2010 17/42

Gestione delle collisioni - Chaining Usando le liste: L inserimento richiede tempo O(1) La ricerca richiede un tempo proporzionale alla lunghezza della lista nel caso peggiore La rimozione può essere compiuta in O(1) se la lista è bidirezionale Se la lista è unidirezionale, prima di effettuare la rimozione di x, bisogna anche cercare l elemento che lo precede. Il tempo è quindi proporzionale alla lunghezza della lista I. Castelli Hash Tables, A.A. 2009/2010 18/42

Analisi della tecnica di chaining 1 Caso peggiore tutti gli n elementi collidono su uno stesso valore di hash si genera un unica lista concantenata di lunghezza n 2 Caso medio le performance dipendono dalla scelta della funione hash e dal modo in cui distribuisce le chiavi negli m slot supponiamo uniformità semplice della funzione hash, cioè che la proababilità di ogni chiave di cadere nei vari slot sia uniforme 3 Si assume che il calcolo della funzione di hash h(k) sia costante: O(1) 4 Si assume che l accesso alle celle dell array sia fatto in tempo costante: O(1) Def. Si definisce il fattore di carico α per la tabella hash T come α = n m cioè il numero medio di elementi in una lista I. Castelli Hash Tables, A.A. 2009/2010 19/42

Analisi della tecnica di chaining - Ricerca senza successo Teorema In una tabella hash che risolve le collisioni per concatenazione una ricerca senza successo richiede tempo medio pari a Θ(1 + α) assumendo uniformità semplice della funzione hash Dimostrazione 1 se si ha uniformità semplice della funzione di hash, ogni chiave k può cadere in modo equiprobabile in ognuno degli m slot 2 ogni lista è lunga α = n m 3 se la ricerca è senza successo esaminerò α elementi 4 il tempo per calcolare h(k) è O(1) I. Castelli Hash Tables, A.A. 2009/2010 20/42

Analisi della tecnica di chaining - Ricerca con successo Teorema In una tabella hash che risolve le collisioni per concatenazione una ricerca con successo richiede tempo medio paria a Θ(1 + α) assumendo uniformità semplice della funzione hash Dimostrazione 1 se si ha uniformità semplice della funzione di hash, ogni chiave k può cadere in modo equiprobabile in ognuno degli m slot 2 l analisi è più complessa: dipende dal punto della lista in cui mediamente si trova l elemento da trovare 3 si suppone che gli elementi vengano inseriti alla fine della lista (questa ipotesi non cambia il risultato!) I. Castelli Hash Tables, A.A. 2009/2010 21/42

Analisi della tecnica di chaining - Ricerca con successo 4 l elemento i-esimo viene inserito in una lista lunga in media i1 m 5 per trovare l elemento i-esimo si deve calcolare h(k) esaminare mediamente i1 m elementi 6 il tempo medio per una ricerca è T (n) = 1 n Il tempo è Θ(1 + α) n T (i) = 1 n i=1 = 1 + 1 nm n i=1 = 1 + α 2 1 2m n i=1 ( 1 + i 1 ) m (i 1) = 1 + 1 nm ( ) n(n 1) 2 I. Castelli Hash Tables, A.A. 2009/2010 22/42

Analisi della tecnica di chaining Conclusioni 1 Se il numero m di slot nella tabella è proporzionale al numero n di elementi si ha n = O(m) 2 α = O(m) m = O(1) 3 La ricerca richiede tempo costante 4 Tutte le operazioni possono essere eseguite in tempo costante I. Castelli Hash Tables, A.A. 2009/2010 23/42

Scelta della funzione hash - Assunzione di uniformità Una buona funzione hash soddisfa l assunzione di uniformità semplice Supponiamo che ogni chiave k sia pescata indipendentemente dalle altre da U, con probabilità P (k). Allora P (k) = 1 j = 0, 1,..., m 1 m k:h(k)=j Partizionando U in sottoinsiemi tali che in ognuno cadano tutte le chiavi che sono mappate su uno stesso valore di hash, allora vi è la stessa probabilità di estrarre un elemento da uno qualsiasi di questi sottoinsiemi. Ma... Raramente si conosce la distribuzione di probabilità P Per questo motivo è necessario usare delle euristiche per ottenere una buona funzione hash Nota: si assume che le chiavi siano esprimibili come numeri naturali. I. Castelli Hash Tables, A.A. 2009/2010 24/42

Funzioni hash - Metodo della divisione La posizione è data dal resto della divisione tra k ed m: h(k) = k mod m È molto veloce, ma la scelta di m deve essere fatta in maniera opportuna Cattiva scelta: m = 2 p k è rappresentata su w bit: 0 k < 2 w h(k) = k mod m = k mod 2 p = 0 h(k) < 2 p k 2 p = shift di k a dx, di p posizioni k mod 2 p sono gli ultimi p bit di k I. Castelli Hash Tables, A.A. 2009/2010 25/42

Funzioni hash - Metodo della divisione Esempio: k = 1010110010 = w = 10 (10 bit) m = 10000 = 2 4 = p = 4, m = 16 Note: k m = } 101011 {{}, 0010 }{{} = h(k) = 0010 quoziente resto Per calcolare h(k) si usa solo una piccola frazione dei bit della chiave k Molta informazione non viene usata! I. Castelli Hash Tables, A.A. 2009/2010 26/42

Funzioni hash - Metodo della divisione Buona scelta: Scegliere m come un numero primo non vicino ad una potenza di 2. Esempio: n = 2000 chiavi collisioni gestite con la tecnica di chaining vogliamo α 3 Come si sceglie m? 2000 3 667 m = 701 è una buona scelta! h(k) = k mod 701 I. Castelli Hash Tables, A.A. 2009/2010 27/42

Funzioni hash - Metodo della moltiplicazione Richiede due passi: 1 si moltiplica k per una costante 0 < A < 1, e si estrae la parte frazionaria 2 si moltiplica il risultato per m e si prende la parte intera h(k) = m (ka mod 1) = m (ka ka ) È più lento, ma non ci sono valori critici per m va bene con qualsiasi valore di 0 < A < 1. Knuth suggerisce A = 51 2 0.6180339... se m = 2 p si semplifica l implementazione I. Castelli Hash Tables, A.A. 2009/2010 28/42

Funzioni hash - Metodo della moltiplicazione Esempio: m = 1000 k = 123 A 0.6180339 h(k) = 1000 (123 0.6180339 mod 1) = 1000 (76.0181697 mod 1) = 1000 0.0181697 = 18.1697 = 18 I. Castelli Hash Tables, A.A. 2009/2010 29/42

Funzioni hash - Metodo della moltiplicazione Se m = 2 p si implementa facilmente: k è codificato su w bit (dimensione di una parola in memoria) A2 w è codificato su w bit il prodotto k A2 w sta al più su 2w bit k A2 w = r 1 2 w + r0 h(k) corrisponde ai p bit più significativi di r 0 w bits k x floor(a*2^w) r1 h(k) r0 p bits I. Castelli Hash Tables, A.A. 2009/2010 30/42

Gestione delle collisioni - Indirizzamento aperto Tutti gli elementi vengono inseriti nella tabella stessa. Ogni posizione della tabella contiene, o un elemento, o NIL NON ci sono puntatori Non ci sono strutture dati esterne alla tabella Inserimento: se si ha una collisione, si cerca uno slot alternativo in cui inserire Ricerca: si esaminano sistematicamente le posizioni della tabella finché, o si trova l elemento, oppure è chiaro che non è presente invece di seguire i puntatori, si calcola una sequenza di posizioni in cui l elemento potrebbe trovarsi La tabella può riempirsi completamente α 1 I. Castelli Hash Tables, A.A. 2009/2010 31/42

Indirizzamento aperto - Scansione Per inserire o cercare un elemento, si esamina una sequenza di posizioni finché si trova l elemento, oppure N IL la sequenza s 0, s 1,..., s m1 è una permutazione degli indici 0, 1,..., m 1 della tabella dipende da k la funzione hash è h : U {0, 1,..., m 1} {0, 1,..., m 1} la sequenza di scansione è h(k, 0), h(k, 1),..., h(k, m 1) I. Castelli Hash Tables, A.A. 2009/2010 32/42

Indirizzamento aperto - Inserimento Si vuole inserire un elemento con k = 706 h(k, 0) = h(706, 0) h(k, 1) = h(706, 1) h(k, 2) = h(706, 2) T[0,...,m1] 772... 0 1 2 3 vuoto! 887 983 706 m1 I. Castelli Hash Tables, A.A. 2009/2010 33/42

Indirizzamento aperto - Inserimento HASHINSERT (T, k ) i = 0 r e p e a t / c a l c o l o l o s l o t / j = h ( k, i ) i f T[ j ] = NIL / s e e vuoto i n s e r i s c o / then T[ j ] = k r e t u r n j e l s e i = i + 1 u n t i l i = m / r a g g i u n t a l a f i n e d e l l a t a b e l l a / e r r o r "hash table overflow " La ricerca dello slot in cui inserire termina quando si trova una posizione libera Se la tabella è piena non si può inserire I. Castelli Hash Tables, A.A. 2009/2010 34/42

Indirizzamento aperto - Ricerca HASHSEARCH(T, k ) i = 0 r e p e a t / c a l c o l o l o s l o t / j = h ( k, i ) i f T[ j ] = k then r e t u r n j e l s e i = i + 1 u n t i l T[ j ] = NIL or i = m / r a g g i u n t a l a f i n e d e l l a t a b e l l a / e r r o r "hash table overflow " La ricerca termina: se si trova la chiave oppure se si trova una posizione vuota (se k fosse stata inserita, sarebbe lì!) Esplora la stessa sequenza di slot della procedura di inserimento I. Castelli Hash Tables, A.A. 2009/2010 35/42

Indirizzamento aperto - Rimozione 1 Se si gestissero le collisioni con la tecnica di chaining sarebbe semplice: è sufficiente eliminare un elemento dalla lista. 2 Nel caso dell indirizzamento aperto la rimozione è un operazione delicata. k9 k1 DELETED... h(k9,1) h(k1,0) h(k2,0) = h(k9,0) Si vuole rimuovere k2 Si inserisce NIL nella posizione che era occupata da k2. Attenzione: h(k9, 0) = h(k2, 0)! Che succede se si cerca k9? Soluzione: non inseriamo NIL, ma un apposito marker DELET ED la procedura di inserimento deve trattare DELET ED come una posizione libera la procedura di ricerca non deve fermarsi quando trova DELET ED I. Castelli Hash Tables, A.A. 2009/2010 36/42

Uniformità della funzione hash Ipotesi di uniformità Si assume che, per ogni chiave k, sia equamente probabile una qualunque delle m! possibili permutazioni delle posizioni nella tabella È una generalizzazione dell ipotesi di uniformità semplice. In questo caso la funzione hash non restituisce una sola posizione, ma un intera sequenza. È difficile definire una funzione di hashing che sia davvero uniforme Le tecniche maggiormente usate sono: Scansione lineare Scansione quadratica Double hashing I. Castelli Hash Tables, A.A. 2009/2010 37/42

Scansione lineare Data una funzione hash h : U {0, 1,..., m 1}, il metodo di scansione lineare usa la funzione hash h(k, i) = ( h (k) + i ) mod m i = 0,..., m 1 Si genera una sequenza di posizioni contigue l una all altra T [h (k)], T [h (k) + 1],...,T [m 1],T [0],...,T [h (k) 1] Si ottiene una sequenza diversa per ogni possibile posizione di partenza m possibili sequenze, su m! Facile da implementare Agglomerazione primaria: le posizioni occupate si accumulano in lunghi tratti contigui Come influisce questo sul tempo necessario per la ricerca? I. Castelli Hash Tables, A.A. 2009/2010 38/42

Scansione quadratica Data una funzione hash h : U {0, 1,..., m 1}, il metodo di scansione quadratica usa la funzione hash h(k, i) = ( h (k) + c 1 i + c 2 i 2) mod m i = 0,..., m 1 dove c 1 e c 2 sono costanti fissate a priori La posizioni dipendono quadraticamente da i Funziona meglio della scansione lineare, ma c 1 e c 2 devono essere scelte in modo che la sequenza scansioni l intera tabella. Si ottiene una sequenza diversa per ogni possibile posizione di partenza m possibili sequenze, su m! Agglomerazione secondaria: h(k 1, 0) = h(k 2, 0) = h(k 1, 1) = h(k 2, 1) =... I. Castelli Hash Tables, A.A. 2009/2010 39/42

Double hashing Data due funzioni hash h1 : U {0, 1,..., m 1} e h2 : U {0, 1,..., m 1}, il metodo di double hashing usa la funzione hash h(k, i) = (h 1 (k) + ih 2 (k)) mod m i = 0,..., m 1 È uno dei migliori metodi esistenti Le posizioni successive alla prima dipendono da h 2 mod m A differenza degli altri metodi, dipende in due modi da k. Nota: i valori h 1 (k) e h 2 (k) sono indipendenti l uno dall altro. Ogni possibile coppia (h 1 (k), h 2 (k)) genera una sequenza diversa m 2 possibili sequenze È il metodo che si avvicina di più allo schema ideale di hashing uniforme I. Castelli Hash Tables, A.A. 2009/2010 40/42

Double hashing Nota: È necessario che h 2 (k) ed m siano primi tra loro. Se hanno un divisore comune d, si generano ciclicamente sempre le stesse posizioni. Non si visita mai l intera tabella ma solo (1/d)-esimo delle possibili posizioni. Di solito si usa m primo e si sceglie h 2 in modo che generi sempre numeri minori di m Esempio: h 1 (k) = k mod m h 2 (k) = 1 + (k mod m ), con m < m (m 1,o m 2) I. Castelli Hash Tables, A.A. 2009/2010 41/42

Indirizzamento aperto - Analisi Ricerca senza successo Data una tabella hash a indirizzamento aperto con fattore dicarico α < 1, il numero medio di accessi di una ricerca senza successo è al più 1 1α, assumendo uniformità della funzione hash Ricerca con successo Data una tabella hash a indirizzamento aperto con fattore di carico α < 1, il numero medio di accessi di una ricerca con successo è al più 1 α ln 1 1α, assumendo uniformità della funzione hash e che ogni chiave sia ricercata nella tabella in modo equamente probabile I. Castelli Hash Tables, A.A. 2009/2010 42/42