Dizionari. Corso di Programmazione 3 - Ingegneria dell Informazione e dell Organizzazione 5 dicembre, Gino Perna

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

Hash Table. Hash Table

Implementazione dell albero binario in linguaggio C++

Fondamenti di Informatica II

Il linguaggio C Strutture

Una breve introduzione all implementazione in C di algoritmi su grafo

Linguaggio C: PUNTATORI

Heap e code di priorità

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

L'Allocazione Dinamica della Memoria nel linguaggio C

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

La struttura dati CODA

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH

Alberi binari e alberi binari di ricerca

Il linguaggio C. Puntatori e dintorni

Informatica 1. Prova di recupero 21 Settembre 2001

Laboratorio di Informatica

Strutture Dati Dinamiche

Lezione 12 Tabelle Hash

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Laboratorio di Programmazione

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Le liste con array. Rimuovere la perla rossa costringe a spostare molte altre perle. Dove mettere la perla verde se si è esaurito il filo?

Massimo Benerecetti Tabelle Hash: gestione delle collisioni

Es. 1. interi, li stampi a video ponendo prima i numeri pari e poi i numeri dispari. Es. 1. int readlength(file *f, int *even, int *odd)

Dizionari. Hashtables.

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Il paradigma OO e le Classi

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Strutture dati. Le liste

Utilizzo e scrittura di classi

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Esercizio 1 (15 punti)

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Trasformare array paralleli in array di record

Gestione dinamica della memoria

Programmazione Procedurale in Linguaggio C++

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

Introduzione ai puntatori in C Definizione

Struct, enum, Puntatori e Array dinamici

Esercitazione 11. Liste semplici

Trasformare array paralleli in array di record

La gestione della memoria dinamica Heap

La struttura dati LISTA

Esercizi di programmazione in linguaggio C English Dictionary

Complessità algoritmi su strutture dati (riassunto)

Esercitazione n 2. Obiettivi

Esercizi su strutture dati

Complessità algoritmi su strutture dati

PROVA SCRITTA 23 MARZO 2010

Esercizio 1. Tavola ordinata in memoria centrale

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

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

Fondamenti di Informatica T-1, 2014/2015 Modulo 2. Prova d Esame 2A di Martedì 29 Gennaio 2015 tempo a disposizione 2h

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

dott. Sabrina Senatore

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lettura e scrittura di file di dati input/output

Laboratorio di Informatica

ELEMENTI DI INFORMATICA LB ESERCITAZIONE (del 09/03/2007) Files, Strutture e Liste

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Esercitazione 12. Esercizi di Ricapitolazione

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

5. Quinta esercitazione autoguidata: liste semplici

Il presente plico contiene 4 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

Corso di Informatica

Pile: implementazione. Pile: implementazione. Pile: implementazione con array. Pile: implementazione con array. Pile: implementazione con array

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Fondamenti di Informatica T-1, 2013/2014 Modulo 2. Prova d Esame 6A di Giovedì 11 Settembre 2014 tempo a disposizione 2h

Esercizio 1: funzione con valore di ritorno di tipo puntatore

ricerca di un elemento, verifica dell appartenenza di un elemento

L Allocazione Dinamica della Memoria

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

Allocazione dinamica della memoria

Lezione 8 Struct e qsort

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Sommario. Tabelle ad indirizzamento diretto e hash Funzioni Hash

Informatica A a.a. 2010/ /02/2011

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

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

Esercitazione 6. Array

Esercizio 1 Liste: calcolo perimetro di un poligono

Strutture dati dinamiche in C (II)

Alberi binari e di ricerca. Parte 1 BST e GUI. Introduzione. 1. Minimo Antenato Comune. 2. Vistita in ampiezza

Gestione degli impegni Requisiti generali Si fissi come ipotesi che la sequenza di impegni sia ordinata rispetto al tempo,, e che ogni lavoratore abbi

Puntatori a Funzioni e Callback. Massimo Benerecetti

Laboratorio Progettazione Web Le funzioni in PHP. Angelica Lo Duca IIT-CNR 2012/2013

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Esercizi su programmazione ricorsiva 1. Pericle Perazzo 23 marzo 2012

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Lezione 11 programmazione in Java. Anteprima. Gestione della memoria

