ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale...

Preview:

Citation preview

ADT Dizionario ADT Dizionario Ordered search tableOrdered search table

0 1 2 3 4 5 6 7 8 9 10

2 3 6 8 11 13 18 23 24 30 33

Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

possiamo memorizzare le entrate di D in un array list S in ordine non decrescente di chiavi:

array list S

L'operazione di ricerca può essere notevolmente velocizzata sfruttandol'ordinamento delle chiavi in S !

Strutture Dati

ADT Dizionario ADT Dizionario

Algorithm BinarySearch(S,k,low,high):

if low > high thenreturn null

elsemid := ⌊(low+high)/2⌋e := S.get(mid)if k = e.getKey() then

return eelse if k < e.getKey() then

return BinarySearch(S,k,low,mid-1)else

return BinarySearch(S,k,mid+1,high)

Ordered search tableOrdered search table

Strutture Dati

ADT Dizionario ADT Dizionario

0 1 2 3 4 5 6 7 8 9 10

2 3 6 8 11 13 18 23 24 30 33

low highmid

mid = ⌊(low+high)/2⌋ = 5

Supponiamo di voler cercare la chiave 8

Ordered search tableOrdered search table

Strutture Dati

ADT Dizionario ADT Dizionario

0 1 2 3 4 5 6 7 8 9 10

2 3 6 8 11 13 18 23 24 30 33

low highmid

mid = ⌊(low+high)/2⌋ = 2

Supponiamo di voler cercare la chiave 8

Ordered search tableOrdered search table

Strutture Dati

0 1 2 3 4 6 7 8 9 10

2 3 6 8 11 13 18 23 24 30 33

low highmid

mid = ⌊(low+high)/2⌋ = 3

Supponiamo di voler cercare la chiave 8

5

ADT Dizionario ADT Dizionario Ordered search tableOrdered search table

Strutture Dati

Analisi della ricerca binaria:

il tempo di esecuzione è proporzionale al numero di chiamate ricorsive (ogni chiamata ricorsiva richiede un numero costante di operazioni)

ad ogni chiamata ricorsiva il numero di chiavi ancora da esaminare (candidate) è dato da high - low + 1

ADT Dizionario ADT Dizionario Ordered search tableOrdered search table

Strutture Dati

ad ogni nuova chiamata ricorsiva il numero di candidate è ridotto di almeno la metà, infatti:

caso k < e.getKey(). Viene chiamata BinarySearch(S,k,low,mid-1) che riduce il numero di candidate a

(mid – 1) – low + 1 = ⌊(low + high)/2⌋ – low ≤ (high – low + 1)/2

caso k ≥ e.getKey(). Viene chiamata BinarySearch(S,k,mid+1,high) che riduce il numero di candidate a

high – (mid + 1) + 1 = high – ⌊(low + high)/2⌋ ≤ (high – low + 1)/2

ADT Dizionario ADT Dizionario Ordered search tableOrdered search table

Strutture Dati

Inizialmente il numero di candidate è n e dopo i chiamate ricorsive si riduce a n/2

il numero di chiamate ricorsive che possiamo fare prima di trovarela nostra chiave sarà al massimo

⌊ log n ⌋ + 1 = O (log n)

i

ADT Dizionario ADT Dizionario Ordered search tableOrdered search table

Strutture Dati

Analisi: spazio: O(n)

tempo:● insert: O(n) ● remove: O(n) ● find: O(log n)● findAll: O(log n + s) dove s è il numero di chiavi restituite.

ADT Dizionario ADT Dizionario Ordered search tableOrdered search table

Strutture Dati

ADT DizionarioADT DizionarioEserciziEsercizi

Implementare l'ADT dizionario non ordinato con liste e con tabelle hash e implementare la tabella ordinata di ricerca con array list.

Strutture Dati

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

Un albero binario di ricerca è un albero binario T dove ciascun nodo interno v di T memorizza un'entrata (k,v) tale che:

● le chiavi memorizzate nei nodi del sottoalbero sinistro di v sono minori o uguali di k

● le chiavi memorizzate nei nodi del sottoalbero destro di v sono maggiori o uguali di k

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Per semplificare l'implementazione aggiungiamo delle foglie fittizie per trasformare un albero binario qualsiasi in un albero binario proprio in cui le entrate del dizionario sono memorizzate nei nodi interni

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 18

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 18

16 < 18

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 18

25 > 18

16 < 18

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 18

25 > 18

16 < 18

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 20

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 20

16 < 20

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

Ricerca di una chiave: k = 20

25 > 20

16 < 20

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

25 > 20

16 < 20

Ricerca di una chiave: k = 20

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 15 26

25 > 20

16 < 20

Ricerca di una chiave: k = 20

18 < 20

siamo arrivati ad una foglia: la chiave k = 20 non è presente

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

