LFU算法

LFU算法LFU 算法 淘汰访问频次最低的元素 如果访问频次最低的数据有多条 则需要淘汰最旧的数据 classLFUCach 存放 key 到 val 的映射 HashMap Integer Integer keyToVal newHashMap lt gt 存放 key 到使用频次 freq 的映射 HashMap Integer Integer keyToFreq newHashMap Integer Integer Integer Integer

图示

/* * LFU 算法:淘汰访问频次最低的元素,如果访问频次最低的数据有多条,则需要淘汰最旧的数据。 * */ class LFUCache { 
    // 存放 key 到 val 的映射 HashMap<Integer, Integer> keyToVal = new HashMap<>(); // 存放 key 到 使用频次freq 的映射 HashMap<Integer, Integer> keyToFreq = new HashMap<>(); // 使用频次freq 到 key 列表的映射。用于删除最久未使用的 key(即链表头的 key) HashMap<Integer, LinkedHashSet<Integer>> freqToKeys = new HashMap<>(); // 记录最小的频次 int minFreq = 0; // 记录 LFU 缓存的最大容量 int capacity; public LFUCache(int capacity){ 
    this.capacity = capacity; } public int get(int key){ 
    // 如果不存在 key if(!keyToVal.containsKey(key)){ 
    return -1; } // 增加 key 对应的 freq increaseFreq(key); return keyToVal.get(key); } public void put(int key, int val){ 
    if(capacity <= 0){ 
    return; } // 如果 key 已经存在,那么修改对应的 value 即可 if(keyToVal.containsKey(key)){ 
    keyToVal.put(key, val); // key 对应的 freq 加 1 increaseFreq(key); return; } // 如果 key 不存在,需要插入 // 容量已满的话需要淘汰一个 freq 最小的 key if(capacity == keyToVal.size()){ 
    removeMinFreqKey(); } // 插入 key 和 value,对应的 freq 为 1 keyToVal.put(key, val); keyToFreq.put(key, 1); freqToKeys.putIfAbsent(1, new LinkedHashSet<>()); freqToKeys.get(1).add(key); // 插入新的 key 后最小的 freq 肯定是 1 minFreq = 1; } // 增加 key 对应的 freq public void increaseFreq(int key){ 
    int freq = keyToFreq.get(key); // 更新 keyToFreq 表。使用频次 + 1 keyToFreq.put(key, freq + 1); // 更新 freqToKeys 表。 // 将 key 从 freq 对应的列表中删除 freqToKeys.get(freq).remove(key); // 将 key 加入 freq+1 对应的列表中 freqToKeys.putIfAbsent(freq + 1, new LinkedHashSet<>()); freqToKeys.get(freq + 1).add(key); // 如果 freq 对应的列表空了,移除这个 freq if(freqToKeys.get(freq).isEmpty()){ 
    freqToKeys.remove(freq); // 如果这个 freq 恰好是 minFreq,更新 minFreq if(freq == minFreq){ 
    minFreq++; } } } // 淘汰一个 freq 最小的 key public void removeMinFreqKey(){ 
    // 得到 freq 最小时对应的 key 列表 LinkedHashSet<Integer> keyList = freqToKeys.get(minFreq); // 最先被插入的那个 key(也就是最长时间没有使用过的 key,即链表头部的 key)就是该被淘汰的 key int deleteKey = keyList.iterator().next(); keyList.remove(deleteKey); if(keyList.isEmpty()){ 
    freqToKeys.remove(minFreq); freqToKeys.remove(minFreq); // 如果freq 对应的 key 列表空了,此时需要移除这个 freq,因为此时的 freq 就是 minFreq,因此 minFreq 需要加 1。 // 但其实没有下面这行代码也可以。因为只有在 put 方法插入 key 的时候才有可能调用 removeMinFreqKey() 方法,而在 put() 方法 // 中,插入新的 key 时一定会把 minFreq 更新变成 1,因此说即使这里 minFreq 变了,我们也不需要管它。 minFreq++; } keyToVal.remove(deleteKey); keyToFreq.remove(deleteKey); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232778.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tf.placeholder() is not compatible with eager execution的解决方法「建议收藏」

    tf.placeholder() is not compatible with eager execution的解决方法「建议收藏」最近安装了TensoFlow2.0及以上的版本都发现啊出现这个问题:RuntimeError:tf.placeholder()isnotcompatiblewitheagerexecution.这是因为在运行**tf.compat.v1.placeholder(dtype,shape=None,name=None)**的时候急切执行了这条语句,但是我们一般都是在一…

    2022年7月13日
    11
  • 深度相机 结构光_结构光三维成像原理

    深度相机 结构光_结构光三维成像原理版权声明:本文为博主原创文章,未经博主允许不得转载。违者必究。 https://blog.csdn.net/electech6/article/details/78707839 &lt;/div&gt; &lt;linkrel="styles…

    2025年7月20日
    3
  • fcos调研

    fcos调研有权重 https github com tianzhi0549 FCOS 这个有测试代码 https github com Stick To Object Detection API Tensorflow 介绍的 https blog csdn net qiu article details

    2025年8月12日
    0
  • DHCP协议原理及应用[通俗易懂]

    DHCP协议原理及应用[通俗易懂]DHCP:动态主机配置协议   TCP/IP协议想要运行正常的话,网络中的主机和路由器不可避免地需要配置一些信息(如接口的IP地址等)。有了这些配置信息主机/路由器才能提供/使用特定的网络服务。   主机信息的必要元素有:IP地址、子网掩码、DNS服务器IP地址   TCP/IP协议配置主机信息主要有三种方法: 1.手动配置 2.动态获取 3.根据特定算法计算。

    2022年5月10日
    65
  • 手把手教你使用R语言做LASSO 回归

    手把手教你使用R语言做LASSO 回归LASSO回归也叫套索回归,是通过生成一个惩罚函数是回归模型中的变量系数进行压缩,达到防止过度拟合,解决严重共线性的问题,LASSO回归最先由英国人RobertTibshirani提出,目前在预测模型中应用非常广泛。在新格兰文献中,有大牛提出,对于变量过多而且变量数较少的模型拟合,首先要考虑使用LASSO惩罚函数。今天我们来讲讲怎么使用R语言通过LASSO回归构造预测模型。首先我们要下载R的glmnet包,由LASSO回归的发明人,斯坦福统计学家TrevorHastie领衔开发。加载

    2022年6月9日
    47
  • CentOS 7 SSH配置免密码登录

    CentOS 7 SSH配置免密码登录目的在搭建 Linux 集群服务的时候 主服务器需要启动从服务器的服务 如果通过手动启动 集群内服务器几台还好 要是像阿里 1000 台的云梯 hadoop 集群的话 轨迹启动一次集群就得几个工程师一两天时间 是不是很恐怖 如果使用免密登录 主服务器就能通过程序执行启动脚步 自动帮我们将从服务器的应用启动 而这一切就是建立在 ssh 服务的免密码登录之上的 所以要学习集群部署 就必须了解 linux 的免密码

    2025年7月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号