TABELLE AD INDIRIZZAMENTO DIRETTO

Documenti analoghi
Dizionario. Marina Zanella Algoritmi e strutture dati Tabelle hash 1

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

Massimo Benerecetti Tabelle Hash: gestione delle collisioni

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

Indirizzamento Aperto

Strutture di accesso ai dati: B + -tree

Alberi binari di ricerca

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

I B+ Alberi. Sommario

Codifica dell Informazione

Strutture Dinamiche. Fondamenti di Informatica

Allocazione Dinamica della Memoria

Definizione di metodi in Java

Il file system. Le caratteristiche di file, direttorio e partizione sono del tutto indipendenti dalla natura e dal tipo di dispositivo utilizzato.

Architettura degli elaboratori Docente:

Linguaggio Macchina. Linguaggio Macchina. Linguaggio Macchina. Linguaggio Macchina ADD A,B ISTRUZIONE SUCCESSIVA

Esercitazione 3. Espressioni booleane I comandi if-else e while

ADT Coda con priorità

Heap e code di priorità

Codifica dell Informazione

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

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

Procedura operativa per la gestione della funzione di formazione classi prime

Esame Informatica Generale 13/04/2016 Tema A

Lezione 4. Sommario. L artimetica binaria: I numeri relativi e frazionari. I numeri relativi I numeri frazionari

Fondamenti VBA. Che cos è VBA

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

FONDAMENTI DI INFORMATICA Lezione n. 11

Laboratorio di Architettura degli Elaboratori

Modulo 1. Concetti base della Tecnologia dell informazione. Prof. Nicolello Cristiano. Modulo 1

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

La codifica. dell informazione

UNIVERSITA DEGLI STUDI DI PERUGIA

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Come utilizzare i riferimenti assoluti e relativi in Microsoft Excel

Sistemi operativi e distribuiti

Algoritmi. Pagina 1 di 5

Individuazione di sottoproblemi

Problema: calcolare il massimo tra K numeri

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Codifica dei Numeri. Informatica ICA (LC) 12 Novembre 2015 Giacomo Boracchi

Linguaggio C: introduzione

Esempio : i numeri di Fibonacci

EXCEL: FORMATTAZIONE E FORMULE

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

In molte applicazioni sorge il problema di sapere in quanti modi possibili si può presentare un certo fenomeno.

Informatica Teorica. Macchine a registri

DESCRIZIONE CREAZIONE APP Si suddivide in 4 fasi di lavoro: 1. PIANIFICAZIONE; 2. PROGETTAZIONE; 3. SVILUPPO; 4. DISTRIBUZIONE.

Codice binario. Codice. Codifica - numeri naturali. Codifica - numeri naturali. Alfabeto binario: costituito da due simboli

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

La Rappresentazione dell Informazione

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Cercare il percorso minimo Ant Colony Optimization

CONCETTI E ARCHITETTURA DI UN SISTEMA DI BASI DI DATI

INDICE. Vista Libretto Livello Digitale 2. Importazione di dati da strumento 3. Inserisci File Vari 5. Compensazione Quote 5.

Algoritmi e Strutture Dati. HeapSort

argomenti Hashing Richiamo sul concetto di dizionario Tabelle hash ! Hashing ! Funzioni hash per file ! Insieme di coppie del tipo <elemento, chiave>

Linguaggi e Grammatiche Liberi da Contesto

PON Liceo Scientifico Leonardo da Vinci. Vallo della Lucania

p k q n k = p n (k) = n 12 = 1 = ,1208. q = 1 2 e si ha: p 12 (8) =

Autodesk Map parte I digitalizzazione e importazione dati

I database. Introduzione alla teoria delle basi di dati

S 2 S 1 S 3 S 4 B S 5. Figura 1: Cammini diversi per collegare i due punti A e B

INTRODUZIONE ALLE BASI DATI RELAZIONALI

La rappresentazione delle informazioni

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Tecniche di compressione senza perdita

