Hash Table. Hash Table

Documenti analoghi
Laboratorio di Programmazione

Linguaggio C. Esercizio 1

I puntatori e l allocazione dinamica di memoria

Programmazione I - Laboratorio

Esercitazione 11. Liste semplici

Consideriamo un vettore allocato dinamicamente

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Strutture Dinamiche. Fondamenti di Informatica

PILE E CODE. Pile (stack):

Fondamenti di Informatica 2

Lezione 12 Tabelle Hash

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

La struttura dati CODA

Esercizi. Stringhe. Stringhe Ricerca binaria

Informatica 1. Prova di recupero 21 Settembre 2001

Inserimento in una lista ordinata

Laboratorio di Informatica

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Il linguaggio C. Puntatori e dintorni

Strutture dati dinamiche in C (II)

Liste a puntatori: un esercizio passo passo

Uso avanzato dei puntatori Allocazione dinamica della memoria

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Esercizi Strutture dati di tipo astratto

La Struttura Dati Lista

Compito di Fondamenti di Informatica

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Esercizio 1: funzione con valore di ritorno di tipo puntatore

L'Allocazione Dinamica della Memoria nel linguaggio C

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Rappresentazione di liste mediante puntatori in linguaggio C

Gestione dinamica della memoria

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

Esercitazione 12. Esercizi di Ricapitolazione

Lezione 9: Strutture e allocazione dinamica della memoria

Alberi ed Alberi Binari

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Appello di Informatica B

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Gestione dei file. File di testo e binari

Strutture dati dinamiche

Esercizio 1: Puntatori impiegati che sono manager

Strutture Dati Dinamiche

Implementazione di Liste puntate

5. Quinta esercitazione autoguidata: liste semplici

1 (4) 2 (4) 3 (12) 4 (6) 5 (6)

PROGRAMMI LINGUAGGIO C

Alberi binari e alberi binari di ricerca

Per semplicità eliminiamo le ripetizioni nell'albero.

C: panoramica. Violetta Lonati

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

La gestione della memoria

Sistemi Operativi (M. Cesati)

Lezione 8 Struct e qsort

Transcript:

Hash Table La ricerca di un elemento su una lista (semplice o doppia) presenta una complessità di tipo O(n), dato che occorre scandire (al più) l intera lista per poter trovare l elemento desiderato. Le hash table offrono invece prestazioni più elevate. Esse sono usate per l implementazione dei dizionari. Dizionario: ogni elemento è caratterizzato da un campo chiave univoco; ricerca e cancellazione avvengono per chiave. Una hash table è un insieme di m liste semplicemente collegate. Dato un elemento e con chiave k, la funzione di hash: h(k) lista stabilisce in quale lista cercare/inserire l elemento. La complessità è dunque O(n/m) Hash Table Le rappresentiamo così: Array di puntatori (testa delle liste) 8 5 Hash table i cui elementi sono interi,, 5, 8,, h(e) = e mod 4 = e % 4 = Indice dell array di puntatori

Hash Table Array di puntatori (testa delle liste) 8 5 bucket,, 5, 8,, typedef struct t_hash_element int data; t_hash_element; int hash_function (int data) return data % N; typedef struct t_hash_element int data; t_hash_element; int hash_function (int data) return data % N; Hash Table: Ricerca 8 5 int find_element (t_hash_table table, int value_to_search) t_list_element * head = table [hash_function (value_to_search)]; while (head!= NULL) if (head->data == value_to_search) return ; head = head->next; return ; 4

Hash Table: Inizializzazione & Inserimento void init_table (t_hash_table table) int i; for (i = ;i < N;i++) table [i] = NULL; 8 5 void add_element (t_hash_table table, int value_to_add) t_hash_element * newelem; int bucket; if (find_element (table, value_to_add) == ) return ; // se l elemento esiste gia non lo inserisco // alloco l elemento newelem = (t_hash_element *)malloc (sizeof (t_hash_element)); if (newelem == NULL) return; newelem->data = value_to_add; bucket = hash_function (value_to_add); // determino il bucket // inserisco in testa newelem->next = table [bucket]; table [bucket] = newelem; 5 Hash Table: Visita void dump_table (t_hash_table table) int i; t_hash_element * head; for (i = ;i < N;i++) 8 5 printf ("Bucket %d:", i); head = table [i]; while (head!= NULL) printf ("%d,", head->data); head = head->next; printf ("\n"); 6

Hash Table: Cancellazione elemento void remove_element (t_hash_table table, int value_to_remove) // determinazione del bucket // ricerca dell elemento nella lista del bucket selezionato // eliminazione dell elemento (stessa modalita della cancellazione // da lista semplicemente collegata) typedef struct t_hash_element int data; t_hash_element; 8 5 int hash_function (int data) return data % N; 7 Hash Table: Cancellazione elemento void remove_element (t_hash_table table, int value_to_remove) int bucket; t_hash_element * aux, * prev; bucket = hash_function (value_to_remove); aux = table [bucket]; prev = NULL; while ((aux!= NULL) && (aux->data!= value_to_remove)) prev = aux; aux = aux->next; if (aux == NULL) return; if (prev == NULL) // eliminazione dalla testa table [bucket] = aux->next; else prev->next = aux->next; free (aux); 8 5 8 4

int main(int argc,char *argv[]) t_hash_table mytable; init_table (mytable); add_element (mytable, ); add_element (mytable, ); add_element (mytable, 8); add_element (mytable, 5); add_element (mytable, ); remove_element (mytable, ); Hash Table: Utilizzo remove_element (mytable, ); remove_element (mytable, 5); 8 5 9 Hash table con elementi strutturati typedef struct int key; char value[]; t_element; typedef struct t_hash_element t_element data; t_hash_element; int hash_function (int key) return key % N; 5

typedef struct int key; char value[]; t_element; Hash Table: Ricerca int find_element (t_hash_table table, int key, t_element * result) t_list_element * head = table [hash_function (key)]; while (head!= NULL) if (head->data.key == key) *result = head->data; return ; head = head->next; return ;... t_element el_found if (find_element (mytable,, &el_found) == ) printf ( Elemento trovato %d,%s\n, el_found.key, el_found.value);... Hash Table: Inserimento typedef struct int key; char value[]; t_element; void add_element (t_hash_table table, t_element value_to_add) t_hash_element * newelem; t_element el_found; int bucket; if (find_element (table, value_to_add.key, &el_found) == ) return ; // se l elemento esiste gia non lo inserisco // alloco l elemento newelem = (t_hash_element *)malloc (sizeof (t_hash_element)); if (newelem == NULL) return; newelem->data = value_to_add; bucket = hash_function (value_to_add.key); // determino il bucket // inserisco in testa newelem->next = table [bucket]; table [bucket] = newelem; 6

typedef struct char key []; char value[]; t_element; Hash Table con chiave alfanumerica // funzione di hash basata sulla lunghezza della chiave int hash_function (char * s) return strlen (s) % N; // funzione di hash basata sulla somma dei codici ASCII int hash_function (char * s) int i, sum = ; for (i = ;i < strlen (s);i++) sum += s[i]; return sum % N; ESERCIZIO Considerare un elemento composto da nome, cognome, indirizzo, e numero di matricola. Gestire un dizionario basato su hash table, in cui la chiave di ricerca e il numero di matricola. Realizzare le funzioni di: inserimento ricerca stampa della tabella cancellazione 4 7