40
ADT Dizionario ADT Dizionario Ordered search table Ordered 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 sfruttando l'ordinamento delle chiavi in S ! Strutture Dati

ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 2: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 3: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 4: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 5: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 6: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 7: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 8: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 9: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 10: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 11: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 12: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 13: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 14: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 15: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 16: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 17: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 18: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 19: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 20: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 21: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 22: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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)*/

Page 23: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 24: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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:

•••

Page 25: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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:

•••

Page 26: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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));

Page 27: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 28: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 29: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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));

Page 30: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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));

Page 31: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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));

Page 32: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 33: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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)

Page 34: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 35: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 36: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 37: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 38: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 39: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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

Page 40: ADT Dizionario - di-srv.unisa.it · Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D: possiamo memorizzare le entrate di D in un array list

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)