Informatica 3. LEZIONE 21: Ricerca su liste e tecniche di hashing. Modulo 1: Algoritmi sequenziali e basati su liste Modulo 2: Hashing

UD4 - MATLAB. M-file. Efficienza degli algoritmi. Formati d uscita

PROGRAMMAZIONE STRUTTURATA

Sistemi Operativi Esercizi Gestione Memoria

4 GLI ARRAY E LE STRINGHE

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Lezioni di Ricerca Operativa 2 Dott. F. Carrabs

Bit, Byte, Word e Codifica Dati

Architettura dei computer

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Il Metodo Cinematico lineare, comunemente anche detto Metodo della Corrivazione, si basa su alcune considerazioni:

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Gestione di files Motivazioni

Metodi Computazionali. Generazione di numeri pseudocasuali

Rappresentazioni numeriche

Esercitazione su Bilancio Familiare

Università degli Studi di Udine. DLGS 196/03 Gestione delle credenziali di autenticazione informatica

(1) (2) (3) (4) 11 nessuno/a (1) (2) (3) (4) X è il minore tra A e B nessuno/a X è sempre uguale ad A X è il maggiore tra A e B

NUVOLA COMUNICAZIONI

Numeri frazionari. sistema posizionale. due modi: virgola fissa virgola mobile. posizionale, decimale

LA MEMORIA NEL CALCOLATORE

Algoritmi e Linguaggi

Transcript:

Tabelle Servono per implementare dizioniari in modo efficiente. dizionari insiemi di coppie (chiave, valore). Esempio: in un compilatore di un linguaggio di programmazione viene creata una tabella dei simboli, in cui le chiavi sono tutti gli identificatori del linguaggio e i valori sono i valori associati a ciascun identificatore. efficiente le operazioni di Insert, Search, Delete possono essere realizzate, nel caso medio, in tempo O(1). VI-1

TABELLE AD INDIRIZZAMENTO DIRETTO Sia: U universo delle possibili chiavi, U = {0, 1,...,m 1}, T[0, 1,..., m 1] una tabella ad indirizzamento diretto (array), K insieme delle chiavi effettive K U. L insieme dinamico tramite una tabella T: T 0 0 K 1 U 4 2 3 5 8 1 7 2 2 6 3 4 3 5 5 6 7 8 8 Se l insieme non contiene la chiave k T[k]= Nil. 9 VI-2

OPERAZIONI DI BASE k è una chiave, x è un puntatore Direct-Address-Search(T, k) restituisce la componente di T di indice k: T[k] Direct-Address-Insert(T, x) inserisce l elemento x nella componente key[x] dell array T: T[key[x]] x Direct-Address-Delete(T, x) elimina l elemento in posizione key[x] sostituendo Nil: T[key[x]] Nil Problemi nella rappresentazione Se l universo U è troppo grande la dimensione dell array è improponbile. Esempio: Consideriamo una tavola per la memorizzazione dei dati relativi agli studenti di una Facoltà. Supponiamo che gli studenti siano al massimo 3000 e che la chiave sia il cognome degli studenti (non più di 15 caratteri). Il numero delle chiavi possibili sarebbe 26 15 quindi sarebbe necessario un array di 1.67725934228573e + 21 2 70 componenti. 1 byte per componente 2 70 byte: 1Kb = 2 10, 1Mb = 2 20, 1Gb= 2 30, 1Tb= 2 40,... VI-3

TABELLE HASH Una funzione hash definisce una corrispondenza tra l universo U delle chiavi e gli indici della tabella hash T[0...m 1]: h : U {0, 1,...,m 1} L elemento k U si trova nella posizione h(k) nella tabella T. A quale funzione corrisponde h nel caso delle tabelle ad indirizzamento diretto? Caratteristiche della funzione h Ridurre l intervallo degli indici che devono essere gestiti: invece di U indici si vogliono avere m << U indici. VI-4

