adt dizionario - di-srv.unisa.it · supponiamo che sia definita una relazione d'ordine totale...
TRANSCRIPT
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)