回答
无
分析
标准实现:使用双向链表+Map的组合
见参考资料。
JS 特有的简单实现,利用 Map 中 key 的有序性
// JS特有的最简单实现,利用Map中key的有序性
class LRUCache {
constructor(capacity: number) {
this.capacity = capacity;
this.dataMap = new Map();
}
// 数据存储,使用map,并且利用到map中key的有序性
dataMap: Map<any, any> = new Map();
// 缓存个数
capacity: number;
// 时间复杂度:O(1)
// 有额外的空间损失
get(key: any) {
// 仅在有此key的时候重写
if (this.dataMap.has(key)) {
// get算作使用一次,利用map中key的有序特性,重写一次key,则将key置于map的最后
let result = this.dataMap.get(key);
this.dataMap.delete(key);
this.dataMap.set(result, key);
return result;
}
}
// 时间复杂度:O(n),因为Map.keys()在底层需要遍历,虽然实现起来挺快的
put(key: any, value: any) {
// 检查是否已满
if (this.dataMap.size >= this.capacity) {
let deleteKey = [...this.dataMap.keys()][0];
this.dataMap.delete(deleteKey);
}
// 放入
this.dataMap.set(key, value);
}
}
// test
const cache = new LRUCache(2);
cache.put(1, "a");
cache.put(2, "b");
console.log(cache.get(1)); // return 'a'
cache.put(3, "c"); // remove 2 from cache
console.log(cache.get(2)); // return null
参考资料
- 每周算法-缓存置换算法 [https://juejin.im/post/6844903928945967111]