Ho bisogno di una struttura di dati per memorizzare un numero di elementi, ognuno dei quali è associato a tempi diversi . varia e sebbene abbia un limite superiore teorico, si tratta di molti ordini di grandezza più grandi di quelli normalmente utilizzati.
Attraverso la mia applicazione posso garantire che:
Gli elementi inseriti sono sempre più recenti di tutti gli elementi esistenti, ovvero se un elemento è associato a un tempo viene inserito, quindi . Gli elementi vengono inseriti uno per uno.
Vengono rimossi solo gli elementi più vecchi, ovvero se l'elemento viene rimosso, quindi . Le rimozioni avvengono principalmente una per una, ma non vi è alcun danno diretto se la rimozione di un elemento è ritardata, a condizione che la frazione di elementi spuri immagazzinati rimanga inferiore a 1.
Oltre a inserire e rimuovere, l'unica cosa che devo fare è trovare i due elementi vicini per un certo tempo con . Con altre parole ho bisogno di trovare i due elementi e tali che e ∄ l ∈ \ {1, ..., n \}: t_j <t_l <t_k .
I miei criteri per la struttura dei dati sono:
- Trovare gli elementi sopra descritti dovrebbe essere il più veloce possibile.
- L'inserimento e la rimozione dovrebbero essere rapidi.
- La struttura dei dati è relativamente semplice da implementare.
Finché non stiamo parlando di un piccolo offset di runtime, ogni criterio ha la priorità su quello successivo.
La mia ricerca finora ha prodotto che la risposta è probabilmente una specie di albero di ricerca auto-bilanciante, ma non sono riuscito a trovare alcuna informazione quale di esse sia la migliore nel caso di inserimento o eliminazione unilaterale, e probabilmente mi costerà un tempo considerevole per scoprire me stesso. Inoltre, ho trovato solo informazioni incomplete su quanto bene gli alberi si auto-organizzano e quanto velocemente (ad esempio, gli alberi AVL si auto-organizzano più rigidamente degli alberi rosso-neri), per non parlare di come questo è influenzato dall'inserimento o dall'eliminazione su un lato.