Algoritmi e Programmazione Avanzata

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

I tipi Strutturati.
Algoritmi e Strutture Dati
Gli Algoritmi di ordinamento
INFORMATICA Algoritmi fondamentali
Tecnologia delle basi di dati: Strutture fisiche di accesso
Il problem-solving Gianpiero Cabodi e Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino.
Introduzione al linguaggio C
L’oscillatore digitale
1 Classi di memorizzazione. 2 Definiscono le regole di visibilità delle variabili e delle funzioni quando il programma è diviso su più file Stabiliscono.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
RICERCA IN UN VETTORE.
RICERCA IN UN VETTORE. Metodi basati sul confronto di chiavi Si confrontano gli elementi del vettore V con lelemento (chiave K) che si vuole ricercare.
Lez. 131 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Rappresentazione.
Basi di Dati prof. A. Longheu 4 – Progettazione – Introduzione e Modello E-R Cap. 5 Basi di dati Atzeni – Ceri – Paraboschi - Torlone.
Realizzazione del file system
Hash Tables Indirizzamento diretto Tabelle Hash
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Realizzazione del file system
Algoritmi in C++ (1) da completare
Alberi binari di ricerca
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Funzioni definite dall’utente
PROGRAMMI DI RICERCA E ORDINAMENTO
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°13 Heap massimo.
Corso di Fondamenti di programmazione a.a.2009/2010
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Process synchronization
Il problema del dizionario
Capitolo 7 Tavole hash Algoritmi e Strutture Dati.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
Hashing.
Hashing.
Tabelle hash.
Approfondimento delle classi
memoria gestita staticamente:
Le funzioni.
Programmazione modulare nel linguaggio C
Alberi di ricerca binari
Algoritmi e Programmazione Avanzata
Presentazione del progetto di: Reti di calcolatori L-S Matteo Corbelli.
Metodo della moltiplicazione
INFORMATICA Corso Base Modulo G: I DataBase  Access.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Hashing.
void binario(int n); …………………
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
s STRINGHE DI CARATTERI a p e \0
Modulo 5 DataBase ACCESS. Informazioni e Dati INFORMAZIONI vengono scambiate con linguaggio scritto o parlato DATI rappresentazione di informazioni in.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Risoluzione delle collisioni con indirizzamento aperto Con la tecnica di indirizzamento aperto tutti gli elementi stanno nella tavola. La funzione hash.
Hashing. 2 argomenti Hashing Tabelle hash Funzioni hash e metodi per generarle Inserimento e risoluzione delle collisioni Eliminazione Funzioni hash per.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
Il modello relazionale. Modello Relazionale 2 Dal modello concettuale a quello logico Una volta stabilita la rappresentazione concettuale della realtà.
Transcript della presentazione:

Algoritmi e Programmazione Avanzata Tabelle di hash Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino Tabelle di hash

ADT Dizionario In molte applicazioni è necessario un ADT “Dizionario” che supporti le seguenti operazioni: INSERT: Inserisce un elemento nuovo, con un certo valore (unico) di un campo chiave SEARCH: Determina se un elemento con un certo valore della chiave esiste; se esiste, lo restituisce DELETE: Elimina l’elemento identificato dal campo chiave, se esiste. A.A. 2004/2005 APA-hash

Esempi Tabella dei simboli di un compilatore Cache di file o URL Chiave = nome di un identificatore Dati aggiuntivi = tipo, contesto, dichiarazione Cache di file o URL Chiave = path Dati aggiuntivi = attributi e contenuto A.A. 2004/2005 APA-hash

Vettori associativi Una struttura a dizionario si potrebbe implementare facilmente disponendo di vettori associativi, ossia di vettori indicizzabili per contenuto anziché per posizione. Esempio (di fantasia): Simboli[“main”] = { prog.c, 100, void, {int, char **}} Line n = Simboli[“counter”].linenum A.A. 2004/2005 APA-hash

