8.13 146. LRU 缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache
类:
LRUCache(int capacity)
以 正整数 作为容量capacity
初始化 LRU 缓存int get(int key)
如果关键字key
存在于缓存中,则返回关键字的值,否则返回-1
。void put(int key, int value)
如果关键字key
已经存在,则变更其数据值value
;如果不存在,则向缓存中插入该组key-value
。如果插入操作导致关键字数量超过capacity
,则应该 逐出 最久未使用的关键字。
函数 get
和 put
必须以 O(1)
的平均时间复杂度运行。
我的思路:因为这个是链表专题里面的,所以一直在思考怎么用链表写,一直没有思考出来撒,然后我就觉得map也很合适,我就用的map。
初始化:初始化限定的长度以及一个map
get:如果链表里面没有->返回-1,有的话就要先删除它,再set它,记得返回,因为map是有序的,set是插入到末尾
put:put的话也要看是否有值,有->删除+set,没有的话要判断长度,如果长度超过了限定长度的话就要进行删除操作,删除的就是第一个
this.cache.keys().next().value; //获取第一个的值
我的代码:
var LRUCache = function(capacity) {
this.len = capacity;
this.cache = new Map();
};
/**
* @param {number} key
* @return {number}
*/
LRUCache.prototype.get = function(key) {
// 如果没有的话就返回-1
if(!this.cache.has(key)){
return -1;
}else {
const temp = this.cache.get(key);
// 有的话需要放在最顶端而且返回值
this.cache.delete(key);
this.cache.set(key,temp);
return temp;
}
};
/**
* @param {number} key
* @param {number} value
* @return {void}
*/
LRUCache.prototype.put = function(key, value) {
// put要看有没有值,有值的话要改变顺序加改变值
if(this.cache.has(key)){
// 如果有这个值
// 先删除旧的
this.cache.delete(key);
}else {
// 没有这个值
if(this.cache.size >= this.len){
const firstKey = this.cache.keys().next().value;
// 删除最久未使用的项
this.cache.delete(firstKey);
}
}
this.cache.set(key, value);
};
总结:
这段代码实现了一个 LRU(最近最少使用)缓存机制,使用 Map 来存储键值对并利用其有序性来追踪访问顺序。在 get 操作中,如果 key 存在,会先删除再重新插入该键值对,以更新其访问顺序,然后返回值;如果不存在则返回 -1。在 put 操作中,如果 key 已存在,会先删除旧项再插入新值以更新顺序;如果 key 不存在且缓存已满,会删除 Map 中第一个最久未使用的项,然后再插入新数据。这样保证了缓存容量不超过设定值,同时总是淘汰最久未使用的数据。