Alberi binari di ricerca
Un albero binario di ricerca bilanciato di 1023 chiavi ne trova una qualsiasi in al massimo 10 confronti; costruito da dati ordinati, le stesse chiavi possono richiederne 1023.
La ricerca binaria, costruita nella forma
La ricerca binaria su un array ordinato trova una chiave in circa log₂ n controlli, ma inserire in un array ordinato sposta valori. Una tabella hash inserisce in fretta, ma dimentica l'ordine: non sa dirti facilmente la chiave più piccola o la chiave che viene dopo 40. Un albero binario di ricerca (ABR, in inglese BST) punta a entrambe le cose. È fatto di nodi, come una lista concatenata, ma ogni nodo ha due puntatori, left e right. Il nodo in cima è la radice; un nodo senza figli è una foglia.
Una sola regola lo rende un albero di ricerca: per ogni nodo, tutte le chiavi del sottoalbero sinistro sono più piccole e tutte le chiavi del sottoalbero destro sono più grandi. Per cercare una chiave parti dalla radice e confronta. Uguale significa trovata. Più piccola significa vai a sinistra, più grande significa vai a destra. Ogni confronto scarta un intero sottoalbero, proprio come la ricerca binaria scarta metà della lista. Cercare 60 nell'albero 50, 30, 70, 20, 40, 60, 80 confronta con 50, poi 70, poi 60: 3 confronti.
L'inserimento segue lo stesso percorso. Vai a sinistra o a destra finché il puntatore che ti serve è vuoto, e appendi lì il nuovo nodo. Inserire 45 confronta con 50 (vai a sinistra), 30 (vai a destra) e 40 (vai a destra), e 40 non ha un figlio destro, quindi 45 diventa il suo figlio destro. Eliminare un nodo che non è una foglia richiede un'idea in più: gli appunti del MIT scambiano il suo elemento con la chiave successiva o precedente nell'ordine ed eliminano da lì. La regola di conteggio nel laboratorio è un confronto per ogni nodo del percorso.
Trascina per ruotare. Scorri o avvicina le dita per lo zoom.
L'altezza è tutto
Quanti confronti può richiedere una ricerca? Al massimo uno per livello, quindi il costo dipende dall'altezza dell'albero, il numero di archi del percorso più lungo dalla radice fino a una foglia. Gli appunti del MIT lo dicono così: le operazioni sull'albero richiedono tempo O(h). L'albero 50, 30, 70, 20, 40, 60, 80 ha altezza 2, quindi nessuna ricerca richiede più di 3 confronti. Un albero perfettamente bilanciato con 1023 nodi ha altezza 9 e richiede al massimo 10 confronti.
Ma la forma dipende dall'ordine di inserimento. Inserisci 10, 20, 30, 40, 50, 60, 70 in ordine crescente: ogni chiave è più grande di tutte le precedenti, quindi ogni nuovo nodo va a destra dell'ultimo. L'albero diventa una catena di altezza 6, e cercare 70 richiede 7 confronti: una lista concatenata con puntatori in più. Con 1023 chiavi ordinate la ricerca peggiore richiede 1023 confronti invece di 10.
Gli alberi bilanciati risolvono il problema rimodellandosi dopo ogni inserimento o eliminazione. Il primo schema fu l'albero AVL, di Georgy Adelson-Velsky ed Evgenii Landis nel 1962, trattato nella lezione 7 del MIT. In ogni nodo mantiene le altezze dei due sottoalberi entro 1 l'una dall'altra, e ripara ogni squilibrio con piccole mosse locali chiamate rotazioni. Così l'altezza resta O(log n), e ricerca, inserimento ed eliminazione restano O(log n) in qualunque ordine arrivino le chiavi.
Le chiavi in ordine, gratis
Un ABR non dice soltanto se una chiave c'è. Visita il sottoalbero sinistro, poi il nodo, poi il sottoalbero destro, in modo ricorsivo, e le chiavi escono in ordine crescente. Questa visita simmetrica (il MIT la chiama traversal order) è il modo in cui un ABR risponde a «chiave più piccola», «chiave più grande» e «chiave successiva a 40», le operazioni d'ordine dell'interfaccia Set del MIT che una tabella hash non sa fare in fretta.
| Radice e foglia | La radice è il nodo in cima; una foglia non ha figli. |
| Proprietà dell'ABR | In ogni nodo, le chiavi del sottoalbero sinistro sono più piccole e quelle del sottoalbero destro più grandi. |
| Altezza | Archi del percorso più lungo dalla radice a una foglia. Una ricerca richiede al massimo altezza + 1 confronti. |
| Albero AVL | Un ABR bilanciato (1962): le altezze dei sottoalberi differiscono al massimo di 1, e le rotazioni lo mantengono così. |
| Visita simmetrica | Sinistra, nodo, destra: elenca le chiavi in ordine crescente. |
- Quale affermazione è la proprietà dell'albero binario di ricerca?
- Ogni nodo ha esattamente due figli
- In ogni nodo, le chiavi del sottoalbero sinistro sono più piccole e quelle del sottoalbero destro più grandi
- Le chiavi sono memorizzate nell'ordine di inserimento
- La radice è la chiave più piccola
- Albero costruito da 50, 30, 70, 20, 40, 60, 80. Quanti confronti richiede cercare 60?
- Stesso albero: cercare 45, che manca, richiede quanti confronti?
- Inserisci 45 in quell'albero. Dove va?
- Figlio sinistro di 50
- Figlio destro di 40
- Figlio sinistro di 60
- Figlio destro di 30
- Qual è l'altezza dell'albero 50, 30, 70, 20, 40, 60, 80?
- Inserisci 10, 20, 30, 40, 50, 60, 70 in quest'ordine. Quanti confronti richiede cercare 70?
- Un ABR perfettamente bilanciato ha 1023 nodi (altezza 9). Qual è il numero massimo di confronti di una ricerca?
- Metti le chiavi dell'albero 50, 30, 70, 20, 40 nell'ordine in cui le visita una visita simmetrica.
- Chi propose il primo schema di albero bilanciato, e quando?
- Adelson-Velsky e Landis, 1962
- Luhn, 1953
- Bauer e Samelson, 1957
- Knuth, 1998
- A quale domanda un ABR risponde in fretta e una semplice tabella hash no?
- 40 è memorizzato?
- Qual è la chiave successiva a 40?
- Quanti bucket ci sono?
- Quanto fa 40 mod 7?
- In un ABR, in ogni nodo le chiavi più piccole vanno a sinistra e quelle più grandi a destra.
- Ricerca e inserimento seguono un solo percorso: al massimo altezza + 1 confronti.
- Dati ordinati producono una catena (7 chiavi, altezza 6); alberi bilanciati come l'AVL (1962) mantengono l'altezza O(log n).
- Una visita simmetrica elenca le chiavi in ordine crescente.
Fonti di questo corso (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
- 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
- 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
- MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
- Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
- ECMAScript 2025 Language Specification (tc39.es/ecma262)
- 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
- Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
- D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
- "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).
Consultato il: 2026-10-18