Algorithm TreeSearch(k,v):ritorna un nodo w del sottoalbero radicato in v tale che una delle due seguenti condizioni sia vera:

- w è un nodo interno la cui entrata ha chiave k - w è una foglia che rappresenta il posto in cui la chiave k dovrebbe

trovarsi in una visita inorder di T(v), ma T con contiene la chiave k

if T.isExternal(v) then return v if k < key(v) then

return TreeSearch (k,T.left(v)) else if k > key(v) then

return TreeSearch (k,T.right(v)) return v /* sicuramente k = key(v)*/

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

Algorithm find(k):w = TreeSearch (k,T.root())if T.isInternal(w) then

return w.element() else return null

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

● TreeSearch esegue un numero costante di operazioni ad ogni chiamata ricorsiva

● TreeSearch viene chiamato sui nodi di un cammino che va dalla radice fino a raggiungere eventualmente una foglia, scendendo di un livello alla volta.

h

O(1)

O(1)

O(1)

O(h)tempo totale:

•••

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

● TreeSearch esegue un numero costante di operazioni ad ogni chiamata ricorsiva

● TreeSearch viene chiamato sui nodi di un cammino che va dalla radice fino a raggiungere eventualmente una foglia, scendendo di un livello alla volta.

h

O(1)

O(1)

O(1)

O(h)tempo totale:

•••

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

Algorithm TreeInsert(k,x):Input: una chiave k, un valore x associato a kOutput: un nuovo nodo w che memorizza (k,x)

w = TreeSearch(k, root()); while (!isExternal(w)) // cerca la posizione in cui fare l'inserimento w = TreeSearch(k, T.left(w)); // possiamo scendere anche a destra return InsertAtExternal(w, (k, x));

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

14 15 26

12

Inserimento di una entrata con chiave k = 14

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

14 15 26

12

Inserimento di una entrata con chiave k = 14

w = TreeSearch(k,v)

w

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

14 15 26

12

Inserimento di una entrata con chiave k = 14

w = TreeSearch(k,v)

w while (!isExternal(w)) w = TreeSearch(k, T.left(w));

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

14 15 26

12

Inserimento di una entrata con chiave k = 14

w = TreeSearch(k,v)

w

while (!isExternal(w)) w = TreeSearch(k, T.left(w));

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

14 15 26

12

Inserimento di una entrata con chiave k = 14

w = TreeSearch(k,v)

w

while (!isExternal(w)) w = TreeSearch(k, T.left(w));

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

14 15 26

12

Inserimento di una entrata con chiave k = 14

w = TreeSearch(k,v)

while (!isExternal(w)) w = TreeSearch(k, T.left(w));

return InsertAtExternal(w, (k, x));14w

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 26

12

Rimozione di una entrata e

Primo caso:

e si trova in un nodo w che ha almenoun figlio z che è una foglia w

z

viene invocato RemoveExternal (z)

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

14 18 28

13 26

12

w

z

viene invocato RemoveExternal (z)

rimuove z e il padre di z sostituendo il padre di z con il fratello di z (eccezione se v non è una foglia)

Rimozione di una entrata e

Primo caso:

e si trova in un nodo w che ha almenoun figlio z che è una foglia

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

16

11 25

18 2813

2612viene invocato RemoveExternal (z)

rimuove z e il padre di z sostituendo il padre di z con il fratello di z (eccezione se v non è una foglia)

Rimozione di una entrata e

Primo caso:

e si trova in un nodo w che ha almenoun figlio z che è una foglia

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

Rimozione di una entrata e

Secondo caso:

e si trova in un nodo w che ha entrambii figli interni

20

11 25

14 21 28

13 18 26

12 15

w

16

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

20

11 25

14 21 28

13 18 26

12 15

w

16

y

x

Rimozione di una entrata e

Secondo caso:

e si trova in un nodo w che ha entrambii figli interni

1. si trova il primo nodo interno y successivo a w in una visita inorder

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

20

11 25

15 21 28

13 18 26

12 15

w

16

y

x

Rimozione di una entrata e

Secondo caso:

e si trova in un nodo w che ha entrambii figli interni

1. si trova il primo nodo interno y successivo a w in una visita inorder

2. si copia l'entrata di y in w

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

Rimozione di una entrata e

Secondo caso:

e si trova in un nodo w che ha entrambii figli interni

1. si trova il primo nodo interno y successivo a w in una visita inorder

2. si copia l'entrata di y in w 3. RemoveExternal(x)

20

11 25

15 21 28

13 18 26

12

w

16

ADT DizionarioADT DizionarioImplementazione con alberi binari di ricercaImplementazione con alberi binari di ricerca

Strutture Dati

metodo tempo

size, isEmpty O(1)

Find, insert, remove O(h)

findAll O(h+s)