MST

星途 面试题库

面试题:缓存设计中的LFU算法优化

在LFU(最不经常使用)缓存淘汰算法基础上,假设缓存空间已满且要插入新元素,若存在多个使用频率相同且最低的元素,如何优化算法以选择最合适的淘汰对象,并且设计一个数据结构来高效支持这种优化后的LFU算法,阐述设计思路和关键操作的时间复杂度。
35.3万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

优化思路

在LFU基础上,当存在多个使用频率相同且最低的元素时,可以按照元素进入缓存的先后顺序来选择淘汰对象。即优先淘汰最早进入缓存的元素,这类似于FIFO(先进先出)的策略。

数据结构设计

  1. 双向链表:用于维护元素的访问顺序。每个节点包含元素值、频率以及指向前驱和后继节点的指针。
  2. 哈希表:用于快速定位双向链表中的节点。键为元素的键,值为双向链表中对应节点的指针。
  3. 频率表:是一个哈希表,键为频率,值为双向链表,该双向链表存储所有具有该频率的元素节点。

关键操作及时间复杂度

  1. 插入操作(put(key, value))
    • 若缓存已满且要插入新元素,先找到频率最低的双向链表(频率表中最小频率对应的链表)。
    • 如果该链表长度大于1,淘汰链表头部元素(最早进入的),更新哈希表和频率表。
    • 若插入的是新元素,将其频率设为1并插入到频率为1的双向链表头部,同时更新哈希表和频率表。时间复杂度:O(1)。
  2. 获取操作(get(key))
    • 通过哈希表快速定位元素所在的双向链表节点。
    • 将该节点从当前频率的双向链表中移除,频率加1,插入到新频率对应的双向链表头部,更新哈希表和频率表。时间复杂度:O(1)。