Un tree‑structured index è una struttura dati gerarchica che organizza le chiavi in nodi collegati ad albero per permettere ricerche, inserimenti e cancellazioni efficienti, sia in memoria che su disco. A differenza degli indici statici (es. ISAM), gli alberi mantengono la struttura bilanciata o adattativa durante gli aggiornamenti, evitando overflow estesi verso file di overflow.


PARAMETRI GENERALI

Usa questo schema come riferimento comune in tutte le sezioni.

  • N = numero totale di nodi.
  • m (fan-out teorico) = ordine / numero massimo di figli per nodo (prestabilito).
  • fan‑outeff (fan‑out effettivo) = f x m (dove f è fill factor medio, es. 0.5–0.7).
  • kmax = numero massimo di chiavi in un nodo.
  • kmin = numero minimo di chiavi in un nodo.
  • h = altezza dell’albero (numero di livelli dalla radice alle foglie).

N.B. Il fan-out (numero di figli per nodo) effettivo è il fan-out medio realmente osservato, tenendo conto che in un albero i nodi non sono sempre pieni e operazioni come insert e delete creano nodi parzialmente occupati. Per questo al fan-out massimo m moltiplichiamo il fill-factor (con valori 0 < f ≤ 1).


TIPOLOGIE

Esistono varie tipologie di search tree che differiscono per la struttura logica di base e per la conseguente implementazione fisica:


BST (Binary Search Tree)

Descrizione:

  • Albero binario: ogni nodo ha al più 2 figli.
  • Proprietà d’ordine: per ogni nodo vale: chiavi dei nodi del sottoalbero sinistro < chiave del nodo < chiavi dei nodi del sottoalbero destro (valore crescente dei nodi da sinistra a destra).
  • Ogni nodo contiene una chiave.

Parametri:

  • Nmax2h - 1
  • m = 2 (numero figli massimo)
  • fan‑outeff ≈ 2
  • kmax = 1 (chiave per nodo)
  • kmin = 1 (se il nodo esiste)
  • h = caso medio ≈ log2(N + 1), caso peggiore = N (un nodo per livello)

Costo di ricerca:

Su ogni livello: ricerca sull’unica chiave interna al nodo → O(1)

  • Caso medio (albero bilanciato): O(log2N)
  • Caso peggiore (degenerazione): O(N)

Esempio:

        [50*]
      ┌───┴───┐
    [30*]    [70*]
  ┌───┴───┐    ┴───┐
[20*]    [40*]    [80*]

(* indica che il nodo contiene il record o il puntatore).


MST (Multi-way Search Tree)

Descrizione:

  • Albero multi-way: ogni nodo ha fino a m figli.
  • Proprietà d’ordine: per ogni nodo, le chiavi dividono i figli in intervalli ordinati: chiavi < della prima chiave del nodo → nel primo sottoalbero, chiavi > della prima e < della seconda chiave del nodo → nel secondo sottoalbero (tra prima e seconda chiave)… e così via.
  • Ogni nodo può contenere fino a m−1 chiavi.

Parametri:

  • Nmax(mh- 1) / (m - 1)
  • m ≥ 2 (prestabilito)
  • fan‑outeff ≈ f × m (f = fill factor)
  • kmax = m − 1 (chiavi per nodo)
  • kmin = 1 (se non self-balanced)
  • hlogfan-outeff(N) (altezza stimata)

Costo di ricerca:

Su ogni livello: ricerca binaria sulle chiavi interne del nodo → O(log2kmax)

  • Caso medio (albero bilanciato): O(h x log2kmax)
  • Caso peggiore (degenerazione): O(N x log2kmax)

Esempio:

MST con m = 3:

                    [40*|80*]
         ┌──────────────┼──────────────┐
     [10*|20*]    [50*|55*|60*]      [90*]
  ┌──────┴──────┐
[5*]      [25*|30*|35*]

(* indica che il nodo contiene il record o il puntatore).


Disk‑oriented search tree