Problema della collisione Più chiavi possono corrispondere alla stessa posizione nell array. T 0 U Universo delle chiavi 1 2 h(k1) K chiavi effettive k3 k1 k4 k2 k5 3 4 5 h(k4) h(k2)=h(k5) 6 7 8 h(k8)... m 1 h deve essere scelta in modo che le chiavi vengano distiribuite in modo uniforme sugli m indici a disposizione. h deve essere deterministica. VI-5

RISOLUZIONE DELLE COLLISIONI PER CONCATENAZIONE L array T è un array di puntatori; T[j] è un puntatore alla testa della lista che contiene tutti gli elementi con chiave k tale che h(k) = j T U universo delle chiavi k1 k4 k1 chiavi effettive k4 k2 k6 k7 k8 k5 k3 k5 k7 k2 k3 k8 k6 VI-6

OPERAZIONI DI BASE k è una chiave, x è un puntatore Chained-Hash-Search(T, k) cerca un elemento con chiave k nella lista T[h(k)] (riporta un puntatore); Chained-Hash-Insert(T, x) inserisce l elemento x in testa alla lista T[h(key[x])] dell array T; Chained-Hash-Delete(T, x) cancella x dalla lista T[h(key[x])]. COMPLESSITÀ DELLE OPERAZIONI DI BASE Chained-Hash-Search(T, k) è proporzionale alla lunghezza della lista; Chained-Hash-Insert(T, x) è O(1) nel caso peggiore; Chained-Hash-Delete(T, x) è O(1) se le liste sono doppiamente collegate. VI-7

ANALISI DI COMPLESSITÀ dell organizzazione hash con collisioni Bisogna considerare su quale insieme di indici la funzione hash distribuisce le chiavi e in quale modo (ipotesi: uniformità semplice della funzione hash). Si definisce fattore di carico il rapporto tra il numero n di elementi memorizzati e il numero m di posizioni disponibili. α = n m α = numero medio di elementi memorizzati in ogni lista concatenata α < 1 molte posizioni disponibili rispetto agli elementi memorizzati; α = 1 il numero di elementi corrisponde al numero delle componenti dell array; α > 1 situazione attesa: molti elementi da memorizzare rispetto al numero delle posizioni disponibili. VI-8

Analisi del caso peggiore Tutte le n chiavi corrispondono alla stessa posizione: k U, h(k) = c La complessità coincide con quella della lista concatenata Θ(n), più il tempo per il calcolo della funzione h.... ma una funzione hash h(k) = c non si definisce mai... VI-9

Analisi del caso medio Ipotesi: uniformità semplice della funzione hash: h(k) distribuisce le chiavi in modo equiprobabile nell array h(k) è calcolata in un tempo O(1). In una tabella hash in cui le collisioni sono risolte per concatenazione e nell ipotesi di uniformità semplice della funzione hash, sia una ricerca senza successo che una ricerca con successo richiedono in media Θ(1 + α).... infatti nell ipotesi di uniformità semplice la lunghezza media di una lista coincide con il fattore di carico α Fissato un universo di chiavi U e una relativa tabella hash, se il numero di posizioni è proporzionale al numero di elementi nella tabella (n = O(m)), si ha α = n/m = O(n/m) = O(1) La ricerca richiede in media tempo costante. VI-10

FUNZIONI HASH Come definire buone funzioni hash Ogni chiave corrisponde ad una delle m posizioni in modo equamente probabile P(k): probabilità che sia estratta una chiave k tale che h(k) = j. k:h(k)=j P(k) = 1 m per j = 0, 1,...m 1.... perché ogni chiave ha la stessa probabilità di finire in posizione j Una buona funzione hash è tale quando, applicata ad una chiave, genera dei numeri pseudocasuali uniformemente distribuiti nell intervallo 1,..., m. Esempio Se le chiavi sono numeri reali pseudocasuali nell intervallo (0, 1) la funzione hash h(k) = km è una buona funzione hash: per m = 1000, h(0.5217) = 521, h(0.1428) = 142, h(0.1121) = 112, h(0.1131) = 113,... VI-11

