Per la ricerca di un elemento in un albero binario
di ricerca vediamo il primo esempio di algoritmo che sfrutta la proprietà
(ABR).
Come nel caso della ricerca binaria su un array, ogni indagine nell'ABR
permette di eliminare metà degli elementi su cui continuare la ricerca.
Tecnicamente questo permette di ridurre la ricorsione doppia, tipica
degli algoritmi su alberi binari, ad una ricorsione singola.
L'algoritmo è il seguente:
-
Se l'albero è vuoto la ricerca termina subito con
fallimento.
-
Se l'albero non è vuoto, si confronta il valore cercato
con quello contenuto nella radice dell'albero:
-
Se i due valori coincidono la ricerca termina con successo.
-
Se il valore cercato è minore di quello contenuto
nella radice la ricerca prosegue ricorsivamente nel sottoalbero sinistro.
-
Se è invece maggiore la ricerca prosegue nel sottoalbero
destro.
|
Sulla complessità della ricerca
Si confrontino gli algoritmi di ricerca visti.
In un albero binario, nel caso pessimo
(ad esempio, se la chiave cercata non esiste) dobbiamo visitare tutti i
nodi, quindi la complessità è lineare nel numero dei nodi.
In un albero binario di ricerca,
ad ogni passo si visita un solo sottoalbero: infatti le due chiamate ricorsive
compaiono nel metodo in rami mutuamente esclusivi. Di conseguenza nel caso
pessimo la ricerca ha una complessità proporzionale alla massima profondità
dell'albero.
Se l'ABR è bilanciato si dimostra che la sua profondità
è logaritmica nel numero di nodi e quindi anche la complessità della ricerca diviene logaritmica.
Ad esempio, per scoprire che 45 non è presente
nel seguente albero, con il primo algoritmo bisogna visitare 10 nodi, con
il secondo solo tre.
Su di un albero ben bilanciato di 1000 nodi, il secondo
algoritmo richiede al massimo una decina di passi.
|