前言
直接上算法题:
LRU为最近最少使用算法,是一种内存数据淘汰策略,在实际开发中,当内存不足时,需要淘汰最近最少使用的数据,那么这种算法怎样实现的呢?
正文
这题有很多种思路,这里主要用map这种数据结构,为什么用map呢?因为map它的key可以是任意类型,且它的存储是有序的,我们可以利用map的性质,理清解题的思路。
思路
- 定义一个map数据结构,以及一个存储容量的变量。
- 借助map的size属性,轻而易举的可以知道它有没有达到存储的阈值,达到阈值就要删除(delete)最近最少使用的元素,且将新值放入(set)map中。
- 在这个方法的原型上定义两个方法,分别是在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}