Qualità di una Buona Funzione Hash Una buona funzione hash è tale quando per chiavi simili vengono generati indici diversi Esempio Supponiamo di dover creare la tavola dei simboli corrispondenti agli identificatori (solo car. alfabetici) presenti in un programma. Sia l la max. lunghezza che può avere l identificatore: possono essere generati 26 l identificatori. È usuale che in un programma ci siano identificatori simili (e.g. pt, pts, app, app1, app2): una buona funzione hash deve generare indici differenti per questi nomi. Il valore riportato da una buona funzione hash deve essere indipendente dalla configurazione delle chiavi. VI-12

Metodi per generare buone funzioni hash (I) Metodo di divisione h(k) = k mod m DA EVITARE: m potenza di 2 quando le chiavi sono numeri binari m potenza di 10 quando le chiavi sono numeri decimali Esempio: sia m = 100. Per k = 187622, 93822, 22, 3422, h(k) = 22 DA AUSPICARE: m numero primo lontano da potenze di 2 o di 10. Esempio: sia m = 127. h(187622) = 43, h(93822) = 96, h(22) = 22, h(3422) = 120 VI-13

Metodi per generare buone funzioni hash (II) Metodo di moltiplicazione h(k) = m(ka ka ) (parte frazionaria), A (0, 1), costante: un buon valore per A è A = 5 1 = 0.6180... (Knuth) 2 di solito m = 2 p Hashing universale Si definisce un insieme di funzioni hash e a run-time se ne sceglie una. L algoritmo si comporta diversamente per ogni esecuzione. Se c è una cattiva prestazione, non si verifica sempre (cfr. quick sort). Sia H un insieme di funzioni da U {0, 1,...,m 1}. H è universale se (x, y) U il numero di funzioni hash h H: h(x) = h(y) è H /m. La probabilità di una collisione tra x e y è 1/m per x y. Sotto questa ipotesi si dimostra che: Se una tabella hash ha più posizioni di quante siano le chiavi (n m) e se la funzione fa parte di un insieme universale allora non ci sono collisioni tra le chiavi. VI-14