Obiettivi Le tabelle di hash sono una tecnica implementativa per realizzare vettori associativi. Si vuole ottenere per le 3 operazioni fondamentali una complessità pari a O(1) nel caso più frequente (n) nel caso peggiore. A.A. 2004/2005 APA-hash

Idea base Ogni elemento è memorizzato ad un certo indirizzo di un vettore. L’indirizzo, anziché venire calcolato da una funzione di ricerca, viene calcolato da un’opportuna funzione, detta funzione di hash, in tempo O(1). Esempio: Hash(“main”) = 117: il simbolo “main” è memorizzato alla posizione 117 dell’array. A.A. 2004/2005 APA-hash

Tabelle associative U (universo delle chiavi) T chiave 1 7 2 2 4 3 3 9 1 7 2 2 4 3 3 9 6 1 4 5 5 6 2 3 5 7 8 8 8 9 K (chiavi usate) dati associati A.A. 2004/2005 APA-hash

Dizionario mediante tabella associativa T: tabella associativa, key: chiave, x: elemento Search(T, key) Return T[key] Insert(T, x) T[key[x]]  x Delete(T, x) T[key[x]]  NIL Complessità O(1), occupazione O(|U|) O(|U|) è il numero di valori diversi assunti dal campo chiave A.A. 2004/2005 APA-hash

Ipotesi Lo schema precedente funziona solamente se sono verificate due assunzioni fondamentali: non esistono elementi con chiave uguale il vettore T ha dimensione pari al numero di possibili valori diversi delle chiavi. A.A. 2004/2005 APA-hash

Tabelle di hash Nella maggior parte dei casi, il numero di elementi del dizionario |K| è molto minore del numero di valori possibili delle chiavi |U|. Quando l’universo delle chiavi è vasto (|U| cresce) non è quindi possibile allocare il vettore T. Una tabella di hash è una struttura dati con un’occupazione di spazio O(|K|) e tempi di accesso O(1), nel caso medio. A.A. 2004/2005 APA-hash

Funzione di hash La tabella di hash contiene m elementi (m<<|U|) Viene definita una funzione che trasforma una chiave k in una posizione del vettore h(k) h: U  { 0, 1, ..., m-1 } L’elemento x viene memorizzato nella locazione T[h(key[x])] A.A. 2004/2005 APA-hash

Funzione di hash T 1 U 2 h(k1) 3 h(k4) 4 k3 k4 h(k2)=h(k5) 5 k2 6 k1 U 1 2 h(k1) 3 h(k4) k3 4 k4 5 h(k2)=h(k5) k2 6 k1 k5 7 8 h(k3) m-1 A.A. 2004/2005 APA-hash

Collisione Ogniqualvolta h(ki)=h(kj) quando ki  kj, si verifica una collisione Occorre: Minimizzare il numero di collisioni (ottimizzando la funzione di hash) Gestire le collisioni residue, quando avvengono (permettendo a più elementi di risiedere nella stessa locazione) A.A. 2004/2005 APA-hash

Esempio Si consideri un dizionario in cui la chiave corrisponde ad una stringa di caratteri. Una possibile funzione di hash è data da h(k) = S(ci) mod m dove ci è il codice ASCII dell’i-esimo carattere della stringa k m è il numero di elementi del vettore T. A.A. 2004/2005 APA-hash

Esempio (II) Le stringhe “paperino” e “paperoga” corrispondono allo stesso elemento del vettorecollisione Si supponga che m = 15. Allora h(“pippo”) = (112+105+112+112+111)mod 15= 552 mod 15 = 12 h(“pluto”) = (112+108+117+116+111)mod 15= 564 mod 15 = 9 h(“paperino”) = (112+97+112+101+114+105+110+111)mod 15= 862 mod 15 = 7 h(“topolino”) = (116+111+112+111+108+105+110+111)mod 15= 884 mod 15 = 14 h(“paperoga”) = (112+97+112+101+114+111+103+97)mod 15= 847 mod 15 = 7 A.A. 2004/2005 APA-hash

