Che cosa c è nella lezione. Questa lezione si occupa di strutture dati:

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

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

alberi binari di ricerca (BST)

Strutture dati elementari. Vittorio Maniezzo - Università di Bologna

TABELLE AD INDIRIZZAMENTO DIRETTO

Strutture dati elementari

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

Alberi binari di ricerca

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

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Insiemi Dinamici. Operazioni tipiche (S:struttura, x: riferimento(puntatore) alla chiave, k: chiave)

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

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

Tipi di dato e Strutture dati elementari

Introduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p

La struttura dati CODA

Esercitazione 6. Alberi binari di ricerca

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Heap scenario. Ho un insieme dinamico di oggetti, ciascuno identificato con una priorità. (la priorità è semplicemente un numero);

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

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

Algoritmi e Strutture di Dati

Laboratorio di Programmazione

Alberi di ricerca binari

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

Dizionario. Marina Zanella Algoritmi e strutture dati Tabelle hash 1

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

Alberi binari e alberi binari di ricerca

Fondamenti di Informatica II

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

Alberi binari e alberi binari di ricerca

Laboratorio di Programmazione

Alberi binari e alberi binari di ricerca

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Liste concatenate. Violetta Lonati

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

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

ALGORITMI E STRUTTURE DATI

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica

algoritmi e strutture di dati

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Alberi Binari di Ricerca

Il vettore e la lista concatenate (o catena) sono due esempi di strutture interne.

TIPO DI DATO ASTRATTO

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Alberi Binari di Ricerca

ricerca di un elemento, verifica dell appartenenza di un elemento

Fondamenti di Informatica

Algoritmi e Strutture di Dati

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Organizzazioni hash. Corso di Basi di Dati e Sistemi Informativi

tipi di dato astratti

Heap e code di priorità

PILE E CODE. Pile (stack):

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

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

ricerca di un elemento, verifica dell appartenenza di un elemento

Nella scorsa lezione: Array multidimensionali. Mappa di memorizzazione. Esempio: ordinamento di parole. Argomenti di main.

Programmazione II canale AD -- Esonero del 21/04/2006

Alberi. Alberi: Esempio di utilizzo

Programmazione 2. Liste Doppiamente Lincate. Prof. Sebastiano Battiato Prof.ssa Rosalba Giugno

Strutture dati Alberi binari

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

In questa lezione Strutture dati elementari: Pila Coda

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Heap e Code di Priorità

Struttura dati Dizionario

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

heap concetti ed applicazioni

Strutture dati. Le liste

Multi-way search trees

Alberi ed Alberi Binari

Problemi di ordinamento

In questa lezione Alberi binari di ricerca

Tabelle hash. Vittorio Maniezzo - Università di Bologna

Struttura dati astratta Coda

Look up table, caso generale

Laboratorio di Algoritmi

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

SOMMARIO STACK. STACK: specifica STACK

Spesso sono definite anche le seguenti operazioni:

Sommario. Tabelle ad indirizzamento diretto e hash Funzioni Hash

Linguaggio C: Strutture e Liste Concatenate Valeria Cardellini

Tipi di dati astratti

Liste. Costo operazioni Tutte le operazioni hanno costo O(1)

Lezione 12 Tabelle Hash

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Alberi binari di ricerca

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

Algoritmi e Strutture Dati. Strutture Dati Elementari

Transcript:

Algoritmi e Programmazione Avanzata - teoria / Che cosa c è nella lezione Questa lezione si occupa di strutture dati: tipi di dato astratto le pile le code le liste gli alberi binari di ricerca le tabelle di hash. /

Algoritmi e Programmazione Avanzata - teoria / Definizione Tipo di Dato Astratto: Modello matematico sul quale è definito un insieme di operazioni. /

Modello: insieme di elementi generici Operazioni: unione (X,Y) inters (X,Y) diff (X,Y) Modello: intervallo di interi Operazioni: + - * : / Estensione dei tipi primitivi Tipi primitivi: quelli supportati da un linguaggio (int, float, char per il C) con le loro operazioni (+, -, *, /, % etc.). Tipi di Dati Astratti: estensione dell insieme dei tipi di dato supportati. /

