回答
无
分析
标准实现:使用双向链表+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); }}// testconst 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 cacheconsole.log(cache.get(2)); // return null
参考资料
- 每周算法-缓存置换算法 [https://juejin.im/post/6844903928945967111]