• Non ci sono risultati.

Esercitazione 5

N/A
N/A
Protected

Academic year: 2021

Condividi "Esercitazione 5"

Copied!
3
0
0

Testo completo

(1)

Esercitazione 5

Si vuole fornire una realizzazione del tipo di dato Dizionario mediante una tabella hash con gestione delle collisioni ad indirizzamento aperto con tecnica di scansione hashing doppio.

Si richiede di non ammettere l!uso di chiavi duplicate e di utilizzare -m primo per dimensionare la tabella

-h1(key) = key mod m

-h2(key) = [key mod (m-1)] +1

Queste scelte di m, h1 e h2 garantiscono che, in caso di conflitto, la scansione esamini tutte le celle della tabella.

Esercitazione 5

Considerare il package Dizionario composto da:

- interfaccia Dizionario.java: la specifica del tipo di dato Dizionario

- interfaccia Hash.java: specifica alcuni metodi necessari per realizzare una tabella hash

- classe DizRecord.java: memorizza una coppia (key,elem)

- classe DizHashHD.java: realizzazione del Dizionario mediante tabella hash a indirizzamento aperto e hashing doppio

e completare l!implementazione della classe DizHashHD.java.

Consegnare l!intera classe DizHashHD.java

Consegnare entro Domenica 30 Novembre ore 23.55

(2)

Esercitazione 5: precisazioni

Rilevazione accessi alla tabella hash: il campo tot_accessi deve tener conto di tutti gli accessi alle celle della tabella hash da parte dei metodi insert, delete e search.

Metodo rehash(): per garantire che la sequenza di scansione esamini tutte le celle della tabella il metodo deve ridimensionare la tabella ad un numero primo. Allora, dopo aver moltiplicato la dimensione attuale per la costante RESIZE_FACTOR, è necessario determinare il più piccolo numero primo successivo e utilizzare quello come nuova dimensione della tabella. Per far ciò, utilizzare le seguenti istruzioni:

BigInteger prime = BigInteger.valueOf((long)(diz.length*Hash.RESIZE_FACTOR));

int newcapacity = (prime.nextProbablePrime()).intValue();

Esercitazione 5: precisazioni

Metodo insert(k,e): poiché non c!è completa garanzia di ottenere un numero primo dal metodo nextProbablePrime(), il metodo insert può fallire anche se c!e! spazio in tabella. Infatti può accadere che la sequenza di scansione esamini solo alcune celle e che queste siano tutte occupate. In tal caso il metodo insert deve tornare false.

Inoltre, bisogna tener conto sia dell!unicità delle chiavi presenti nel dizionario che delle eventuali cancellazioni effettuate. Ad esempio, partendo da una tabella vuota, inseriamo le chiavi x,y,z (intere non negative) in sequenza (prima x, poi y e poi z). Supponiamo che tutte e tre collidano nella stessa cella della tabella. Allora x prende il posto che le compete, y il successivo nella scansione e z il successivo ancora.

(continua…)

(3)

Esercitazione 5: precisazioni

A questo punto cancelliamo y: allora la cella di y ha canc=true.

Infine, inseriamo di nuovo z: l!inserimento non deve andare a buon fine, ovvero la scansione non può fermarsi quando trova una cella con canc= true! La scansione può terminare quando trova una casella vuota (a null), oppure quando ha già esaminato tutte le celle della tabella.

(continua…)

0 1 2 3 4 5 6

z y

x

0 1 2 3 4 5 6

z canc

x

Esercitazione 5: precisazioni

Nel caso la chiave non sia già presente in tabella, la posizione di inserimento è:

-quella della prima casella vuota, se non sono state attraversate celle cancellate;

-quella della prima cella cancellata attraversata, atrimenti.

Nella tabella precedente, se aggiungiamo una nuova chiave w che collide ancora con x,y,z (y gia! cancellata!) allora deve esserle assegnata la cella cancellata relativa ad y.

0 1 2 3 4 5 6

z w

x

Riferimenti

Documenti correlati

Si pensi anche al caso dell’ancora malnoto sacrificio filiale, riscattato dal sacrificio di Ismaele, che una tradizione da Ibn Hišām coinvolgente direttamente il nonno

Abbiano un tabella di m celle, con n elementi

Se memorizziamo n chiavi in una tabella hash con m = n 2 slot utilizzando una funzione hash h scelta a caso da una classe universale di funzioni hash, la probabilit`a che si

Un blocco dato può occupare qualsiasi posizione nella linea Scelto con lo stesso meccanismo delle cache associative Una cache set-associativa. in cui un blocco può andare in n

Il Fortran ammette anche la “dichiarazione implicita” delle variabili: tutte le variabili il cui nome inizia con i,j,k,l,m,n sono automaticamente ritenute di tipo intero, mentre

Il tipo carattere è di fatto un dato di tipo numerico sul quale sono permesse tutte le operazioni definite sul tipo intero.. Il

In altre parole la coda risulterà piena quando l'indice di coda sarà separato da quello di testa da esattamente una posizione libera (ossia aggiungendo 1 all'indice

Se quest’ultimo risultasse il massimo della serie si potrebbe applicare il test del massimo valore, ipotizzando che i dati dell’evento appartengano alla stessa popolazione dei