Estensione Operatori: predefiniti, operazioni elementari sui tipi primitivi. Procedure come estensione degli operatori: nuove operazioni sui tipi primitivi nuove operazioni su nuovi tipi Tipi di Dato Astratto: associazione nuovo tipo nuovo insieme di operazioni. / Implementazione Definizione del Tipo di Dato Astratto indipendente da: linguaggio di programmazione scelta implementativa (struttura dati) /

Implementazione in C Definire in un file separato le procedure corrispondenti alle operazioni definite dal Tipo di Dato Astratto. Definire un tipo di dato corrispondente al Tipo di Dato Astratto. Lavorare sul Tipo di Dato Astratto esclusivamente utilizzando le procedure fornite. Campi dato visibili solo attraverso le funzioni. / Definizione del tipo: typedef SET_ELEM int; Esempi di procedure: SET_ELEM *unione (SET_ELEM *, SET_ELEM *); SET_ELEM *inters(set_elem *, SET_ELEM *); SET_ELEM *diff(set_elem *, SET_ELEM *); SET_ELEM *make_null(void); int size (SET_ELEM *); void dump (SET_ELEM *); /

Algoritmi e Programmazione Avanzata - teoria / Definizione Tipo di dato astratto con politica LIFO (Last In First Out) con operazioni: Push: inserisce nuovo elemento nella pila Pop: estrae dalla pila l ultimo elemento inserito Empty: vero se pila vuota Init: crea nuova pila /

Init() / Push (K) K /

Push (K) K K / K Push (K) K K /

Pop K K K / Pop K K /

Implementazione tramite vettore Vettore buff di N elementi Variabile top: indice dell ultimo elemento inserito Complessità delle operazioni T(n) = O() / Implementazione C / #define N int buff[n]; int top; void push(int val); int pop(void); int empty(void); void push(int val) { buff[++top] = val; return; } /

Implementazione C / int pop(void) { return(buff[top--]); } int empty(void) { if(top == ) return (); else return (); } / Algoritmi e Programmazione Avanzata - teoria /

Definizione Tipo di dato astratto con politica FIFO (First In First Out) con operazioni: Enqueue: inserisce un nuovo elemento nella coda Dequeue: estrae dalla coda il primo elemento inserito Empty: vero se coda vuota Init: crea nuova coda. / Dequeue Enqueue Init() /

Dequeue Enqueue Enqueue(K) K / Dequeue Enqueue Enqueue(K) K K /

Dequeue Enqueue Enqueue(K) K K K / Dequeue Enqueue Dequeue K K K /

Dequeue Enqueue Dequeue K K / Implementazione tramite vettore Vettore buffer di N+ elementi per code di N elementi Variabili: head: indice del primo elemento inserito tail: indice del primo elemento disponibile per l inserimento Vettore come buffer circolare Complessità delle operazioni T(n) = O() /

Buffer circolare Dequeue: incrementa head modulo N+ Enqueue: incrementa tail modulo N+ Inizialmente head =, tail = Coda piena (overflow): head = (tail + ) modulo N+ Coda vuota (underflow): head = tail / Coda con max elementi (N=) Coda vuota head tail /

Coda con max elementi (N=) Enqueue(A) head tail / Coda con max elementi (N=) A Enqueue(A) head tail /

Coda con max elementi (N=) A Enqueue(B) head tail / Coda con max elementi (N=) A B Enqueue(B) head tail /

Coda con max elementi (N=) A B Enqueue(C) head tail / Coda con max elementi (N=) A B C Enqueue(C) head tail /

Coda con max elementi (N=) A B C Enqueue(D) head tail / Coda con max elementi (N=) A B C D Enqueue(D) head tail /

Coda con max elementi (N=) A B C D Dequeue head tail / Coda con max elementi (N=) Dequeue A B C D head tail /

Coda con max elementi (N=) B C D Enqueue(E) head tail / Coda con max elementi (N=) B C D E Enqueue(E) head tail /

Coda con max elementi (N=) B C D E Enqueue(F) head tail / Coda con max elementi (N=) B C D E F Enqueue(F) tail head Coda piena /

