La meilleure façon de mettre de cache LRU

J'ai été confronté à ce problème de cache LRU mise en œuvre lorsque, après la taille de la mémoire cache est plein, le moins récemment utilisé le point est sauté et il est remplacé par un nouvel élément.

J'ai deux implémentations à l'esprit:

1). Créer deux cartes qui ressemble à quelque chose comme ceci

std::map<timestamp, k> time_to_key
std::map<key, std::pair<timestamp, V>> LRUCache

Pour insérer un nouvel élément, nous pouvons mettre le timestamp actuel et la valeur dans la LRUCache. Tandis que lorsque la taille du cache est plein, nous pouvons expulser les moins récents élément par trouver le plus petit timestamp présents dans temps_to_clé et le retrait de la clé correspondante de LRUCache.
L'insertion d'un nouvel élément est O(1), mise à jour le timestamp est O(n) (car nous avons besoin de rechercher la k correspondant à l'horodatage dans temps_to_clé.

2). Avoir une liste liée dans lequel la moins récemment utilisée cache est présent à la tête et le nouvel élément est ajouté à la queue. Lors de l'arrivée d'un élément qui est déjà présent dans le cache, le nœud correspondant à la clé de l'élément est déplacé vers la queue de la liste.
L'insertion d'un nouvel élément est O(1), mise à jour le timestamp est de nouveau en O(n) (car nous avons besoin de se déplacer à la queue de la liste), et la suppression d'un élément est O(1).

Maintenant, j'ai les questions suivantes:

  1. Où l'une de ces implémentations est mieux pour un LRUCache.
  2. Est-il un autre moyen pour mettre en œuvre la LRU Cache.
  3. En Java, dois-je utiliser HashMap pour mettre en œuvre les LRUCache
  4. J'ai vu des questions comme, de mettre en œuvre un générique cache LRU, et ont aussi des questions comme la mise en œuvre d'un cache LRU. Est générique cache LRU différente de cache LRU?

Merci d'avance!!!

EDIT:

D'une autre façon (plus simple) pour mettre en œuvre LRUCache en Java, en utilisant LinkedHashMap et en remplaçant le booléen removeEldestEntry(la Carte.entrée aîné) de la fonction.

Voir aussi stackoverflow.com/questions/221525/...
en java, vous devez utiliser LinkedHashMap et fermer à jamais HashMap. Meilleur LRU cartes utilisent une certaine forme de Carte w/ lien nœuds, c'est à dire qu'il peut être mis en œuvre avec la recherche binaire rouge-noir et un lien (précédent/suivant) nœuds de côté parent/gauche/droite/valeur/rouge|noir champs. Ou ce LinkedHashMap est: arbre en fonction des seaux w/ prev/next.
HashMap, HashTable, LinkedHashMap en Java sont mis en œuvre à l'aide de tables de hachage c'est à dire de tableau et linéaire de sondage pour la résolution de collision. Ils ne sont pas mis en œuvre comme rouge noir des arbres
Je n'ai jamais dit qu'ils sont rouge-noir, vous pouvez voir TreeMap, ajoutant prev/next pour les nœuds n'est pas dur, j'ai une carte du même type pour des primitifs doubles, c'est à dire rouge-noir w/ prev/next entre les nœuds.
yup l'ajout suivant/précédent dans une structure d'arbre de données n'est pas difficile, mais je me demande wont u besoin de modifier l'interne TreeMap classe si tu veux ajouter prev/next nœud?

OriginalL'auteur Amm Sokun | 2011-06-18