算法题-实现LRU缓存机制
题目
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。
实现 LRUCache 类:
- LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
- int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
- void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
示例:
1 | 输入 |
思路
- 使用 map 来实现 get(int key) 方法的 O(1) 时间复杂度
- 使用一个链表来维护数据的使用时间
- 当调用 put(int key, int value) 方法时,先无脑往 map 里添加数据,再判断大小是否超过 capacity,超过了就删除链表中最后一个元素
题解
1 | public class LRUCache { |
扩展
通过 LRU 如何实现一个 LFU?
思路
- 使用一个 Map<int, LFUNode> 来保存元素
- 再使用一个 Map<int, LRUNode> 维护使用频率,其中 key 为使用频率,value 为一个维护使用时间的链表
- 在 LFUNode 中需要存储当前元素的使用频率,在调取 get(int key) 方法时,将其从原链表移除,更新该node的频率并将其添加至新频率所在的链表