Abbiamo bisogno di ADT con funzioni di ricerca e classificazione. Cioè, oltre all'interfaccia della mappa STL, è richiesta una funzione 'int get_rank (chiave)'.Albero di rango in C++
L'implementazione standard di tale funzione richiede il supporto e l'aggiornamento di un campo intero in più in ogni nodo dell'albero di ricerca auto bilanciato (ad esempio, nell'albero nero-rosso, utilizzato nella mappa/insieme STL). Ma a quanto pare, la mappa/set STL non lo fa.
Stiamo cercando una soluzione basata su contenitori standard (STL, Boost) con la migliore complessità temporale possibile: trovare/aggiungere/cancellare un elemento prendere O (log n) (come in STL map/set), calcolando il rango con una chiave prende anche O (log n).
Per il grado di un elemento, si intende la posizione dell'elemento nella sequenza ordinata di tutti gli elementi della mappa/set.
Esempio. set = {0, 4, 6, 7, 8} rank (0) = 1, rank (4) = 2, rank (6) = 3, rank (7) = 4, rank (8) = 5.
A nostro parere, in base ai vincoli di complessità temporale sopra, il problema non può essere risolto da una combinazione di due mappe un ordinamento per chiave e altro ordinamento per grado.
Grazie.
per rango, intendi indice? –
Le complessità di ricerca, inserimento ed eliminazione sono spesso inversamente correlate tra loro. Non possiamo decidere quale trade-off è meglio per te. – luke
Esiste un'implementazione dell'albero del rango che soddisfa tutti i vincoli di complessità temporale, vedi, ad esempio, il libro di Cormen, T.H. "Introduzione agli algoritmi". – Slava