Preguntas de la entrevista --------- Describa brevemente el algoritmo LRU y su implementación

Breve descripción del algoritmo LRU

 Un algoritmo de almacenamiento en caché más común es también un algoritmo utilizado por la administración de memoria. Cuando la memoria está llena, la página no utilizada más recientemente en la memoria se selecciona para ser eliminada.

Método para realizar

Tabla hash + lista doblemente enlazada

La lista doblemente enlazada almacena estos pares clave-valor en el orden en que se utilizan. Los pares clave-valor cerca de la cabeza son los usados ​​más recientemente y los pares clave-valor cerca de la cola son los menos usados.

La tabla hash es un mapa hash ordinario (ES6 Map), que asigna la clave de los datos almacenados en caché a su posición en la lista doblemente vinculada.

Primero usamos la tabla hash para ubicar, encontrar la posición del elemento de caché en la lista doblemente enlazada, y luego moverlo al encabezado de la lista doblemente enlazada, y luego la operación get o put se puede completar en O (1) hora. El método específico es el siguiente:

Para la operación de obtención, primero determine si la clave existe:

  • Si la clave no existe, devuelve -1−1;
  • Si la clave existe, el nodo correspondiente a la clave es el nodo utilizado más recientemente. Localice la posición del nodo en la lista doblemente enlazada a través de la tabla hash, muévala al encabezado de la lista doblemente enlazada y finalmente devuelva el valor del nodo.

Para la operación de colocación, primero determine si la clave existe:

  • Si la clave no existe, use la clave y el valor para crear un nuevo nodo, agregue el nodo al principio de la lista doblemente vinculada y agregue la clave y el nodo a la tabla hash. Luego juzgue si el número de nodos en la lista doblemente enlazada excede la capacidad, si excede la capacidad, elimine el nodo de cola de la lista doblemente enlazada y elimine el elemento correspondiente en la tabla hash;
  • Si la clave existe, es similar a la operación de obtención. Primero localice a través de la tabla hash, luego actualice el valor del nodo correspondiente a valor y mueva el nodo al encabezado de la lista doblemente enlazada.
var LRUCache = function (capacity) {
  this.cache = new Map();
  this.capacity = capacity;
};

LRUCache.prototype.get = function (key) {
  if (this.cache.has(key)) {
    // 存在即更新
    let temp = this.cache.get(key);
    this.cache.delete(key);
    this.cache.set(key, temp);
    return temp;
  }
  return -1;
};

LRUCache.prototype.put = function (key, value) {
  if (this.cache.has(key)) {
    // 存在即更新(删除后加入)
    this.cache.delete(key);
  } else if (this.cache.size >= this.capacity) {
    // 不存在即加入
    // 缓存超过最大值,则移除最近没有使用的
    this.cache.delete(this.cache.keys().next().value);
  }
  this.cache.set(key, value);
};

 

Supongo que te gusta

Origin blog.csdn.net/wanghongpu9305/article/details/111825917
Recomendado
Clasificación