我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!
介绍
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))
- 构造一个函数,参数是LRU的最大存储空间大小
- 构造函数初始化的设计一map对象保存所有的键值对,使用size标记最大的存储空间
- 添加一个push方法,用于存储最新添加的对象,此处需要灵活的判断,首先我们需要判断这个对象十分存在这个map中,如果存在,需要删除这个对象,让后重新添加,因为我们访问了这个对象,始终让访问的插入到最后面。如果不存在,判断是否map的存储空间满了,如果未满额直接添加这个对象,否则删除最头部的元素,然后插入尾部最新的元素
- 添加一个访问get方法,首先判断是否存在这个对象,如果不存在返回空的对象,否则,先获取这个对象保存起来,然后删除这个对象,接着插入这个对象,保证最新访问。
总结
通过对LRU(最近最久未使用)的实际说明和举例子,大家对其内部的设计和原理肯定有了一定的认识,大家可以根据我的分步骤讲解具体的设计一个LRU的例子,谢谢各位的观看,有疑问评论区见。ok