首页 > 试题广场 >

设计LFU缓存结构

[编程题]设计LFU缓存结构
  • 热度指数:25698 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
一个缓存结构需要实现如下功能。
  • set(key, value):将记录(key, value)插入该结构
  • get(key):返回key对应的value值
但是缓存结构中最多放K条记录,如果新的第K+1条记录要加入,就需要根据策略删掉一条记录,然后才能把新记录加入。这个策略为:在缓存结构的K条记录中,哪一个key从进入缓存结构的时刻开始,被调用set或者get的次数最少,就删掉这个key的记录;
如果调用次数最少的key有多个,上次调用发生最早的key被删除
这就是LFU缓存替换算法。实现这个结构,K作为参数给出

数据范围:
要求:get和set的时间复杂度都是 ,空间复杂度是


若opt=1,接下来两个整数x, y,表示set(x, y)
若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1

对于每个操作2,返回一个答案
示例1

输入

[[1,1,1],[1,2,2],[1,3,2],[1,2,4],[1,3,5],[2,2],[1,4,4],[2,1]],3

输出

[4,-1]

说明

在执行"1 4 4"后,"1 1 1"被删除。因此第二次询问的答案为-1   

备注:

头像 牛客题解官
发表于 2022-04-22 13:13:13
精华题解 题目的主要信息: 实现LFU的set与get函数,且复杂度为O(1)O(1)O(1) 每次调用这两个函数会给一个频率赋值,超出长度则移除频率最少的,若有频率相同,则移除访问时间最早的 举一反三: 学习完本题的思路你可以解决如下题目: BM100. 设计LRU缓存结构 方法:双哈希表(推荐使用) 展开全文
头像 子夜降晴空
发表于 2021-03-29 12:47:46
class Solution { private: typedef list<vector<int> > vecList; //定义元素为向量的双向链表,向量里为[频次,键,值] unordered_map<int, vecList> freq_m 展开全文
头像 LifelongCode
发表于 2021-06-02 18:52:42
LFU算法:least frequently used,最近最不经常使用算法; 如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。 set(key,value):将记录(key,value)插入该结构。当缓存满时,将访 展开全文
头像 LaN666
发表于 2021-07-28 12:51:04
题目介绍 一个缓存结构需要实现如下功能。set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值但是缓存结构中最多放K条记录,如果新的第K+1条记录要加入,就需要根据策略删掉一条记录,然后才能把新记录加入。这个策略为:在缓存结构的K条记录 展开全文
头像 godhands
发表于 2022-02-12 19:56:29
描述 题目描述 首先我们先介绍一下这个LFU缓存结构在这个题目里面是如何考察的 首先他是有两个功能,第一个功能就是插入 那么我们这个功能要插入的是一个键值对,这里题目有地方描述的不是太清楚,这里我们默认他插入的时候,如果以前存在这个键值key,我们进行更新,如果不存在的话,我们再进行插入,然后插入有 展开全文
头像 宫水三叶的刷题日记
发表于 2021-07-07 13:47:20
基本分析 前两天我们刚讲过 NC 93 设计LRU缓存结构,简单理解 LRU 就是「移除最久不被使用的元素」。 因此对于 LRU 我们只需要在使用「哈希表」的同时,维护一个「双向链表」即可: 每次发生 get 或 put 的时候就将元素存放双向链表头部 当需要移除元素时,则从双向链表尾部开始移除 展开全文
头像 勤奋的猫
发表于 2022-05-28 04:41:08
import java.util.*; class Node {//节点(数据单元)     int key ;     int val ; &n 展开全文
头像 fred-coder
发表于 2022-01-31 14:58:41
设置 dict 记录 key-val 值,设置 cap 记录容量; 根据调用次数和调用次序进行排序,得出最终的最小key. # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # lfu design # @param operators int整型二维数组 op 展开全文
头像 牛牛想要一个面试
发表于 2023-01-31 21:37:12
解题思路:使用双哈希表 set + map使用map存储key和其所有的信息node,包括key值、频率、值、最近使用时间点使用set从小到大存储node,node根据频率和时间点进行排序,频率不相等则根据频率大小进行排序,频率相等则根据时间大小进行排序,时间大的说明使用时间更近。 #include 展开全文
头像 黑猫爱小鹿
发表于 2021-09-26 16:03:41
class Solution { public: /** * lfu design * @param operators int整型vector<vector<>> ops * @param k int整型 the k * @r 展开全文
头像 空中转体一周半
发表于 2022-05-15 18:44:01
使用LinkedHashMap,每次调用之后,删除再加入这个K-V,就能保证是最新操作的在前面了。需要注意的是,每次操作put操作需要分成三个类别:1、k已存在;2、k不存在且未达到最大容量;3、k不存在且已经达到最大容量。其中第三种需要找出最少使用且最久的Bolck(笔者在这里没有使用O(lgn) 展开全文