Coda con max elementi (N=) B C D E F Dequeue tail head / Coda con max elementi (N=) B C D E F Dequeue tail head /

Coda con max elementi (N=) C D E F Enqueue(G) tail head / Coda con max elementi (N=) G C D E F Enqueue(G) head tail Coda piena /

Coda con max elementi (N=) G C D E F Dequeue head tail / Coda con max elementi (N=) C G D E F Dequeue tail head /

Coda con max elementi (N=) D G E F Dequeue tail head / Coda con max elementi (N=) E G F Dequeue tail head /

Coda con max elementi (N=) F G Dequeue head tail / Coda con max elementi (N=) G Dequeue head tail Coda vuota /

Implementazione in C #define DIM int buffer[dim+]; int tail=, head=; int enqueue(int elem); int dequeue(void); int empty(void); / Implementazione in C int enqueue(int elem) { if((tail+)==head (tail==dim && head==)) return(-); buffer[tail++] = elem; if(tail == (DIM+)) tail = ; return(); } /

Implementazione in C int dequeue(void) { int ret; if(head == tail) return(-); ret = buffer[head++]; if(head == (DIM+)) head = ; return(ret); } / Implementazione in C int empty(void) { if(head == tail) return(); else return(); } /

Algoritmi e Programmazione Avanzata - teoria / Definizione Struttura dati lineare: elementi allocati/deallocatiseparatamente elementi concatenati (e quindi accessibili) attraverso puntatori variabile head: accesso al primo elemento operazioni: - insert (in testa di linea non ordinata o in lista ordinata) - search - delete /

Definizione Vantaggi/svantaggi: memoria corrispondente agli elementi effettivamente utilizzata accesso mediante scansione Classificazione: liste ordinate / non ordinate / Definizione Operazioni: Insert(L, k): nserisce una chiave k nella lista L - liste non ordinate: in testa - liste ordinate: posizione corretta Search(L, k): cerca la chiave k nella lista L Delete(L, x): cancella la chiave k dalla lista L dato il puntatore x all elemento che la contiene. /

Lista concatenata semplice key next head(l) NIL Lista concatenata doppia previous key next head(l) NIL NIL / Inserimento in testa (lista non ordinata) head(l) Z P NIL /

Inserimento in testa (lista non ordinata) insert(l, x) x A NIL head(l) Z P NIL / Inserimento in testa (lista non ordinata) head(l) A next(x) = head(l) head(l) = x Z P NIL /

Implementazione C struct e { int key; struct e *next; }; struct e *insert(struct e *ptop, int val); struct e *search(struct e *ptop,int *val, int *status); struct e *newe( ); / Implementazione C struct e *newe ( ) /

Implementazione C struct e *newe ( ) Allocazione di un nuovo nodo / Implementazione C struct e *newe ( ) { struct e *eptr; } eptr = (struct e *) malloc (sizeof (struct e)); if (eptr==null) { fprintf (stderr, "Allocazione fallita."); exit (FAILURE); } return (eptr); /

Implementazione C struct e *insert (struct e *ptop,int val) / Implementazione C Inserimento in testa struct e *insert (struct e *ptop,int val) /

