公众号merlinsea
- 相关内容导航
LRU最近最少使用算法
奔跑的小梁,公众号:梁霖编程工具库golang实现lru缓存
- 题目描述
- LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象
- int get(int key) - 如果键 key 存在于缓存中,则获取键的值,否则返回 -1
- void put(int key, int value) - 如果键 key 已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量 capacity 时,则应该在插入新项之前,移除最不经常使用的项。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 最近最久未使用 的键
- 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
- LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象
- 示例
- 解题思路
- 参考之前求解LRU的算法思路,改动点是当访问了某个key的时候,这个key需要移动到一个“合适”的位置,这里的合适指的是要按照每个key的访问频次来排序,当频次相同的访问时间越近的key优先级越高。
- 参考之前求解LRU的算法思路,改动点是当访问了某个key的时候,这个key需要移动到一个“合适”的位置,这里的合适指的是要按照每个key的访问频次来排序,当频次相同的访问时间越近的key优先级越高。
- 代码实现
- 代码优化思路
- 可以将双向链表做成优先队列,通过优先队列可以保证每次删除的时间复杂度是logn级别,在本次的代码中,在极端的情况下,比如LFU的容量做的无限大的时候,不断进行put操作,会导致move方法的时间复杂度是On
- 可以将双向链表做成优先队列,通过优先队列可以保证每次删除的时间复杂度是logn级别,在本次的代码中,在极端的情况下,比如LFU的容量做的无限大的时候,不断进行put操作,会导致move方法的时间复杂度是On
golang版本永久算法题训练营本年最低价~
奔跑的小梁,公众号:梁霖编程工具库