Gli alberi disk-oriented sono strutture logiche progettate per minimizzare gli accessi al disco (I/O), ottimizzando lettura e scrittura di pagine. Concettualmente, in questa tipologia di alberi, ogni nodo corrisponde tipicamente a una pagina disco contenente più chiavi e puntatori. Ne esistono più tipologie:


B-tree (Balanced Tree)

Descrizione:

  • Albero multi-way: ogni nodo ha fino a m figli.
  • Proprietà d’ordine: per ogni nodo, le chiavi dividono i figli in intervalli ordinati: chiavi < della prima chiave del nodo → nel primo sottoalbero, chiavi > della prima e < della seconda chiave del nodo → nel secondo sottoalbero (tra prima e seconda chiave)… e così via.
  • Ogni nodo (page) può contenere fino a m−1 chiavi.
  • Riempimento Bottom-Up (prima si cerca di riempire le foglie e poi si sale, rispettando i vincoli).
  • Self-balanced: leggi sotto.

Albero bilanciato:

Un albero bilanciato ha le seguenti caratteristiche:

  • Tutti i percorsi dalla radice alle foglie hanno sempre la stessa lunghezza.
  • Tutti i nodi foglia si trovano allo stesso livello.
  • Ogni nodo interno deve avere sempre K + 1 figli, con K = chiavi effettive nel nodo.

Il bilanciamento deve essere rispettato anche dopo nuovi inserimenti o rimozioni, a costo di spostare le chiavi tra i vari nodi. Questa proprietà garantisce di avere sempre l’altezza minima e le prestazioni prevedibili.


Parametri:

  • Nmax(mh- 1) / (m - 1)
  • m ≥ 2 (prestabilito)
  • fan‑outeff ≈ f × m (f = fill factor)
  • kmax = m − 1 (chiavi per nodo)
  • kmin = ⌈m/2⌉ − 1
  • hlogfan-outeff(N) (altezza stimata)

Costo di ricerca:

Su ogni livello: ricerca binaria sulle chiavi interne del nodo → O(log2kmax)

  • Costo medio: (Numero di I/O) ≈ h RBA
  • Caso medio e peggiore sono simili grazie al bilanciamento.

Esempio:

B-tree con m = 4:

				                          [40*|---|---]       
				      ┌───────────────────┘   └───────────────────┐    
				[15*|30*|---]                               [70*|---|---]
	  ┌─────────┘   |   └──────────┐                 ┌──────┘   └──────┐
[10*|11*|13*] [20*|---|---]  [35*|---|---]     [50*|60*|---]     [80*|---|---]

(* indica che il nodo contiene il record o il puntatore).


B+‑tree (Balanced Plus Tree)

Descrizione:

I B+‑tree sono una variante specializzata dei B‑tree, progettata per migliorare l’efficienza delle operazioni di ricerca e delle range query nei sistemi orientati al disco. Le due strutture condividono molte proprietà (multi‑way, bilanciate, altezza logaritmica, nodi con capacità variabile), ma differiscono in alcuni aspetti fondamentali. Nei B+‑tree:

  • I puntatori ai dati si trovano solo nelle foglie. I nodi interni contengono solo chiavi di instradamento, senza record associati.
  • Tutte le foglie sono collegate tramite una linked list ordinata, che permette di scorrere le chiavi in ordine crescente in modo sequenziale.
  • La ricerca arriva sempre a una foglia (mai ad un nodo interno), perché solo le foglie contengono i dati.

Esempio:

B+-tree con m = 4:

				                           [ 40|---|---]       
				       ┌───────────────────┘   └───────────────────┐    
				 [ 15| 30|---]                               [ 70|---|---]
	  ┌──────────┘   |   └──────────┐                 ┌──────┘   └──────┐
[10*|11*|13*]→ [20*|---|---]→ [35*|---|---]→    [50*|60*|---]→    [80*|---|---]

(* indica che il nodo contiene il record o il puntatore).