【算法】LRU(Least Recently Used)

1. Map结构实现

//最新加入的和最近被访问的将放入迭代器最后面
let 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 undefined;//仓库中没有时的返回值
};

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);
};
  • Map结构可以记住当前键值对的插入顺序,用来记录数据的新鲜度
  • 不用像数组一样需要遍历,时间复杂度O(1)
  • 每次都是删除旧键值对,新增键值对,保证新鲜度
  • 若超过容器容量上限,则删除迭代器最上面的键值对(最不新鲜),再新增

2. 使用场景

  • 缓存(keep-alive、自定义Promise缓存)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容