Ridurre le collisioni Le funzioni di hash migliori sono quelle che distribuiscono il più uniformemente possibile i |K| elementi tra gli m indirizzi a disposizione. La funzione h(k) deve sembrare il più “casuale” possibile. Solitamente si effettuano manipolazioni sui bit della chiave k, unitamente ad una scelta di un numero primo per il valore di m. A.A. 2004/2005 APA-hash

Gestire le collisioni residue Solitamente si utilizzano due tecniche: Chaining Open Addressing A.A. 2004/2005 APA-hash

Chaining (I) La soluzione più semplice per gestire le collisioni è permettere a più elementi di risiedere nella stessa locazione della tabella T. Ogni locazione di T è quindi un insieme di elementi, e può essere implementata sotto forma di lista concatenata. Tale tecnica viene detta chaining. A.A. 2004/2005 APA-hash

Chaining (II) T U 1 2 k1 k6 3 k6 k4 k3 4 k4 5 k2 k5 k2 6 k1 k5 7 8 k3 U 1 2 k1 k6 3 k6 k4 k3 4 k4 5 k2 k5 k2 6 k1 k5 7 8 k3 m-1 A.A. 2004/2005 APA-hash

Pseudo-codice T[i] sono puntatori a liste, inizializzati a NIL. CHAINED-HASH-INSERT(T,x) inserisci x alla testa della lista T[h(key[x])] CHAINED-HASH-SEARCH(T,k) cerca l’elemento con chiave k nella lista T[h(k)] CHAINED-HASH-DELETE(T,x) cancella x dalla lista T[h(key[x])] A.A. 2004/2005 APA-hash

Complessità Ipotesi: liste non ordinate Inserimento: O(1) Ricerca: O(lunghezza delle liste) Cancellazione: O(1) se ho il puntatore ad x e la lista è doppiamente linkata Uguale alla ricerca se ho il valore di x, oppure il valore della chiave k, oppure la lista è semplicemente linkata A.A. 2004/2005 APA-hash

Complessità delle ricerche (I) Detti: n il numero di elementi memorizzati m la dimensione della tabella di hash Si definisce: =n/m: fattore di carico della tabella di hash T Normalmente >1 Che cosa succede quando m,n (a parità di ) ? A.A. 2004/2005 APA-hash

Complessità delle ricerche (II) Nel caso peggiore la ricerca richiede (n), più il tempo per calcolare h(k): la tabella di hash degenera in una lista semplice non ordinata Il caso migliore dipende da quanto uniformemente h(k) distribuisce gli elementi. Assumiamo per ora che h(k) abbia eguale probabilità di generare gli m valori di uscita (hashing semplice uniforme). A.A. 2004/2005 APA-hash

Hashing semplice uniforme Assumiamo di saper calcolare h(k) in O(1). La complessità per la ricerca dipende linearmente dalla lunghezza della lista T[h(k)]. Occorre valutare separatamente il caso di elemento trovato ed elemento non trovato. Si può dimostrare che in entrambi i casi la complessità è (1+). A.A. 2004/2005 APA-hash

Conclusione Se: il numero m di “slot” cresce proporzionalmente ad n ( costante) h(k) distribuisce uniformemente gli elementi allora: la funzione di ricerca in una tabella di hash con chaining è (1+)=O(1). A.A. 2004/2005 APA-hash

Progettare le funzioni di hash La scelta della funzione di hashing è cruciale per l’efficienza dell’intera struttura dati. Si assume che le funzioni migliori siano quelle che realizzano un hashing uniforme: se i valori delle chiavi k sono equiprobabili, allora tutti i valori della funzione h(k) devono essere anch’essi equiprobabili. A.A. 2004/2005 APA-hash

Criteri generali Poiché le chiavi k solitamente non sono equiprobabili, anzi spesso sono molto correlate (si pensi ai nomi di variabili), occorre: Usare tutti i bit della chiave “Amplificare” le differenze Si può sempre pensare che le chiavi siano rappresentate come numeri interi (illimitati) Es: “abc” può essere interpretata come ‘a’*2562 + ‘b’*256 + ‘c’ A.A. 2004/2005 APA-hash