TABELLE HASH CON INDIRIZZAMENTO APERTO La rappresentazione non fa uso di puntatori. Il fattore di carico α non può mai superare 1. Tutto il nodo è contenuto nel array T. Invece delle liste le collisioni vengono gestite memorizzando gli elementi in altri punti della hash stessa. Invece di seguire le collisioni si calcola la sequenza di posizioni da esaminare. Si utilizza meno memoria rispetto alla rappresentazione con le liste concatenate perché non ci sono puntatori. Esempio Per memorizzare 1000 elementi in un array di 500 componenti (α = 2 servono 500 celle di memoria per le componenti dell array + 1000 record per gli elementi. Ogni record è composto almeno da due celle: 1 pt alla chiave e 1 pt al record successivo. Quindi servono 2000 celle per gli elementi da memorizzare. complessivamente servono 2500 celle... che possono essere utilizzate per un array con 2500 celle adiacenti che puntano direttamente alle chiavi VI-15

Tabelle Hash con Indirizzamento Aperto - Inserzione La sequenza di posizioni esaminate dipende dalla chiave che deve essere inserita: h : U {0, 1,...,m 1} {0, 1,...,m 1} Hash-Insert(T, k) Ipotesi: non ci sono dati satellite, la tabella ha solo la chiave k. Hash-Insert(T,k) 1. i <- 0 2. repeat j <- h(k,i) ;; i=0,1,...,m-1 3. if T[j] = Nil 4. then T[j] <- k 5. return j 6. else i <- i+1 7. until i=m 8. error overflow sulla tabella hash VI-16

Tabelle Hash con Indirizzamento Aperto - Ricerca Hash-Search(t,k) La sequenza di posizioni esaminata quando la chiave è stata inserita è esattamente la stessa sequenza esaminata quando la chiave viene ricercata. Il fallimento della ricerca avviene quando una posizione viene individuata vuota. Infatti se la chiave ci fosse stata (essendo la posizione vuota, sarebbe stata inserita proprio in quella posizione). 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. return Nil VI-17

Tabelle Hash con Indirizzamento Aperto - Cancellazione Quando si cancella una chiave la componente si deve marcare con Deleted e non con Nil, altrimenti si può interrompere erroneamente la scansione nella ricerca. Si dovrebbe anche modificare l inserzione per riutilizzare questa componente. Le tabelle hash con indirizzamento aperto, di solito, si usano quando non sono previste cancellazioni. VI-18

Tecniche di scansione Scansione lineare: h(k, i) = (h (k) + i) mod m per i = 0, 1,...,m 1. Prima si scandiscono tutte le posizioni generate da T[(h (k)], T[(h (k) + 1], fino a T[m 1], poi si riparte da T[0] finché non si raggiunge T[h (k) 1]. Scansione quadratica: h(k, i) = (h (k)+c 1 i+c 2 i 2 ) mod m dove c 1, c 2 0, i = 0, 1,...,m 1. Hashing doppio: h(k, i) = (h 1 (k) + ih 2 (k)) mod m dove h 1 e h 2 sono due funzioni hash. Il fatto che la posizione della chiave e la distanza dalla chiave successiva varino secondo due distinte funzioni, rende il comportamento di queste funzioni, vicino allo schema ideale della funzione hash uniforme. Analisi Nel caso dell indirizzamento aperto il fattore di carico è α 1. Nell ipotesi di una funzione hash uniforme ogni possibile permutazione delle sequenze di scansione, per ogni chiave k, è equiprobabile per un inserzione o una ricerca. Nell ipotesi precedente si dimostra che se la tabella ha un fattore di carico α < 1 allora il numero medio di accessi di una ricerca senza successo è al più 1/(1 α). e che se la tabella ha un fattore di carico α < 1 il numero medio di accessi di una ricerca con successo è 1 α ln 1 1 α VI-19

Esercizi VI-1 Si consideri l inserzione delle chiavi 10, 22, 31, 4, 15, 28, 17, 88, 59 in una tabela hash di lunghezza m = 11 usando l indirizzamento aperto con funzione hash h (k) = k mod m. Si illustri il risultato dell inserimento di queste chiavi usando la scansione lineare, usando la scansione quadratica con c 1 = 1 e c 2 = 3 e usando l hashing doppio con h 2 (k) = 1 + (k mod (m 1)). VI-2 Scrivere in pseudocodice la procedura Hash-Delete, Hash-insert e Hash-Search perché prevedano il valore speciale deleted. Esercizio d esame del 21 aprile 2004 - rosa Nel caso della gestione delle tabelle hash con concatenazione, si illustri l inserimento in una tabella hash di m = 10 componenti, le chiavi 32, 17, 19, 31, 33, 15, 38, 46, utilizzando la seguente funzione: h(k) = k mod m La bontà di una funzione hash dipende dallo specifico insieme di chiavi oppure è indipendente da esso? Dire se la funzione dell esercizio in questione è o meno una buona funzone hash, giustificando la risposta. Esercizio d esame del 21 aprile 2004 - giallo Relativamente alla gestione delle tabelle hash con indirizzamento aperto, si illustri l inserimento in una tabella hash di m = 7 componenti, le chiavi 34, 12, 15, 26, 2, 32, 40, utilizzando l hashing doppio con le seguenti funzioni: h (k) = k mod 7 = h 1 (k), h 2 (k) = 1 + (k mod 6) Si ricorda che h(k, i) = (h 1 (k) + i h 2 (k)) mod m. Quando si verifica la coincidenza tra l hashing doppio e la scansione lineare? VI-20