Si queremos mantener el tamaño fijo de un mapa: 3 entradas y eliminar la entrada tocada más antigua, cuando se crea una nueva, ¿cómo lo hacemos con un tiempo constante? (Me dijeron que es posible)
Si hacemos tales operaciones:
let cache = new Map() cache.set('one', 1); cache.set('two', 2); cache.set('three', 3); cache.set('two', 'two'); cache.set('four', 4);Esperaría que el mapa sea:
{ ['three', 3], ['two', 'two'], ['four', 4], }Solo puedo pensar en tener una solución O (n) para la invalidación, pero anula todo el propósito del caché.
Los mapas se iteran en el orden en que se crearon las claves. Entonces puedes usar eso para hacer
const cache = new Map(); const keysIter = cache.keys(); function set(key, value) { cache.set(key, value); if (cache.size > 3) { cache.delete(keysIter.next().value); } } Sin embargo, si por "tocado más antiguo" desea referirse a las actualizaciones, no solo a la creación (por ejemplo, en su ejemplo, cache.set('five', 5) expulsaría ['three', 3] no ['two', 'two'] ), deberá realizar un seguimiento de estos toques usted mismo, por ejemplo, en un búfer circular. O tal vez simplemente llame a cache.delete(key) cada vez antes de "actualizar", de modo que cache.set(key, value) siempre cree una nueva entrada al final.