Dizionario. Marina Zanella Algoritmi e strutture dati Tabelle hash 1

Documenti analoghi
TABELLE AD INDIRIZZAMENTO DIRETTO

Implementazione di dizionari

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

Sommario. Tabelle ad indirizzamento diretto e hash Funzioni Hash

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

Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati

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

Analisi dell Hashing

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

Risoluzione delle collisioni con indirizzamento aperto

Tavole (o tabelle) hash

Massimo Benerecetti Tabelle Hash: gestione delle collisioni

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati

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

Tabelle hash. Vittorio Maniezzo - Università di Bologna

Look up table, caso generale

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

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

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

Ordinamenti per confronto: albero di decisione

Massimo Benerecetti Tabelle Hash

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH

Esercizi Capitolo 7 - Hash

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

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

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

Algoritmi e Strutture Dati

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

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

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

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

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

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

Strutture fisiche e strutture di accesso ai dati

Di cosa parliamo oggi?

Corso di Informatica

Organizzazioni hash. Corso di Basi di Dati e Sistemi Informativi

Strutture di accesso ai dati: B + -tree

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

Strutture di accesso ai dati: B + -tree

Algoritmi e Strutture di Dati

FILE E INDICI Architettura DBMS

Teoria dell informazione

Problemi e algoritmi. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 (da U. de' Liguoro - Alg. & Spe. 03/04)

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come

Modello di sistema di comunicazione

algoritmi e strutture di dati

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

Codifica dell Informazione per il Calcolo Scientifico

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

Divide et impera (Divide and Conquer) Dividi il problema in sottoproblemi piu` semplici e risolvili ricorsivamente

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

Algoritmi e Strutture Dati

Programma del corso. Rappresentazione delle Informazioni. Introduzione agli algoritmi. Architettura del calcolatore

Strutture dati per insiemi disgiunti

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

Somma di numeri binari

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

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 02/04/2014/ Appello straordinario/ Foglio delle domande / VERSIONE 1

Modulo 1 I numeri. Università degli Studi di Salerno

TIPO DI DATO ASTRATTO

Algoritmi e strutture dati

Fundamentals of Computer Science

Rappresentazione dei numeri. Rappresentazione di insiemi numerici mediante insiemi finiti di stringhe di bit Problemi:

UD 1.2e: La codifica Digitale dei Numeri CODIFICA DIGITALE DEI NUMERI

Modulo 1: Le I.C.T. UD 1.2e: La codifica Digitale dei Numeri

Indirizzamento Aperto

Algoritmi e Strutture Dati

ORDINE DI INSERIMENTO DELLE CHIAVI <35 >35

INFORMATICA 3 Prof.ssa Sara Comai

Elaborato di Algoritmi e Strutture Dati. Traficante Nicola

Macchine RAM. API a.a. 2013/2014 Gennaio 27, 2014 Flavio Mutti, PhD

Variabili e assegnazione

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Analisi ammortizzata (Tarjan in 1985)

Organizzazione Fisica dei Dati (Parte II)

Cominciamo ad analizzare la rappresentazione delle informazioni... di Cassino. C. De Stefano Corso di Fondamenti di Informatica Università degli Studi

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

Calcolatori Elettronici

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

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

1. Un array è: A. Un simbolo usato nel linguaggio C per rappresentare un numero non specificato di variabili B. Un insieme di indirizzi di memoria

Implementazione di DFA in C

Funzioni, Stack e Visibilità delle Variabili in C

determinare una funzione di accesso non biunivoca ma che riduca al massimo la possibilità di collisioni (funzione hash),

Le Liste. Maurizio Palesi

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

Descrizione delle operazioni di calcolo. Espressioni costanti semplici

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Il TDA Map. Tabelle hash

Transcript:

Dizionario Insieme dinamico che offre solo le seguenti operazioni: inserimento di un elemento dato cancellazione di un elemento dato ricerca di un elemento dato (verifica dell appartenenza di un elemento all insieme) Esempio di dizionario: tabella dei simboli mantenuta dal compilatore di un linguaggio di programmazione, in cui le chiavi degli elementi sono stringhe di caratteri corrispondenti agli identificatori del linguaggio Marina Zanella Algoritmi e strutture dati Tabelle hash 1

Tabella hash: conclusioni anticipate Struttura di dati efficace per realizzare dizionari Generalizzazione del concetto di array ordinario Alternativa efficace all indirizzamento diretto di un array quando il n n di chiavi effettivamente memorizzate è piccolo rispetto al n totale di possibili chiavi (efficace perché usa un array di dimensione proporzionale a n) Invece di usare l indice per indirizzare direttamente l array, calcola l indice usando la chiave Marina Zanella Algoritmi e strutture dati Tabelle hash 2

Tabella a indirizzamento diretto Funziona bene se l universo delle chiavi U = {0, 1,, m 1} è ragionevolmente piccolo Assunzione: nessuna coppia di elementi ha la stessa chiave Si realizza mediante un array T[0.. m 1] dove ogni posizione, o slot, corrisponde a una chiave appartenente a U ed è l elemento che ha tale chiave o un puntatore allo stesso T[k] = NIL l insieme non contiene elementi con chiave k (Spesso) non è necessario memorizzare la chiave dell oggetto perché coincide con l indice del corrispondente elemento della tabella Marina Zanella Algoritmi e strutture dati Tabelle hash 3

Tabella a indirizzamento diretto (cont.) Marina Zanella Algoritmi e strutture dati Tabelle hash 4

Tabella a indirizzamento diretto: operazioni DIRECT-ADDRESS-SEARCH(T, k) return T[k] O(1) DIRECT-ADDRESS-INSERT(T, x) T[key[x]] x O(1) DIRECT-ADDRESS-DELETE(T, x) T[key[x]] NIL O(1) Marina Zanella Algoritmi e strutture dati Tabelle hash 5

Tabelle a indirizzamento diretto vs. tabelle hash Se U è grande, memorizzare T può essere impraticabile a causa della limitatezza della memoria disponibile; inoltre l insieme K U delle chiavi effettivamente utilizzate può essere così piccolo rispetto a U che la maggior parte dello spazio occupato da T sarebbe di fatto inutilizzato per ovviare a queste difficoltà si usano le tabelle hash che richiedono una memoria Θ( K ) e un tempo di ricerca di un oggetto O(1) (limite valido per il tempo medio mentre per l indirizzamento diretto vale nel caso peggiore) Marina Zanella Algoritmi e strutture dati Tabelle hash 6

Tabella hash Funzione hash: definisce una corrispondenza deterministica fra U e le posizioni della tabella hash T[0.. m 1] che contiene gli oggetti, dove m < U : h: U {0, 1,, m 1} h(k) = valore hash di k = indice dell oggetto con chiave k in T L obiettivo di h è ridurre l intervallo degli indici dell array, cioè ridurre m rispetto a U Problema: due chiavi possono avere lo stesso valore di hash (fenomeno di collisione) Marina Zanella Algoritmi e strutture dati Tabelle hash 7

Metodi per la risoluzione delle collisioni Concatenazione Indirizzamento aperto Marina Zanella Algoritmi e strutture dati Tabelle hash 8

Risoluzione delle collisioni per concatenazione Tutti gli elementi che collidono nella stessa posizione j di T vengono posti in una lista concatenata e nella posizione j si memorizza il puntatore alla testa della lista Marina Zanella Algoritmi e strutture dati Tabelle hash 9

Tabella hash con concatenazione: operazioni CHAINED-HASH-INSERT(T, x) inserisci x in testa alla lista T[h(key[x])] O(1) nel caso pessimo CHAINED-HASH-SEARCH(T, k) ricerca un elemento con chiave k nella lista T[h(k)] O(n) nel caso pessimo n = lunghezza della lista T[h(k)] CHAINED-HASH -DELETE(T, x) cancella x dalla lista T[h(key[x])] O(n) nel caso pessimo perché richiede innanzi tutto la ricerca dell elemento da cancellare Marina Zanella Algoritmi e strutture dati Tabelle hash 10

Analisi della ricerca entro una tabella hash con concatenazione Fattore di carico α di una tabella hash con m posizioni che memorizza n elementi (le cui chiavi appartengono a un universo U) numero medio di elementi memorizzati in ogni lista concatenata = n/m α può essere <, >, = 1 Marina Zanella Algoritmi e strutture dati Tabelle hash 11

Ricerca entro una tabella hash con concatenazione: caso pessimo Tutte le n chiavi corrispondono alla stessa posizione lista di lunghezza n tempo di ricerca Θ(n) + tempo per calcolare h(k) tempo non migliore di quello necessario quando, per rappresentare il dizionario, si usa una lista concatenata Marina Zanella Algoritmi e strutture dati Tabelle hash 12

Ricerca entro una tabella hash con concatenazione: caso medio Ipotesi: 1) valore hash h(k) è calcolato in tempo O(1) 2) Uniformità semplice della funzione hash: qualunque chiave corrisponde in modo equamente probabile a una delle m posizioni Due teoremi affermano che, date entrambe le precedenti ipotesi, in una tabella hash in cui le collisioni sono risolte per concatenazione, una ricerca, sia essa con o senza successo, richiede in media un tempo Θ(1 + α) Se m è proporzionale a n n = O(m) α = n/m = O(m)/m = O(1), cioè la ricerca richiede un tempo medio costante tutte le operazioni del dizionario possono essere eseguite in media con tempo O(1) Marina Zanella Algoritmi e strutture dati Tabelle hash 13

Requisiti di una buona funzione hash per una tabella hash con concatenazione Soddisfare (approssimativamente) l ipotesi di uniformità semplice, come sotto formulata: probabilità che k sia estratta (in modo indipendente) da U k: h( k ) = P( k) j = 1 m per j = 0, 1,, m 1 Sfortunatamente la distribuzione di probabilità P di solito non è conosciuta Esempio in cui P è nota: le chiavi sono numeri reali casuali distribuiti in modo indipendente e uniforme nell intervallo 0 < k < 1 La funzione hash h(k) = km soddisfa l ipotesi di uniformità semplice Marina Zanella Algoritmi e strutture dati Tabelle hash 14

Creazione di funzioni hash per una tabella hash con concatenazione Si possono adottare tecniche euristiche, che tengano conto di info qualitative su P Ad es. una buona funzione hash per la tabella dei simboli di un compilatore deve minimizzare la possibilità che identificatori simili (quali pt e pts), che sono frequenti in un programma, corrispondano alla stessa posizione Marina Zanella Algoritmi e strutture dati Tabelle hash 15

Creazione di funzioni hash per una tabella hash con concatenazione (cont.) Molte funzioni hash assumono U = insieme numeri naturali se k non è un naturale, bisogna interpretarlo come tale Esempio Tabella dei simboli di un compilatore le chiavi sono stringhe k = pt Codifica ASCII: p = 112, t = 116 k = (112, 116) dove 112 e 116 sono trattati come due cifre in base 128 = (112. 128 + 116) 10 = 14452 10 Marina Zanella Algoritmi e strutture dati Tabelle hash 16

Schemi per la creazione di funzioni hash per una tabella hash con concatenazione Assunzione: le chiavi sono numeri naturali Per divisione Per moltiplicazione Universale Marina Zanella Algoritmi e strutture dati Tabelle hash 17

Metodo di divisione h(k) = k mod m Sono valori di m da evitare i seguenti: m = 2 p perché altrimenti h(k) = k mod 2 p = p bit meno significativi di k il valore di hash non dipende da tutti i bit della chiave in generale, m = b p se le chiavi sono numeri in base b perché altrimenti h(k) = k mod b p = valore che non dipende da tutte le cifre in base b m = 2 p 1 se k è una stringa di caratteri interpretata in base 2 p perché altrimenti a due stringhe identiche eccetto che per uno scambio di due caratteri adiacenti corrisponde lo stesso valore di hash Sono buoni valori di m valori primi non troppo vicini a potenze esatte di 2 Marina Zanella Algoritmi e strutture dati Tabelle hash 18

Metodo di divisione (cont.) Esempio Si desidera realizzare una tabella hash con concatenazione. Scegliere un valore di m appropriato per una funzione hash che adotta il metodo di divisione. Dati: n chiavi = 2000 lunghezza media accettabile di una lista concatenata = 3 m = n primo vicino a 2000/3 = 701 Effettuata questa scelta, si dovrebbe controllare se effettivamente h distribuisce regolarmente le chiavi fra le 701 posizioni, provando con chiavi vere Marina Zanella Algoritmi e strutture dati Tabelle hash 19

Metodo di moltiplicazione h(k) = m(ka mod 1) dove A è una costante, 0 < A < 1 con ka mod 1 si è rappresentata la parte frazionaria di ka (cioè ka - ka ) Vantaggio: il valore di m non è critico, tipicamente si sceglie m = 2 p perché h si può calcolare facilmente come segue h(k) = m(ka mod 1) = 2 p ((k A. 2 w mod 2 w ) / 2 w ) dove w = lunghezza di parola k occupa una sola parola Marina Zanella Algoritmi e strutture dati Tabelle hash 20

Metodo di moltiplicazione (cont.) Procedimento di calcolo di h(k) = 2 p ((k A. 2 w mod 2 w ) / 2 w ) 1) Calcola A. 2 w = intero su w bit 2) Calcola k A. 2 w = intero su 2w bit = r 1. 2 w + r 0 (w bit per r 1 e w per r 0 ) 3) Isola h(k) = p bit più significativi di r 0 Qualche valore di A funziona meglio di altri; Knuth suggerisce A ( 5 1) /2 = 0.6180339887... (cioè l opposto del coniugato del rapporto aureo dei numeri di Fibonacci) Marina Zanella Algoritmi e strutture dati Tabelle hash 21

Hashing universale Caso pessimo quando la funzione hash è nota a priori: le chiavi vengono scelte dispettosamente in modo dipendente da h a n chiavi può corrispondere la stessa posizione tempo medio di ricerca Θ(n) Obiettivo: migliorare il tempo medio di ricerca nel caso peggiore Metodo: hashing universale = scegliere la funzione hash da usare per la tabella hash corrente in modo casuale da una classe di funzioni attentamente definite cosicché sia indipendente dalle chiavi scelte dall avversario Marina Zanella Algoritmi e strutture dati Tabelle hash 22

Hashing universale (cont.) Sia H = {h h: U {0, 1,, m 1}} dove H = n finito Sia H H, H = {h h H, h(x) = h(y), x U, y U, x y} H è detto insieme universale di funzioni hash per l universo U di chiavi considerato e per il valore di m fissato se, x, y U, H = H / m In altre parole, scelta h in modo casuale entro H, la probabilità di collisione fra due chiavi x e y, x y, è 1/m, valore che coincide con la probabilità di collisione corrispondente a una scelta casuale dei due valori di hash entro {0, 1,, m 1} Marina Zanella Algoritmi e strutture dati Tabelle hash 23

Hashing universale: comportamento nel caso medio Teorema Se h è scelta da un insieme universale di funzioni hash ed è usata per n chiavi su una tabella di dimensione m, n m, il n medio di collisioni che coinvolge ciascuna chiave è < 1 Marina Zanella Algoritmi e strutture dati Tabelle hash 24

Hashing universale: costruzione di una classe universale Problema: come si costruisce una classe universale di funzioni hash? Soluzione: a H = { } dove h ( x) = a x mod m h a a r i= 0 i i m = n primo x = <x 0, x 1,, x r >: scomposizione di x in r + 1 sottostringhe binarie di ampiezza fissa, x i < m, i [0,.., r] a = <a 0, a 1,, a r > : sequenza di r + 1 elementi scelti a caso da {0, 1,, m 1} m r + 1 sequenze distinte H = m r + 1 Teorema La classe H sopra definita è una classe universale di funzioni hash Marina Zanella Algoritmi e strutture dati Tabelle hash 25

Indirizzamento aperto Gli elementi sono memorizzati nella tabella hash stessa ogni elemento della tabella contiene o un elemento o NIL (valore convenzionale per identificare una posizione vuota) puntatori (vantaggio dell indirizzamento aperto perché risparmia memoria) elementi memorizzati fuori dalla tabella α 1 Marina Zanella Algoritmi e strutture dati Tabelle hash 26

Indirizzamento aperto: inserimento di un elemento Si scandiscono le posizioni della tabella finché non se ne trova una vuota; se la ricerca fosse sequenziale richiederebbe un tempo lineare meglio effettuare una scansione che dipende dalla chiave obiettivo: associare a ciascuna chiave una sua sequenza di scansione (usata sia per un inserimento, sia per una ricerca) A tal fine si estende la funzione hash perché includa il n di posizioni già esaminate (che parte da 0) come secondo input h(k, i) : U {0, 1,, m 1} {0, 1,, m 1} Vincolo: per ogni chiave k, la sequenza di scansione <h(k,0), h(k,1),, h(k, m 1)> è una permutazione di {0, 1,, m 1} Marina Zanella Algoritmi e strutture dati Tabelle hash 27

Indirizzamento aperto: inserimento di un elemento (cont.) HASH-INSERT(T, k) 1 i 0 2 repeat j h(k, i) 3 if T[j] = NIL 4 then T[j] k 5 si assume, per semplicità, che gli 6 elementi non contengano info satellite 7 return j 8 else i i + 1 9 until i = m 10 error overflow sulla tabella hash Marina Zanella Algoritmi e strutture dati Tabelle hash 28

Indirizzamento aperto: ricerca di un elemento Scandisce la stessa sequenza di posizioni percorsa dall algoritmo di inserimento quando l elemento è stato inserito; ritorna l indice della posizione che contiene l elemento o NIL, se l elemento non è presente HASH-SEARCH(T, k) 1 i 0 2 repeat j h(k, i) 3 if T[j] = k 4 then return j 5 i i + 1 6 until T[j] = NIL o i = m 7 la ricerca termina quando la scansione trova una posizione vuota poiché l elemento di chiave k sarebbe stato inserito proprio lì (l assunzione implicita è che gli elementi non vengano mai cancellati) 8 return NIL Marina Zanella Algoritmi e strutture dati Tabelle hash 29

Indirizzamento aperto: sequenza di scansione Ipotesi di uniformità della funzione hash = generalizzazione dell ipotesi di uniformità semplice della funzione hash al caso in cui la funzione produca non un singolo valore ma una sequenza di scansione (cioè al caso in cui h sia funzione di due variabili di ingresso): ogni chiave ha, in modo equamente probabile, una qualunque delle m! permutazioni di {0, 1,, m 1} come sequenza di scansione, cioè ogni possibile sequenza di scansione è equamente probabile vincolo: una h uniforme deve generare m! sequenze di scansione distinte Problema: difficoltà di realizzare una h uniforme Marina Zanella Algoritmi e strutture dati Tabelle hash 30

Indirizzamento aperto: tecniche per calcolare la sequenza di scansione Scansione lineare Scansione quadratica Hashing doppio Nessuna di esse può generare più di m 2 sequenze di scansione diverse nessuna di esse rispetta l ipotesi di uniformità L hashing doppio genera il maggior n di sequenze di scansione fra le tre è la tecnica che dà i risultati migliori Marina Zanella Algoritmi e strutture dati Tabelle hash 31

Indirizzamento aperto: scansione lineare Posizione iniziale h(k, i) = (h (k) + i) mod m dove h è una funzione hash Il valore h (k) determina l intera sequenza di scansione sono usate solo m sequenze di scansione distinte Esempio. m = 8, h (k) = 3 sequenza di scansione h(k, 0) = h (k) mod 8 = 3 mod 8 = 3 h(k, 1) = 4 mod 8 = 4 h(k, 2) = 5 mod 8 = 5 h(k, 3) = 6 mod 8 = 6 h(k, 4) = 7 mod 8 = 7 h(k, 5) = 8 mod 8 = 0 h(k, 6) = 9 mod 8 = 1 h(k, 7) = 10 mod 8 = 2 Fra una posizione e la successiva esaminata la distanza è unitaria Marina Zanella Algoritmi e strutture dati Tabelle hash 32

Indirizzamento aperto: scansione lineare (cont.) Problema: agglomerazione primaria = le posizione occupate tendono ad accumularsi in lunghi tratti, fatto che aumenta il tempo medio di ricerca Esempio Si assuma che il n di elementi presenti in tabella sia m/2 CASO 1. Le posizioni con indice pari e dispari sono rispettivamente libere e occupate: la ricerca senza successo richiede in media 1,5 accessi CASO 2. Sono occupate le prime m/2 posizioni: la ricerca senza successo richiede in media m/8 accessi Marina Zanella Algoritmi e strutture dati Tabelle hash 33

Indirizzamento aperto: scansione lineare (cont.) Perché le posizione occupate tendono ad accumularsi, ovvero perché si verificano gli agglomerati? Perché la probabilità che una posizione vuota sia la prossima a essere riempita vale (i + 1)/m se tale posizione è preceduta da i piene 1/m se tale posizione è preceduta da una vuota (i + 1)/m > 1/m i tratti di posizioni occupate tendono a diventare ancora più lunghi Marina Zanella Algoritmi e strutture dati Tabelle hash 34

Scansione quadratica h(k, i) = (h (k) + c 1 i + c 2 i 2 ) mod m dove h è una funzione hash c 1 e c 2 sono costanti, c 2 0 Posizione iniziale Il valore h (k) determina l intera sequenza di scansione sono usate solo m sequenze di scansione distinte Fra una posizione e la successiva esaminata la distanza dipende in modo quadratico da i Problema: agglomerazione secondaria = le posizione occupate tendono ad accumularsi quando a due chiavi k 1 e k 2 corrisponde la stessa posizione iniziale (ciò avviene se h (k 1 ) = h (k 2 )) Marina Zanella Algoritmi e strutture dati Tabelle hash 35

Hashing doppio Posizione iniziale h(k, i) = (h 1 (k) + i h 2 (k)) mod m dove h 1 e h 2 sono funzioni hash Esempio h 1 (k) = k mod 13 h 2 (k) = 1 + k mod 11 N.B. anche la distanza dipende dalla chiave Si vuole inserire la chiave k = 14 in una tabella con dimensione m = 13 h(14, 0) = (14 mod 13) mod 13 = 1 mod 13 = 1 (posizione occupata) h(14, 1) = (14 mod 13 + 1 + 14 mod 11) mod 13 = (1 + 1 + 3) mod 13 = 5 (posizione occupata) h(14, 2) = [14 mod 13 + 2(1 + 14 mod 11)] mod 13 = [1 + 2(1 + 3)] mod 13 = 9 mod 13 = 9 (posizione libera in cui viene inserita la chiave) Marina Zanella Algoritmi e strutture dati Tabelle hash 36

Hashing doppio (cont.) Prima dell inserimento Dopo 0 1 65 2 3 4 77 5 105 6 7 43 8 9 10 11 48 12 0 1 65 2 3 4 77 5 105 6 7 43 8 9 14 10 11 48 12 Marina Zanella Algoritmi e strutture dati Tabelle hash 37

Hashing doppio (cont.) Ogni possibile coppia (h 1 (k), h 2 (k)) implica una diversa sequenza di scansione, dove h 1 (k) e h 2 (k) variano in modo indipendente Θ(m 2 ) sequenze di scansione distinte Marina Zanella Algoritmi e strutture dati Tabelle hash 38

Hashing doppio: scelta della funzione hash Vincolo h 2 (k) deve essere primo rispetto a m per k U, altrimenti, se k m e h 2 (k) hanno un MCD d >1, la ricerca corrispondente a k andrebbe a esaminare solo una frazione (1/d) della tabella Metodi alternativi per soddisfare il vincolo 1) Scegliere m = 2 p e h 2 che produce sempre un n dispari 2) Scegliere m = n primo e h 2 che produce sempre un n intero positivo < m Secondo il metodo 2) in generale si può scegliere h 1 (k) = k mod m h 2 (k) = 1 + k mod m dove m è di poco minore di m (ad es. m 1 o m 2) Marina Zanella Algoritmi e strutture dati Tabelle hash 39

Hashing doppio (cont.) Esempio Determinare una funzione hash che realizzi un hashing doppio secondo il metodo 2) per una tabella di hash a indirizzamento aperto contenente approssimativamente 700 posizioni m= 701 (n primo) h 1 (k) = k mod 701 h 2 (k) = 1 + k mod 700 Marina Zanella Algoritmi e strutture dati Tabelle hash 40

Operazione di inserimento in una tabella hash con indirizzamento aperto: caso medio Teorema Data una tabella hash a indirizzamento aperto con α < 1, il n medio di accessi di una ricerca senza successo è al più 1/(1 α), assumendo l uniformità della funzione hash Corallario L inserzione in una tabella hash a indirizzamento aperto con α < 1 richiede al più 1/(1 α) accessi in media, assumendo l uniformità della funzione hash Se α = costante n medio accessi per una ricerca senza successo = n medio accessi per una inserzione = O(1) Marina Zanella Algoritmi e strutture dati Tabelle hash 41

Operazione di ricerca in una tabella hash con indirizzamento aperto: caso medio Teorema Data una tabella hash a indirizzamento aperto con α < 1, il n medio di accessi di una ricerca con successo è al più 1 1 ln α 1 α assumendo l uniformità della funzione hash e nell ipotesi che ogni chiave sia ricercata nella tabella in modo equiprobabile Marina Zanella Algoritmi e strutture dati Tabelle hash 42