当前位置: 首页 > news >正文

NC设计LFU缓存结构

系列文章目录


文章目录

  • 系列文章目录
  • 前言


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


描述
一个缓存结构需要实现如下功能。
set(key, value):将记录(key, value)插入该结构
get(key):返回key对应的value值
但是缓存结构中最多放K条记录,如果新的第K+1条记录要加入,就需要根据策略删掉一条记录,然后才能把新记录加入。这个策略为:在缓存结构的K条记录中,哪一个key从进入缓存结构的时刻开始,被调用set或者get的次数最少,就删掉这个key的记录;
如果调用次数最少的key有多个,上次调用发生最早的key被删除
这就是LFU缓存替换算法。实现这个结构,K作为参数给出

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

对于每个操作2,返回一个答案
在这里插入图片描述

import java.util.*;
public class Solution {//设置节点结构static class Node{ int freq;int key;int val;//初始化public Node(int freq, int key, int val) {this.freq = freq;this.key = key;this.val = val;}}//频率到双向链表的哈希表private Map<Integer, LinkedList<Node> > freq_mp = new HashMap<>();//key到节点的哈希表private Map<Integer, Node> mp = new HashMap<>();//记录缓存剩余容量private int size = 0; //记录当前最小频次private int min_freq = 0;public int[] LFU (int[][] operators, int k) {//构建初始化连接//链表剩余大小this.size = k;//获取操作数int len = (int)Arrays.stream(operators).filter(x -> x[0] == 2).count();int[] res = new int[len];//遍历所有操作for(int i = 0, j = 0; i < operators.length; i++){if(operators[i][0] == 1)//set操作set(operators[i][1], operators[i][2]);else//get操作res[j++] = get(operators[i][1]);}return res;}//调用函数时更新频率或者val值private void update(Node node, int key, int value) { //找到频率int freq = node.freq;//原频率中删除该节点freq_mp.get(freq).remove(node); //哈希表中该频率已无节点,直接删除if(freq_mp.get(freq).isEmpty()){ freq_mp.remove(freq);//若当前频率为最小,最小频率加1if(min_freq == freq) min_freq++;}if(!freq_mp.containsKey(freq + 1))freq_mp.put(freq + 1, new LinkedList<Node>());//插入频率加一的双向链表表头,链表中对应:freq key valuefreq_mp.get(freq + 1).addFirst(new Node(freq + 1, key, value)); mp.put(key, freq_mp.get(freq + 1).getFirst());}//set操作函数private void set(int key, int value) {//在哈希表中找到key值if(mp.containsKey(key)) //若是哈希表中有,则更新值与频率update(mp.get(key), key, value);else{ //哈希表中没有,即链表中没有if(size == 0){//满容量取频率最低且最早的删掉int oldkey = freq_mp.get(min_freq).getLast().key; //频率哈希表的链表中删除freq_mp.get(min_freq).removeLast(); if(freq_mp.get(min_freq).isEmpty()) freq_mp.remove(min_freq); //链表哈希表中删除mp.remove(oldkey); }//若有空闲则直接加入,容量减1else size--; //最小频率置为1min_freq = 1; //在频率为1的双向链表表头插入该键if(!freq_mp.containsKey(1))freq_mp.put(1, new LinkedList<Node>());freq_mp.get(1).addFirst(new Node(1, key, value)); //哈希表key值指向链表中该位置mp.put(key, freq_mp.get(1).getFirst()); }}//get操作函数private int get(int key) {int res = -1;//查找哈希表if(mp.containsKey(key)){ Node node = mp.get(key);//根据哈希表直接获取值res = node.val;//更新频率 update(node, key, res); }return res;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙OS试题
  • three.js 着色器学习 聚集地
  • Ubuntu 20.04 源码编译安装OpenCV 4.5
  • stm32启动文件
  • 信贷业务流程优化与风控系统深度集成
  • popen和fgets函数
  • 一道ssrf题目--Web-ssrfme
  • vue3 composition 模式下watch object
  • 软考架构-构件技术
  • 高亮你的文字:CSS ::selection 伪元素的魔法
  • 关于springboot对接通义千问大模型的尝试(一)
  • 【Docker】Docker 的基本概念和优势简介
  • 数据库和缓存不一致的问题及解决方案
  • Redis篇三:在Ubuntu下安装Redis
  • Python生成JMeter测试脚本----HTTP信息头管理器和用户定义的变量
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  •  D - 粉碎叛乱F - 其他起义
  • java多线程
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Node + FFmpeg 实现Canvas动画导出视频
  • Vultr 教程目录
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 判断客户端类型,Android,iOS,PC
  • 前端之Sass/Scss实战笔记
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用parted解决大于2T的磁盘分区
  • 思否第一天
  • 思考 CSS 架构
  • 主流的CSS水平和垂直居中技术大全
  • NLPIR智能语义技术让大数据挖掘更简单
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (02)Unity使用在线AI大模型(调用Python)
  • (160)时序收敛--->(10)时序收敛十
  • (待修改)PyG安装步骤
  • (二)Eureka服务搭建,服务注册,服务发现
  • (分布式缓存)Redis持久化
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (小白学Java)Java简介和基本配置
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • .htaccess配置重写url引擎
  • .net CHARTING图表控件下载地址
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET运行机制
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • .考试倒计时43天!来提分啦!
  • @Bean注解详解
  • @SuppressWarnings(unchecked)代码的作用
  • @开发者,一文搞懂什么是 C# 计时器!