1. Realizzare una funzione: int trovaritardatari(file *fprestiti, FILE *frate, Prestito *dest, int dim)

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Esercitazione 6. Alberi binari di ricerca

Transcript:

Dizionari Corso di Programmazione 3 - Ingegneria dell Informazione e dell Organizzazione 5 dicembre, 2001 Gino Perna

Uso ed utilizzo di tabelle di Hash PREFAZIONE I Dizionari sono strutture di dati che permettono di operare con funzioni di tipo: Inserimento, cancellazione e ricerca. Il tipo di dizionario maggiormente utilizzato nella pratica è la tabella di Hash; il suo funzionamento si basa sun una funzione di hash che serve a tradurre la chiave (indice) in un indirizzo. Esistono poi anche strutture tipo alberi binari ed alberi red-black. Ambedue i tipi di alberi cercano di minimizzare il numero di test durante l inserimento e le operazioni di update; il loro funzionamento è simile agli algoritmi di ricerca binaria. Infine le liste con skip possono rappresentare un semplice approccio che utilizza numeri random per costuire un dizionario. TABELLE DI HASH Le tabelle di Hash sono un semplice ed efficiente metodo per implementare un dizionario. Il tempo medio per la ricerca di un elemento è O(1), mentre il tempo peggiore è O(n). Teoria Una tabella di hash è semplicemente un array indirizzato attraverso una funzione di hash. Per esempio nella figura seguente la tabella è costituita da un array di 8 elementi, a ciascuno dei quali è associata una lista linkata di dati numerici.

Tabelle di Hash La funzione di Hash dell esempio divide semplicemente il dato numerico per 8, prendendone il resto per indicizzare la tabella. In questo modo sono sicuro di avere sempre indici compresi tra 0 e 7, e quindi che l indice nella tabella sia sempre valido. FIGURE 1. Tabella di Hash Per inserire un nuovo elemento nella tabella, una volta applicata la funzione di hash alla chiave, si procede semplicemente con una lista linkata, inserendo l elemento all inizio della lista. Esempio: per inserire il record con indice 11 dividiamo 11 per 8 ed otteniamo resto 3 (questa è la funzione di hash), perciò 11 deve andare nella lista puntata da HashTable di [3]. Per cercare un numero, si applica la funzione di hash al numero stesso, e si procede analogamente a prima, ricercando il numero nella lista linkata. La stessa cosa è possibile per cancellare un record. Tutti i record nella tabella di Hash sono allocati dinamicamente in una lista linkata associata ad un elemento della tabella di Hash. Questo metodo è chiamato concatenamento. Una alternativa sarebbe memorizzare tutti i record direttamente nel vettore, ed è chiamato indirizzamento diretto della Hash. Se la funzione di Hash è uniforme, ovvero suddivide in modo uniforme gli indici dalle chiavi di ricerca, allora si ha effettivamente una suddivisione efficiente nella ricerca. Il caso peggiore si ha quando tutti gli elementi sono nella stessa lista linkata, il caso migliore quando ciascun elemento è indicizzato in un nodo differente. E perciò importante riuscire ad utilizzare una funzione di hash efficiente. Si rimanda al testo A compact guide to Sorting and Searching T. Niemann per i dettagli su alcune funzionei di Hash (web site: epaperpress.com) disponibile in PDF. OK! Ma a cosa serve? L utilizzo pratico nei programmi è di fonsdamentale importanza. Una Hash permette infatti di avere un buon compromesso tra efficienza (ovvero velocità di esecuzione) e memoria consumata. Sebbene ai giorni d oggi si tenda a consumare molta RAM purtroppo in applicazioni dove il numero di dati coinvolto è notevole, oppure su sistemi embedded, oppure sui PDA è l unico modo efficiente per ottenere un programma USA- BILE (ovvero che mantenga una interattività elevata). Uso ed utilizzo di tabelle di Hash 1

