面试题答案
一键面试优化思路
在LFU基础上,当存在多个使用频率相同且最低的元素时,可以按照元素进入缓存的先后顺序来选择淘汰对象。即优先淘汰最早进入缓存的元素,这类似于FIFO(先进先出)的策略。
数据结构设计
- 双向链表:用于维护元素的访问顺序。每个节点包含元素值、频率以及指向前驱和后继节点的指针。
- 哈希表:用于快速定位双向链表中的节点。键为元素的键,值为双向链表中对应节点的指针。
- 频率表:是一个哈希表,键为频率,值为双向链表,该双向链表存储所有具有该频率的元素节点。
关键操作及时间复杂度
- 插入操作(put(key, value)):
- 若缓存已满且要插入新元素,先找到频率最低的双向链表(频率表中最小频率对应的链表)。
- 如果该链表长度大于1,淘汰链表头部元素(最早进入的),更新哈希表和频率表。
- 若插入的是新元素,将其频率设为1并插入到频率为1的双向链表头部,同时更新哈希表和频率表。时间复杂度:O(1)。
- 获取操作(get(key)):
- 通过哈希表快速定位元素所在的双向链表节点。
- 将该节点从当前频率的双向链表中移除,频率加1,插入到新频率对应的双向链表头部,更新哈希表和频率表。时间复杂度:O(1)。