Deseo implementar un LRU cache
, donde los elementos utilizados menos recientemente se expulsarán de forma asincrónica. Mi idea actual es usar un Dictionary
para almacenar los pares <key,value>
, y para realizar un seguimiento de los tiempos de acceso de los objetos, para mantener un SortedDictionary <key, timestamp>
. La idea es que el subproceso asincrónico obtenga los elementos LRU del SortedDictionary
y lo elimine del caché. Pero para que esto funcione, SortedDictionary
debe ordenar por valor, lo que no ocurre.Diccionario ordenado según el valor en C# (caché LRU)
Podría haber usado una por separado en lugar de la SortedList
SortedDictionary
para mantener la llave y {} marca de tiempo ordenados en la marca de tiempo, pero entonces voy a tener que hacer una búsqueda de "lineal" para encontrar la clave de la lista (cuando Tengo que ACTUALIZAR la marca de tiempo, cuando se accede a la misma clave de nuevo) - Estoy buscando una forma mejor que lineal, si es posible. ¿Alguien puede compartir ideas para lidiar con este problema?
Por lo tanto, mi problema se reduce a esto:
tengo para buscar las llaves en < = log n tiempo para actualizar la marca de tiempo, mientras que al mismo tiempo capaz de obtener las claves ordenados en base a la marca de tiempo.
Una forma de pensar era mantener un SortedDictionary
de <{key,timestamp},null>
que ordena las claves en función de la marca de tiempo de {key, timestamp}. Si bien esto está bien, el problema es hashcode()
simplemente tendrá que devolver key.hashcode() (para buscar mientras se actualiza la marca de tiempo), mientras que equals()
también debe usar la marca de tiempo. Por lo tanto, equals()
y hashcode()
están en conflicto, por lo que consideró que esta no es una buena idea ...
En otras palabras, ¿desea que SortedDic actúe como cola de prioridad donde la prioridad se define por marca de tiempo? ¿Qué pasa con SortedDictionary? Y por cierto, no es O (1) es O (logn) - probablemente se implemente como un árbol Rojo-Negro. –