Si prenda ad esempio il problema seguente: Aggiungere ad una lista di oggetti glio oggetti di un altra lista che non sono già contenuti nella prima. (problema tipico nell unire i risultati di due query diverse di un DB). La maniera più efficiente per risolvere il problema è utilizzare una Hash Table alla quale aggiungere tutti gli elementi della prima lista e poi tutti quelli della seconda. (Esempio alla lavagna) Hash nei vari linguaggi Le Hash sono talmente importanti che alcuni linguaggi le implementano NATIVA- MENTE. TABLE 1. Linguaggio PHP Perl JAVA C++ C Tipo Hash Nativo, Multiindice Nativo, (multiindice) Classe nella libreria standard, monoindice Classi siponibili in varie librerie PD, monoindice Funzioni in varie librerie PD, monoindice CLASSE HASH vediamo ora i passi fondamentali per costruire una classe per maneggiare una Hash. 1. Abbiamo già implementato una classe per gestire liste linkate che utilizzeremo direttamente; 2. Dallo schema della fiura 1 si nota che la tabella di Hash è un insieme di liste linkate: la nostra implementazione si baserà quindi sul costruire una classe che gestisca un vettore di liste linkate 3. Dobbiamo decidere che funzione di Hash utilizzare; 4. Dobbiamo implementare i metodi base. Prima di procedere dobbiamo aggiungere alla classe sviluppata per le liste linkate un metodo che permetta di stampare un solo elemento: questo può essere fatto prendendo direttamente il metodo print ed implementando un metodo simile con argomento il puntatore al nodo da stampare. void LISTA::print(NODE *walker){ if( walker!= NULL){ cout << "Matricola: "<<walker->matricola<<" Nome: "<<walker- >nome<<" Voto "<<walker->voto<<"\n"; 2 Uso ed utilizzo di tabelle di Hash

else { cout << "Not Found\n"; DEfinizione della classe Il file di include contenenete le definizioni delle DUE classi sarà: struct NODE { int matricola; char nome[80]; int voto; NODE * next; ; class LISTA { private: NODE *head; NODE *tail; void insnode(char * nome, int voto, int id, NODE *, NODE *); ; public: LISTA(); ~LISTA(); void insertstart(char *, int, int ); void insertend(char *, int,int ); void print(); void printtail(); void printhead(); void print(node *); void clear(); NODE * search(char *); int remove(char *); // rimuovi per nome int remove(int); //rimuovi per matricola void salvafile(char *); //salva su file void readfile(char *); // leggi da file void insertord(char * nome, int voto, int id); class HASH { private: LISTA *dict; int hashvalue(char *key); int dictsize ; public: HASH(); Uso ed utilizzo di tabelle di Hash 3

~HASH(); int get(char *key, NODE *); void insert(char *key, NODE *); void print(char *key); void printline(char *key); ; Esso è costituito dalla classe LISTA vista fino ad oggi con aggiunta la classe HASH. Implementazione L implementazione è quindi abbastanza agevole. Il costruttore dovrà allocare dinamicamente un vettore di oggetti LISTA (di lunghezza pari a dicttable, dipendente dal tipo di hash function utilizzata) Il distruttore dovrà rilasciare la memoria e distruggere gli oggetti. Funzione di hash Si scelga la seguente funzione di Hash per l esempio: int HASH::hashvalue(char *key) { int hv = 0; for(int i=0;i<strlen(key);i++){ hv += key[i]%256; return hv % 256; Ovvero una funzione che restituisce la somma dei caratteri modulo 256. Metodi // // DA IMPLEMENTARE // Programma test #include "hlli.h" #include <string.h> #include <iostream.h> #include <stdio.h> int main(){ HASH hh; NODE record; 4 Uso ed utilizzo di tabelle di Hash

for(int i=0;i<5;i++){ record.voto = i*20; record.matricola = 101+i; sprintf(record.nome,"antonella%3.3d",i); hh.insert( record.nome, &record); for(int i=0;i<7;i++){ sprintf(record.nome,"antonella%3.3d",i); hh.print( record.nome); int i=27; record.voto = i*20; record.matricola = 101+i; sprintf(record.nome,"antonella%3.3d",i); hh.insert( record.nome, &record); record.matricola ++; hh.insert( record.nome, &record); return 0; hh.print( record.nome); hh.printline(record.nome); Esercizi Si implementino i metodi per cancellare un record e per restituire una lista di tutti i record con la stessa chiave. Uso ed utilizzo di tabelle di Hash 5