Questa risposta combina alcuni dei miei commenti alla domanda e li espande.
L'operazione subrange su alberi rosso-neri può essere eseguita nel caso O (log n) nel caso peggiore, dove n è il numero di elementi nella struttura originale. Poiché l'albero risultante condividerà alcuni nodi con l'albero originale, questo approccio è adatto solo se gli alberi sono immutabili (o gli alberi sono mutabili ma l'albero originale non è più necessario).
Si noti innanzitutto che l'operazione subrange può essere implementata da due operazioni split. Qui l' operazione di divisione prende un albero rosso-nero T e un tasto x e produce due alberi L e R in modo tale che L sia costituito da tutti gli elementi di T minori di x e R gli elementi di T maggiori di x. Pertanto, il nostro obiettivo ora è implementare l'operazione di divisione su alberi rosso-neri nel tempo O (log n) nel peggiore dei casi.
Come eseguiamo l'operazione di divisione su alberi rosso-neri in O (log n) time? Bene, si è scoperto che esisteva un metodo ben noto. (Non lo sapevo, ma non sono esperto di strutture di dati.) Considera l' operazione di join , che prende due alberi L e R in modo tale che ogni valore in L sia inferiore a ogni valore in R e produca un albero costituito da tutti i valori in L e R. L'operazione di join può essere implementata nel tempo peggiore O (| r L −r R | +1), dove r L e r Rsono i ranghi di L e R, rispettivamente (ovvero il numero di nodi neri sul percorso dalla radice a ciascuna foglia). L'operazione di divisione può essere implementata utilizzando l'operazione O (log n) volte dell'operazione di join e il tempo totale nel caso peggiore è ancora O (log n) considerando una somma telescopica.
Le sezioni 4.1 e 4.2 di un libro [Tar83] di Tarjan descrivono come implementare le operazioni di join e split su alberi rosso-neri nel peggiore dei casi O (log n). Queste implementazioni distruggono gli alberi originali, ma è facile convertirle in implementazioni immutabili e funzionali copiando i nodi invece di modificarli.
Come nota a margine, i moduli Set e Map di Objective Caml forniscono le operazioni split e altre operazioni standard su (immutabili) alberi di ricerca binari bilanciati. Sebbene non utilizzino alberi rosso-neri (usano alberi di ricerca binari bilanciati con il vincolo che l'altezza sinistra e l'altezza destra differiscono al massimo per 2), anche guardare le loro implementazioni potrebbe essere utile. Ecco l'implementazione del modulo Set .
Riferimenti
[Tar83] Robert Endre Tarjan. Strutture dati e algoritmi di rete . Volume 44 della serie di conferenze regionali CBMS-NSF in Matematica applicata , SIAM, 1983.