|
Un albero binario di ricerca (da qui in avanti indicato anche come 'ABR'), in contesto informatico, è un Albero binario in cui i valori dei figli di un nodo sono ordinati, usualmente avendo valori minori di quelli del nodo di partenza nei figli a sinistra e valori più grandi nei figli a destra. L'origine è da attribuirsi a più persone intorno alla fine degli anni '50.
Definizione formaleLa definizione formale di un ABR è quella di un Albero binario T avente le seguenti tre proprietà, in cui indicheremo come val(x) il valore di un nodo
ImplementazioneIn generale, l'implementazione dell'ABR è uguale a quella di un Albero binario, in quanto sono le operazioni poi a imporre le proprietà all'albero. Ad esempio, in linguaggio Pascal l'implementazione di un ABR contenente dei semplici interi è uguale a quella di un albero binario contenente semplici interi:
OperazioniPer le operazioni più comuni su un ABR contenente n elementi, sfruttando anche le sue proprietà, sono stati trovati algoritmi con complessità nell'ordine di O(h) con h pari alla profondità dell'ABR stesso, tranne che per la visita di tutti i nodi (svolta in complessità O(n)). Essendo l'ABR un Albero binario, nel caso migliore si ha quindi h = log2n dove n è il numero di nodi dell'albero. Visita ordinataUna prima operazione è la visita di tutti i suoi elementi in maniera ordinata, ovvero dall'elemento più piccolo all'elemento più grande. AlgoritmoLa visita è effettuata con un algoritmo ricorsivo che sfrutta le proprietà dell'ABR, visitando prima in maniera ordinata il sottoalbero sinistro, poi visitando il nodo radice e infine visitando in maniera ordinata il sottoalbero destro. Poiché vengono visitati tutti i nodi una sola volta, la complessità algoritmica è pari a O(n). ImplementazioniUna implementazione d'esempio in linguaggio Pascal è la seguente:
Ricerca di un elementoLa ricerca del nodo contenente un certo valore è una delle operazioni più frequenti su un ABR. AlgoritmoL'algoritmo risolutivo è anche in questo caso ricorsivo, e sfruttante le caratteristiche dell'ABR. La ricerca è svolta confrontando il valore della radice dell'ABR con quello da trovare, e se non si è trovato il valore cercato, svolgendo la ricerca sul sottoalbero sinistro o destro a seconda se la radice dell'ABR ha un valore maggiore o minore di quello cercato. L'algoritmo a ogni passo ricorsivo scende un livello dell'albero, quindi è evidente che la sua complessità algoritmica è O(h), dove h è la profondità dell'albero. ImplementazioniUna implementazione dell'algoritmo in linguaggio Pascal è la seguente:
Inserimento di un elementoL'inserimento di un elemento in un ABR deve essere fatta in maniera che l'albero risultante dopo l'inserimento deve rispettare sempre le proprietà degli ABR. AlgoritmoL'algoritmo è simile a quello della ricerca. In pratica si svolge una ricerca fin quando non si esce dall'albero, e l'ultimo nodo attraversato prima di uscire sarà il padre del nuovo elemento inserito. A questo punto si confronta il valore del padre con quello da inserire e si inserisce adeguatamente a sinistra o destra del padre il nuovo valore. L'algoritmo ha quindi la stessa complessità algoritmica di quello di ricerca, e quindi O(h) con h la profondità dell'albero. ImplementazioniUn'implementazione d'esempio in linguaggio Pascal è la seguente:
Cancellazione di un elementoLa cancellazione di un elemento in un ABR non è un'operazione così semplice. Per mantenere le proprietà dell'ABR anche dopo la cancellazione infatti, bisogna distinguere il caso in cui il nodo da cancellare sia una foglia senza figli, abbia un figlio o abbia due figli. AlgoritmoL'algoritmo per effettuare la cancellazione quindi innanzitutto distingue i seguenti tre casi:
L'algoritmo ha un solo caso in cui fa più di operazioni banali, ed è quando cerca il successore di un nodo. Quest'ultima operazione è fatta o cercando il minimo del sottoalbero destro del nodo, operazione fatta scendendo i nodi verso sinistra fin quando non si esce dall'albero, e quindi impiegando una complessità massima di O(h) dove h è la profondità dell'albero, visto che a ogni passo ricorsivo si scende di un livello l'albero; o nel caso il sottoalbero destro del nodo non esistesse, salendo l'albero fino a trovare un nodo di cui quello in esame è appartenente al suo sottoalbero sinistro, operazione ricorsiva che anche questa, e che a ogni passo risale un livello dell'albero, impiegando quindi una complessità algoritmica pari a O(h) anche in questo caso. L'operazione di cancellazione ha quindi una complessità finale O(h) dove h è la profondità dell'albero. ImplementazioniUna implementazione dell'algoritmo in linguaggio Pascal è la seguente:
Implementare gli alberi di ricerca binari su arraySe non è necessario effettuare frequentemente operazioni di inserimento e cancellazioni o non è affatto necessario effettuarle e non si vuole usare troppa memoria è possibile implementare un albero di ricerca binario su un array ordinato, con la restrizione che il numero degli elementi sia 2n − 1 con L'immagine sopra mostra un albero di ricerca binario implementato su un array ordinato di 15 elementi, si comincia ponendo il centro dell'array come radice dell'albero e come sue foglie rispettivamente il centro della parte destra dell'array e il centro della parte sinistra dell'array, si continua applicando ricorsivamente il procedimento fino a che non sono stati coperti tutti gli elementi. Si ottiene quindi l'equivalente dell'albero la pseudo-algoritmo per la ricerca di una chiave è
Collegamenti esterni
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net