Chiavi come numeri Nel seguito si assume che k siano numeri interi, o siano ricondotti a numeri interi. Nella pratica, lavorando con stringhe di una certa lunghezza non è pratico convertire in numeri interi, per cui si adotteranno delle varianti dei metodi esposti. A.A. 2004/2005 APA-hash

Hashing per divisione Interpretando k come un numero intero, si definisce: h(k) = k mod m Dato un numero previsto di elementi n, per garantire la complessità prevista occorre scegliere mn/. A.A. 2004/2005 APA-hash

Scelta di m Conviene evitare che m sia una potenza di 2 (usa solo gli ultimi m bit di k) una potenza di 10 (se k sono numeri decimali) 2p-1 (se si trattano stringhe, in quanto trasposizioni di caratteri generano collisioni) ... Solitamente si sceglie per m un valore: corrispondente ad un numero primo non troppo vicino ad una potenza di 2. A.A. 2004/2005 APA-hash

Esempio Sia n = 2000 il numero di elementi previsti Vogliamo un numero di confronti medio pari a 3 nelle ricerche m = 701 è un numero primo vicino a 2000/3 ma distante dalle potenze di 2 h(k) = k mod 701 A.A. 2004/2005 APA-hash

Hashing per moltiplicazione Interpretando k come un numero intero, si definisce: Una costante 0<A<1 Frac(x) = x  x h(k) =  m  frac(k  A)  La moltiplicazione kA “rimescola” i bit di k, la moltiplicazione per m espande l’intervallo [0,1] nell’intervallo [0,m]. A.A. 2004/2005 APA-hash

Scelta di m e A Il valore di m non è affatto critico. Solitamente si sceglie una potenza di 2, in modo che moltiplicazione e parte intera si riducano ad estrarre una sotto-sequenza di bit La scelta ottima di A dipende dalle caratteristiche statistiche delle chiavi A = (5 – 1) / 2 = 0.6180339887... è una “buona” scelta. A.A. 2004/2005 APA-hash

Hashing universale Tutte le funzioni di hashing sono suscettibili di comportamenti “degeneri” nel caso di scelta “cattiva” delle chiavi. Si può pensare di “randomizzare” la scelta della funzione h(k), per “proteggerla” contro i casi peggiori. Ad ogni esecuzione del programma, si sceglie a caso una funzione di hash tra un insieme di funzioni predefinite. La probabilità di comportamenti corrispondenti al caso peggiore viene così notevolmente ridotta. A.A. 2004/2005 APA-hash

Considerazioni pratiche Quasi sempre le chiavi sono stringhe (trattarle come numeri interi è complesso) Gli operatori bit-a-bit del C sono molto efficienti Gli shift << e >> possono spostare parti della chiave per rompere schemi ripetuti L’or esclusivo (^) permette di combinare sottosequenze di bit senza il mascheramento di and (&) e or (|) Si può sfruttare il parallelismo delle parole della CPU (16, 32 bit). A.A. 2004/2005 APA-hash

HashPJW #define PRIME 211 int hashpjw(char *s) { char *p ; unsigned int h=0, g; for ( p=s; *p != '\0'; p++ ) { h = ( h << 4 ) + (*p) ; if ( g = h & 0xf0000000) { h = h ^ ( g >> 24 ) ; h = h ^ g ; } return h % PRIME ; A.A. 2004/2005 APA-hash

Analisi sperimentale È stata condotta un’analisi sulle prestazioni di diverse funzioni di hash su diverse tipologie di dati di ingresso. Per ciascuna è stato misurato il rapporto tra il numero di confronti misurato ed il caso atteso per una funzione di hash totalmente uniforme. La tabella di hash conteneva 211 elementi (numero primo). A.A. 2004/2005 APA-hash

