题目链接
题目要求使用O(1)的Get、Put方法实现LFU缓存
LFU缓存是基于LRU缓存的一个优化,使用频次优化元素命中情况,进一步提高命中率,其余概念不再赘述
基本思路:使用一个双端链表+两个HashMap实现
双端列表存储原始数据、数据在HashMap的key、数据的访问频率
第一个HashMap与LRU的实现类似,存储Key对应链表元素指针,以O(1)的效率定位元素
第二个HashMap用以存储每个访问频率对应的元素集合中最近访问的那个
例:
Put 1 1
Put 2 2
Put 3 3
Get 1
经过三个操作后,第二个HasMap内容如下:
key(访问频率) | value(链表内元素指针) |
---|---|
2 | 元素1 |
1 | 元素3(因为它访问时间晚于2号) |
具体实现可以参考代码注释
Runtime: 132 ms (beats 80.6%)
Memory Usage: 16 MB
type dataItem struct {
value int
keyInList int
frequency int
}
type LFUCache struct {
// 存储每个key对应的链表内指针
listHashMap map[int]*list.Element
// 存储每个访问频率中最新的元素在链表内的指针
frequencyHashMap map[int]*list.Element
// 原始链表
linkList *list.List
cap int
}
func Constructor(capacity int) LFUCache {
return LFUCache{
make(map[int]*list.Element),
make(map[int]*list.Element),
list.New(),
capacity