Desidero implementare uno LRU cache
, dove elementi utilizzati meno di recente verranno eliminati in modo asincrono. La mia idea attuale è di usare un Dictionary
per memorizzare le coppie <key,value>
e per tenere traccia dei tempi di accesso degli oggetti, per mantenere un SortedDictionary <key, timestamp>
. L'idea è per il thread asincrono per ottenere gli elementi LRU dal SortedDictionary
e rimuoverli dalla cache. Ma per fare questo, SortedDictionary
ha bisogno di ordinare per valore, che non è così.Ordinato dizionario ordinato sul valore in C# (cache LRU)
Avrei potuto utilizzare uno SortedList
separato anziché lo SortedDictionary
per mantenere la {chiave e la data/ora} ordinati per la data/ora, ma poi dovrò fare una ricerca "lineare" per trovare la chiave dall'elenco (quando Devo AGGIORNARE il timestamp, quando si accede nuovamente alla stessa chiave) - Sto cercando un modo migliore di quello lineare, se possibile. Qualcuno può condividere idee per affrontare questo problema?
Quindi, il mio problema si riduce a questo:
ho di ricercare chiavi in < = tempo logn per l'aggiornamento del timestamp, mentre allo stesso tempo in grado di ottenere le chiavi ordinati in base ai timestamp.
Un modo per pensare era mantenere uno SortedDictionary
di <{key,timestamp},null>
che ordina le chiavi in base alla parte timestamp di {chiave, timestamp}. Mentre questo va bene, il problema è hashcode()
dovrà solo restituire key.hashcode() (per la ricerca durante l'aggiornamento di timestamp), mentre equals()
dovrebbe utilizzare anche timestamp. Quindi, equals()
e sono in conflitto, quindi sentivo che questa non è una buona idea ...
In altre parole, si desidera che SortedDic agisca come coda di priorità in cui la priorità è definita dal timestamp? Cosa c'è di sbagliato in SortedDictionary? E BTW non è O (1) è O (logn) - probabilmente è implementato come un albero rosso-nero. –