Supponiamo di avere una vasta gamma di numeri interi consecutivi in memoria, ognuno dei quali appartiene esattamente a una categoria. Due operazioni devono essere O (log n): spostare un intervallo da una categoria a un'altra e trovare i conteggi delle categorie per un determinato intervallo.Struttura dati per ampi intervalli di numeri interi consecutivi?
Sono sicuro che la seconda operazione è stata risolta in modo superficiale, vista l'implementazione corretta per la prima operazione.
Ogni intero inizia in una categoria, quindi ho iniziato con un set di BST bilanciati. Lo spostamento di un albero secondario da un BST a un altro (ad esempio, lo spostamento di un intervallo in una categoria diversa) ha un tempo di esecuzione equivalente alla fusione di due BST, che è O (n1 * n2) [1].
Questo è troppo lento (in python e C non è un'opzione) e non sono riuscito a trovare un modo per sfruttare la struttura intrinseca dei miei dati per creare un'operazione di unione BST efficiente.
Ora guardo ad AVL, rosso-nero e alberi ad intervalli, heap binari e traci. Confrontando le loro proprietà è schiacciante. Quale struttura dovrei usare?
Modifica (chiarimento problema): Sono flessibile su come memorizzare questi valori e creare le mie strutture dati. Sono inflessibile su come ricevo il mio input, che proviene da un'altra applicazione, e assomiglia al seguente: CATEGORY(cat3, I, J)
. La mia soluzione corrente crea un albero con un nodo per ogni intero nell'intervallo. Questo è troppo lento per la dimensione del mio set di dati, quindi sono felice di re-architect se fornito un metodo migliore.
Qualsiasi richiesta data può spostare qualsiasi intervallo possibile di numeri interi in qualsiasi categoria. In altre parole, gli intervalli si sovrappongono nel senso di CATEGORY(cat1, 1, 10)
seguito da CATEGORY(cat3, 5, 15)
, ma non sovrapposti, nel senso che ogni numero intero si troverà esattamente in una categoria in un dato momento.
L'intervallo salvato come elenco di numeri interi o come una tupla come '(begin, end)'? –
prima di iniziare ad implementare alcuni alberi, dovresti provare a usare i tipi di dati incorporati come dicts e sets. Questi sono altamente ottimizzati e molto performanti. – rocksportrocker
Quindi hai una lista con tuple [(numero1, cat1), ....] ??? – rocksportrocker