DAA - Alberi di ricerca binaria a costo ottimale

Un albero di ricerca binario (BST) è un albero in cui i valori delle chiavi sono memorizzati nei nodi interni. I nodi esterni sono nodi nulli. Le chiavi sono ordinate lessicograficamente, cioè per ogni nodo interno tutte le chiavi nel sottoalbero di sinistra sono minori delle chiavi nel nodo e tutte le chiavi nel sottoalbero di destra sono maggiori.

Quando conosciamo la frequenza di ricerca di ciascuna delle chiavi, è abbastanza facile calcolare il costo previsto per l'accesso a ciascun nodo dell'albero. Un albero di ricerca binario ottimale è un BST, che ha un costo minimo previsto per l'individuazione di ciascun nodo

Il tempo di ricerca di un elemento in un BST è O(n), mentre in una ricerca Balanced-BST il tempo è O(log n). Anche in questo caso il tempo di ricerca può essere migliorato in Optimal Cost Binary Search Tree, posizionando i dati utilizzati più di frequente nella radice e più vicini all'elemento radice, mentre i dati utilizzati meno frequentemente vicino alle foglie e nelle foglie.

Qui viene presentato l'algoritmo dell'albero di ricerca binaria ottimale. Per prima cosa, costruiamo un BST da una serie di filen numero di chiavi distinte < k1, k2, k3, ... kn >. Qui assumiamo la probabilità di accedere a una chiaveKi è pi. Alcune chiavi fittizie (d0, d1, d2, ... dn) vengono aggiunti in quanto potrebbero essere eseguite alcune ricerche per i valori che non sono presenti nel Key set K. Assumiamo, per ogni chiave fittiziadi la probabilità di accesso è qi.

Optimal-Binary-Search-Tree(p, q, n) 
e[1…n + 1, 0…n],  
w[1…n + 1, 0…n], 
root[1…n + 1, 0…n]  
for i = 1 to n + 1 do 
   e[i, i - 1] := qi - 1 
   w[i, i - 1] := qi - 1  
for l = 1 to n do 
   for i = 1 to n – l + 1 do 
      j = i + l – 1 e[i, j] := ∞ 
      w[i, i] := w[i, i -1] + pj + qj 
      for r = i to j do 
         t := e[i, r - 1] + e[r + 1, j] + w[i, j] 
         if t < e[i, j] 
            e[i, j] := t 
            root[i, j] := r 
return e and root

Analisi

L'algoritmo richiede O (n3) tempo, poiché tre annidati forvengono utilizzati i loop. Ciascuno di questi cicli assume al massimon valori.

Esempio

Considerando il seguente albero, il costo è 2,80, anche se questo non è un risultato ottimale.

Nodo Profondità Probabilità Contributo
k 1 1 0.15 0.30
k 2 0 0.10 0.10
k 3 2 0,05 0.15
k 4 1 0.10 0.20
k 5 2 0.20 0.60
d 0 2 0,05 0.15
d 1 2 0.10 0.30
d 2 3 0,05 0.20
d 3 3 0,05 0.20
d 4 3 0,05 0.20
d 5 3 0.10 0.40
Total 2.80

Per ottenere una soluzione ottimale, utilizzando l'algoritmo discusso in questo capitolo, vengono generate le seguenti tabelle.

Nelle tabelle seguenti, l'indice di colonna è i e l'indice di riga è j.

e 1 2 3 4 5 6
5 2.75 2.00 1.30 0.90 0.50 0.10
4 1.75 1.20 0.60 0.30 0,05
3 1.25 0.70 0.25 0,05
2 0.90 0.40 0,05
1 0.45 0.10
0 0,05

w 1 2 3 4 5 6
5 1.00 0.80 0.60 0.50 0.35 0.10
4 0.70 0.50 0.30 0.20 0,05
3 0,55 0.35 0.15 0,05
2 0.45 0.25 0,05
1 0.30 0.10
0 0,05

radice 1 2 3 4 5
5 2 4 5 5 5
4 2 2 4 4
3 2 2 3
2 1 2
1 1

Da queste tabelle è possibile formare l'albero ottimale.