Implementazione C struct e *insert (struct e *ptop,int val) { struct e *pnew; pnew = newe (); pnew->key = val; pnew->next = ptop; / Implementazione C struct e *insert (struct e *ptop,int val) { struct e *pnew; pnew = newe (); pnew->key = val; pnew->next = ptop; next(x) = head(l) /

Implementazione C struct e *insert (struct e *ptop,int val) { struct e *pnew; pnew = newe (); pnew->key = val; pnew->next = ptop; ptop = pnew; / Implementazione C struct e *insert (struct e *ptop,int val) { struct e *pnew; pnew = newe (); pnew->key = val; pnew->next = ptop; ptop = pnew; head(l) = x /

Implementazione C struct e *insert (struct e *ptop,int val) { struct e *pnew; pnew = newe (); pnew->key = val; pnew->next = ptop; ptop = pnew; } return (ptop); / Ricerca Scansione della lista a partire da head Confronto chiave cercata / chiave corrente Terminazione: trovata la chiave cercata fine lista /

Implementazione C struct e *search (struct e *ptop,int *val,int *status) / Implementazione C struct e *search (struct e *ptop,int *val,int *status) ricerca /

Implementazione C struct e *search (struct e *ptop,int *val,int *status) { struct e *ptmp; *status = FAILURE; ptmp=ptop; while ((ptmp!=null) && (*status==failure)) { if (ptmp->key==*val) { *status = SUCCESS; } else { ptmp=ptmp->next; } } / Implementazione C if (*status==success) { fprintf (stdout,"trovato %d\n",ptmp->key); } else { fprintf (stdout,"non Trovato \n"); } } return (ptop); /

Cancellazione Richiede: una ricerca, che produce il puntatore x all'elemento da cancellare il riaggiustamento dei puntatori - all elemento da cancellare - all elemento precedente - all elemento seguente (lista concatenata doppia) / Cancellazione head(l) NIL P A Z NIL /

Cancellazione delete(l, x) x head(l) NIL P A Z NIL / Cancellazione head(l) NIL P A Z NIL prev[next[x]] = prev[x] next[prev[x]] = next[x] /

Complessità Inserzione in testa di lista non ordinata: T(n) = O() Ricerca: T(n) = O(n) Cancellazione (dato il puntatore all elemento da cancellare): T(n) = O() / Algoritmi e Programmazione Avanzata - teoria /

Definizione / Tipo di dato astratto con operazioni: search minimum maximum predecessor successor insert delete Implementano dizionari e code prioritarie. / Definizione / Proprietà: nodo x vale che: nodo y Left(x), key[y] key[x] nodo y Right(x), key[y] key[x] x Left(x) Right(x) /

Esempi / Attraversamenti Attraversamento: elenco dei nodi secondo una strategia: Pre-ordine: x, Left(x), Right(x) In-ordine: Left(x), x, Right(x) Post-ordine: Left(x), Right(x), x Complessità: T(n) = Q(n) Attraversamento in-ordine: ordinamento crescente delle chiavi. /

/ Visita in pre-ordine /

Visita in pre-ordine / Visita in pre-ordine /

Visita in pre-ordine / Visita in pre-ordine /

Visita in pre-ordine / Visita in pre-ordine /

Visita in pre-ordine / Visita in pre-ordine /

Visita in pre-ordine / Visita in pre-ordine /

Visita in-ordine / Visita in-ordine /

Visita in-ordine / Visita in-ordine /

Visita in-ordine / Visita in-ordine /

Visita in-ordine / Visita in-ordine /

Visita in-ordine / Visita in-ordine /

Visita in-ordine / Visita in-ordine /

Visita in post-ordine / Visita in post-ordine /

Visita in post-ordine / Visita in post-ordine /

Visita in post-ordine / Visita in post-ordine /

Visita in post-ordine / Visita in post-ordine /

Visita in post-ordine / Visita in post-ordine /

Visita in post-ordine / Visita in post-ordine /

Search Ricerca ricorsiva di un nodo con chiave k: percorrimento dell albero dalla radice; terminazione: trovato k oppure giunti a una foglia; ricorsione: dal nodo x - su sottoalbero sinistro se k < key[x] - su sottoalbero destro se k key[x]. / k = /

k = / k = /

k = < / k = < /

k = / k = /

k = / k = > /

k = > / k = /

k = / k = /

k = > / k = > /

k = / k = /

k = = / k = = Trovato! /

Min e max Min: seguire il puntatore al sottoalbero sinistro finchè esiste. Max: seguire il puntatore al sottoalbero destro finchè esiste. / /

/ /

min = / min = /

min = max = / Successor Successore di un nodo x: nodo con la più piccola chiave k > key[x]. Due casi: Right(x): succ(x) = min(right(x)) Right(x): succ(x) = primo antenato di x il cui figlio sinistro è anche un antenato di x. p[x] x x p[x] /

/ x /

x / x /

x succ(x) / /

x / x /

succ(x) x / Predecessor Predecessore di un nodo x: nodo con la più grande chiave k < key[x]. Due casi: Left(x): pred(x) = max(left(x)) Left(x): pred(x) = primo antenato di x il cui figlio destro è anche un antenato di x. /

/ x /

x / x /

x pred(x) / /

x / x /

pred(x) x / Insert Inserire in un albero binario di ricerca un nodo z con chiave key[z] mantenimento della proprietà: creazione del nuovo nodo z, con Left[z]=Right[z]=NIL; posizione di inserimento di z come foglia, simulando la ricerca di key[z]; aggiornamento dei puntatori. /

z T insert(t,z) / z T insert(t,z) /

z T insert(t,z) / z T insert(t,z) /

z T insert(t,z) / z T insert(t,z) /

T / Delete Cancellazione da un albero binario di ricerca di un nodo z mantenimento della proprietà mantenimento della struttura ad albero binario. Tre casi:. nodo z foglia. nodo z con solo figlio. nodo z con figli. /

Caso : foglia z / Caso : foglia delete(z): rimozione immediata. z /

Caso : foglia / Caso : figlio delete(z): z /

Caso : figlio delete(z): z x / Caso : figlio delete(z): il figlio x di z diventa figlio delpadre p di z. p z x /

Caso : figlio / z delete(z): Caso : figli /

z Caso : figli delete(z): si cancella y = succ(z) y / z Caso : figli delete(z): si cancella y = succ(z) si copia y su z y /

z Caso : figli delete(z): si cancella y = succ(z) si copia y su z y Nota: y può essere pred(z) / Caso : figli /

Complessità Le operazioni hanno complessità T(n) = O(h): albero con n nodi completamente bilanciato - altezza h = log n albero con n nodi completamente sbilanciato - altezza h = n O(log n) T(n) O(n) / /

Dizionario Tipo di dato astratto Modello: insieme finito di simboli. Operazioni: search insert delete.? corrispondenza biunivoca insieme finito di simboli e intervallo di interi. / Applicazioni Tabella dei simboli di un compilatore Chiave = nome di un identificatore Dati aggiuntivi = tipo, contesto, dichiarazione. Cache di file o URL Chiave = path Dati aggiuntivi = attributi e contenuto. /

Tabelle ad accesso diretto / Chiave k U = {,,, m-} Tutte le chiavi sono distinte. Vettore T[,,, m-]: se k, T[k] punta a k, altrimenti T[k] = NIL. Memorizzazione di un insieme K di K chiavi. / Tabelle ad accesso diretto / U (universo delle chiavi) T m- K (chiavi usate) dati associati chiave k x /

Operazioni Search(T, k) return(t[k]) Insert(T, x) T[key[x]] = x Delete(T, x) T[key[x]] = NIL / Vantaggi/svantaggi Complessità delle operazioni: T(n) = O() Occupazione di memoria S(n) = O( U ) = O(m) applicabile per m piccolo spreco di memoria per K << m. /

Tabelle di hash In generale: m grande (vettore T non allocabile) K << m. Tabella di hash: tipo di dato astratto con occupazione di spazio O( K ) e tempo medio di accesso O(). / Funzione di hash / La tabella di hash contiene K elementi ( K << U ) Funzione di hash h: mappa una chiave k in una posizione del vettore h(k) h: U fi {,,..., m- } Elemento x viene memorizzato nella locazione T[h(key[x])] /

Funzione di hash / U k k k k k m- T / Funzione di hash / U k k k k k m- T h(k ) /

Funzione di hash / U k k k k k m- T h(k ) h(k ) / Funzione di hash / U k k k k k m- T h(k ) h(k ) h(k ) /

Funzione di hash / U k k k k k m- T h(k ) h(k ) h(k ) h(k ) / Funzione di hash / U k k k k k m- T h(k ) h(k ) h(k )=h(k ) Collisione h(k ) /

Progetto della funzione di hash / Funzione ideale hashing uniforme semplice: se le chiavi k sono equiprobabili, allora i valori di h(k) devono essere equiprobabili. k: h( k) = j P( k) =, j =,, K, m m / Progetto della funzione di hash / In pratica: k non sono equiprobabili, anzi correlate: - usare tutti i bit della chiave - amplificare le differenze. chiavi come numeri interi (illimitati) - abc diventa a * + b * + c. /

Metodi Divisione: h(k) = k mod m m: primo non troppo vicino a potenza di. Evitare che m sia: - potenza di (usa solo gli ultimi m bit di k); - una potenza di (se i k sono numeri decimali); - p - (per stringhe di caratteri in base p, trasposizioni di caratteri collisioni). / / n = elementi previsti numero di confronti medio pari a nelle ricerche m = : numero primo vicino a / ma distante dalle potenze di h(k) = k mod /

/ Moltiplicazione: data costante <A< h(k) = m (k A - k A ) k A rimescola i bit i k m (k A - k A ) espande l intervallo [,] nell intervallo [,m]. Scelta: m potenza di (estrazione di sotto-sequenza di bit); A = ( ) / =.. / Collisione Definizione: collisione: h(k i )=h(k j ) per k i k j Le collisioni sono inevitabili, occorre: minimizzarne il numero (buona funzione di hash); gestirle: - linear chaining - open addressing. /

Linear Chaining / Più elementi possono risiedere nella stessa locazione della tabella T lista concatenata. Operazioni: inserimento in testa alla lista ricerca nella lista cancellazione dalla lista. / Linear Chaining / U k k k k k k m- T /

Linear Chaining / U k k k k k k m- T k / Linear Chaining / U k k k k k k m- T k k /

Linear Chaining / U k k k k k k m- T k k k / Linear Chaining / U k k k k k k m- T k k k k /

Linear Chaining / U k k k k k k m- T k k k k k / Linear Chaining / U k k k k k k m- T k k k k k k /

Complessità / Ipotesi: Liste non ordinate: n = numero di elementi memorizzati m = dimensione della tabella di hash. Hashing semplice uniforme: h(k) ha egual probabilità di generare gli m valori di uscita. Definizione fattore di carico a=n/m (>, = o < ) / Complessità / Inserimento: T(n) = O() Ricerca: caso peggiore T(n) = Q(n) caso medio T(n) = O(+a) Cancellazione: T(n) = O() se disponibile il puntatore ad x e la lista è doppiamente linkata; come la ricerca se disponibile il valore di x, oppure il valore della chiave k, oppure la lista è semplicemente linkata. /

Open addressing Ogni cella di T può contenere un solo elemento. Tutti gli elementi sono memorizzati in T. Collisione: ricerca di cella non ancora occupata mediante probing: generazione di una permutazione delle celle = ordine di ricerca della cella libera. a h(k, i) : U {,,...,m- } fi {,,...,m- } chiave tentativo ( m-) / Funzioni di probing Linear probing h(k, i) = (h (k)+i) mod m Quadratic probing h(k, i) = (h (k)+ c i + c i ) mod m c e c Double hashing h(k, i) = (h (k)+ i h (k) ) mod m dove: h (k) = k mod m h (k) = + (k mod m ) m = m- o m- /

Operazioni / Insert: tentativo i= calcola h(k, i) se libero, inserisci chiave, altrimenti incrementa i ripeti fino a i=m Search: tentativo i= calcola h(k, i) se trovata chiave, termina con successo incrementa i ripeti fino a i=m o cella vuota (insuccesso). / Operazioni / Delete: operazione complessa che interrompe le catene di collisione. L open addressing è in pratica utilizzato solo quando non si deve mai cancellare. /

Complessità Ipotesi: hashing semplice uniforme probing uniforme. Tentativi di probing : per l inserimento: /( a) per la ricerca: - senza successo: /( a) - con successo: /a ln (/(- a)) + / a / Inserimento delle chiavi,,,,,,,, in tabella con m= con open addressing. /

,,,,,,,, /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /,,,,,,,, Linear probing h(k, i) = (k mod + i) mod Collisione: h(, ) = /

,,,,,,,, Linear probing h(k, i) = (k mod + i) mod primary clustering /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /

,,,,,,,, Quadratic probing h(k, i) = (k mod +i+i ) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /

,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /,,,,,,,, Double hashing h(k, i) = (k mod +i(+k mod )) mod Collisione: h(, ) = /