码上掘金实现LRU

75 阅读2分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

介绍

LRU算法是十分场景的算法,其不仅仅应用在操作系统中,并且在许多框架中我们都可以看到其影子,例如vue的keep-alive就是使用了LRU算法实现的,其巧妙的解决了内存替换的问题。接下来,我将设计一个LRU的具体实例,如果大家有任何疑问和难题都可以评论区留言,我会第一时间解决和处理的。谢谢各位观众老爷的支持。

码上掘金地址

核心功能讲解

//LRU 最近最少使用
function LRU (size) {
  this.map = new Map()
  this.size = size
  this.push = function(key,val) {
    //1.判断是否存在
    if(this.map.has(key)) {
      //2.存在,删除,添加
      this.map.delete(key)
      this.map.set(key,val)
    } else {
      if(this.map.size<this.size) this.map.set(key,val)
      else {
        //3.删除头部,添加
        this.map.delete(this.map.keys().next().value)
        this.map.set(key,val)
      }
    }
  }
  this.get = function(key) {
    //1.判断是否存在
    if(this.map.has(key)) {
      //2.存在,删除,添加,返回
      let val = this.map.get(key)
      this.map.delete(key)
      this.map.set(key,val)
      return val
    }
    return undefined
  }
}
let lru = new LRU(2)
lru.push(1,1)
lru.push(2,2)
console.log(lru.get(1))
lru.push(3,3)
console.log(lru.get(2))
  1. 构造一个函数,参数是LRU的最大存储空间大小
  2. 构造函数初始化的设计一map对象保存所有的键值对,使用size标记最大的存储空间
  3. 添加一个push方法,用于存储最新添加的对象,此处需要灵活的判断,首先我们需要判断这个对象十分存在这个map中,如果存在,需要删除这个对象,让后重新添加,因为我们访问了这个对象,始终让访问的插入到最后面。如果不存在,判断是否map的存储空间满了,如果未满额直接添加这个对象,否则删除最头部的元素,然后插入尾部最新的元素
  4. 添加一个访问get方法,首先判断是否存在这个对象,如果不存在返回空的对象,否则,先获取这个对象保存起来,然后删除这个对象,接着插入这个对象,保证最新访问。

总结

通过对LRU(最近最久未使用)的实际说明和举例子,大家对其内部的设计和原理肯定有了一定的认识,大家可以根据我的分步骤讲解具体的设计一个LRU的例子,谢谢各位的观看,有疑问评论区见。ok