Input utilizzati 1: i 50 identificatori e parole chiave più frequenti in un campione di programmi C 2: i 100 identificatori e parole chiave più frequenti in un campione di programmi C 3: i 500 identificatori e parole chiave più frequenti in un campione di programmi C 4: 952 nomi ‘extern’ nel kernel di Unix 5: 627 identificatori in un programma C generato dal compilatore C++ 6: 915 stringhe generate casualmente 7: 614 parole tratte da un testo di informatica 8: 1201 parole inglesi, con “xxx” aggiunto come prefisso e suffisso 9: i 300 nomi: “v100”, “v101”, …, “v399” A.A. 2004/2005 APA-hash

Funzioni di hash hashpjw , con =65599, 16, 5, 2, 1 h(k) =  k[i]  i middle: considera i 4 caratteri centrali ends: considera i primi 3 e gli ultimi 3 caratteri quad: raggruppa i caratteri 4 a 4 e somma gli interi corrispondenti A.A. 2004/2005 APA-hash

Quantità misurate Il numero di confronti attesi per una lista di lunghezza bj è bj(bj+1)/2. Il numero totale è ottenuto sommando il contributo delle m liste: j=0..m-1 bj(bj+1)/2 Il caso migliore è dato da (n/2m)(n+2m–1) Viene calcolato il rapporto j=0..m-1 bj(bj+1)/2  (n/2m)(n+2m–1) A.A. 2004/2005 APA-hash

Risultati A.A. 2004/2005 APA-hash

Open Addressing La tecnica nota come Open Addressing è un’alternativa al Chaining per gestire le collisioni. Ogni cella di T può contenere un solo elemento, e non è necessario gestire le liste di collisione. In caso di collisione si ricerca un’altra cella non ancora occupata. Funziona solo con <1. A.A. 2004/2005 APA-hash

Definizione formale La funzione di hash deve generare una permutazione delle celle, che verrà interpretata come un ordine di ricerca della cella libera. h : U  { 0,1,...,m-1 }  { 0,1,...,m-1 } h(k,i) al variare di i deve essere una permutazione degli elementi { 0,1,...,m-1 } Si tenta prima h(k,0), poi h(k,1), e infine h(m-1). A.A. 2004/2005 APA-hash

Hash-Insert HASH-INSERT(T, k) 1 i  0 2 repeat j  h(k, i) 3 if T[j] = NIL 4 then T[j]  k 5 return 6 else i  i + 1 7 until i = m 8 error “hash table overflow” A.A. 2004/2005 APA-hash

Hash-Search 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 or i = m 7 return NIL A.A. 2004/2005 APA-hash

Funzioni di hash Linear probing Quadratic probing Double hashing h(k, i) = (h’(k)+i) mod m Quadratic probing h(k, i) = (h’(k)+ c1i + c2i2) mod m Double hashing h(k, i) = (h1(k)+ i h2(k) ) mod m A.A. 2004/2005 APA-hash

Esempio Si supponga di avere m = 10 open addressing con linear probing. Assumiamo che la sequenza di operazioni di inserimento produca la seguente sequenza di valori ritornati dalla funzione di hash: h(A)=5, h(B)=4, h(C)=9, h(D)=4, h(E)=8, h(F)=8, h(G)=10 A.A. 2004/2005 APA-hash

Esempio (II) A 5 B A 4 B A C 9 B A D C 4 B A D E C 8 B A D E C F 8 G B 10 A.A. 2004/2005 APA-hash

Esempio (III) Assumiamo ora di eseguire la ricerca dei seguenti elementi: D: (h(D)=4) Accedo a 4 Accedo a 5 Accedo a 6  trovato G: (h(G)=10) Accedo a 10 Accedo a 1  trovato M: (h(M)=4) Accedo a 6 Accedo a 7  non trovato A.A. 2004/2005 APA-hash

Cancellazione La cancellazione è un’operazione complessa, in quanto “rompe” le catene di collisione. L’open addressing è in pratica utilizzato solo nei casi in cui non si deve mai cancellare. A.A. 2004/2005 APA-hash

Complessità Nel caso di hashing uniforme e di probing uniforme, si può dimostrare che: Il numero atteso di tentativi di “probing” è 1/(1–), ed è uguale alla complessità dell’operazione di inserimento La complessità dell’operazione di ricerca è invece A.A. 2004/2005 APA-hash