LRU缓存算法

前言

直接上算法题:

image.png
LRU为最近最少使用算法,是一种内存数据淘汰策略,在实际开发中,当内存不足时,需要淘汰最近最少使用的数据,那么这种算法怎样实现的呢?

正文

这题有很多种思路,这里主要用map这种数据结构,为什么用map呢?因为map它的key可以是任意类型,且它的存储是有序的,我们可以利用map的性质,理清解题的思路。

思路

  1. 定义一个map数据结构,以及一个存储容量的变量。
  • 借助map的size属性,轻而易举的可以知道它有没有达到存储的阈值达到阈值就要删除(delete)最近最少使用的元素,且将新值放入(set)map中。
  1. 在这个方法的原型上定义两个方法,分别是在map中对元素的访问(get)和增加(set)。

代码

var LRUCache = function (capacity) {
  this.catch = new Map()  //初始化map数据结构
  this.capacity = capacity  //容量
};

LRUCache.prototype.get = function (key) {
  if (this.catch.has(key)) {   //map中有这个元素
    let value = this.catch.get(key);  //调用map的get方法获取元素
    //更新key=>value
    this.catch.delete(key);  //删除之前的元素
    this.catch.set(key, value);  //将新获取的相同的元素以键值对推入map中

    return value   //返回关键字的值
  }
  return -1  //map中没有这个元素返回-1
};

LRUCache.prototype.put = function (key, value) {
  if (this.catch.has(key)) {  //有这个元素
    this.catch.delete(key);  //删除
  }

  //判断有没有达到存储的阈值
  if (this.catch.size >= this.capacity) {
    //移除谁 再放新值  //m.keys().next()拿到首位的键值对
    this.catch.delete(this.catch.keys().next().value)
  }
  this.catch.set(key, value);
};

//验证
let lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}

猜你喜欢

转载自juejin.im/post/7255876429518929975