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

LRU与LFU的c++实现

LRU 是时间维度上最少使用 维持一个链表,最近使用的放在表头 淘汰表尾
LFU 是实际使用频率的最少使用 每一个对应的频率维持一个链表, 淘汰最低频率的最后一个

1. LRU
LRU(Least Recently Used,最近最少使用)是一种常用的缓存淘汰算法。
LRU算法基于时间局部性原理,认为最近使用的数据很可能在近期内再次被使用,而最久未使用的数据很可能是不再使用的数据,因此将最久未使用的数据淘汰出缓存。

每个缓存项都会在链表中维护一个链表节点,并在哈希表中以缓存键为键存储对应的节点地址。当需要访问缓存项时,如果该项已经存在于缓存中,就将其移到链表的头部;如果该项不存在于缓存中,则将其加入缓存,并放置在链表的头部。当缓存容量达到上限并且需要淘汰数据时,就将链表尾部的元素移除。

#include <list>
#include <utility>
class Solution {private: list<pair<int, int>> cache_list;  // 实际数据位置unordered_map<int, list<pair<int,int>>::iterator>cache_map; // 索引, 指向列表中实际的数据存储位置int capacity;
public:Solution(int capacity){this->capacity = capacity;}int get(int key) {if(cache_map.find(key)!=cache_map.end()){auto it = cache_map[key];pair<int, int>cur = *it;cache_list.erase(it);     // 被get或者set 就数值移动到list 头部cache_list.push_front(cur);cache_map[key] = cache_list.begin();return cur.second;}return -1;}void set(int key, int value){if(cache_map.find(key)!=cache_map.end()){auto it = cache_map[key];cache_list.erase(it);}else if(cache_list.size() >= capacity){cache_map.erase(cache_list.back().first);  //list中的最后一个肯定是最近最少使用cache_list.pop_back();}pair<int, int>cur = make_pair(key, value);cache_list.push_front(cur);cache_map[key] = cache_list.begin();}
};

2. LFU
LFU(Least Frequently Used,最不经常使用)是一种常用的缓存淘汰算法。LFU算法基于访问频率原理,认为被访问频率最低的数据很可能是不再使用的数据,因此将访问频率最低的数据淘汰出缓存。

#include <list>
class Solution {struct Node{ int key;int value;int frequency;list<int>::iterator it;   // 指向频率队列中这个节点的位置 用于清除这个元素};private:unordered_map<int, Node>cache_map; // 既是索引又是数据存储位置unordered_map<int, list<int>>cache_list; //只是为了记录淘汰顺序的map int 为频率, list存着对应这个频率的队列int capcity;int min_f;   // 当前的最小频率public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** lfu design* @param operators int整型vector<vector<>> ops* @param k int整型 the k* @return int整型vector*/vector<int> LFU(vector<vector<int> >& operators, int k) {vector<int>result;setCapcity(k);cout <<"start"<<endl;for(int i=0; i<operators.size(); i++){cout << operators[i][0] <<endl;if(operators[i][0] == 1){cout << "插入: " <<" key: " << operators[i][1] <<" value: " << operators[i][2] <<endl;set(operators[i][1], operators[i][2]);}else{int r = get(operators[i][1]);result.push_back(r);cout << "返回: " <<" key: " << operators[i][1] <<" value: " << r <<endl;;}}return result;}void setCapcity (int capcity){this->capcity = capcity;}int get(int key){if(cache_map.find(key) != cache_map.end()){update(cache_map[key]);return cache_map[key].value;}return -1;}void set(int key, int value){if(cache_map.find(key) != cache_map.end()){Node &node = cache_map[key];   // 命中缓存,修改数值update(node);     // 去更新node在频率列表中的位置 node.frequency += 1;  // 更改缓存cache_map[key] = node;  装回缓存return;}if(cache_map.size() == capcity){   int key = cache_list[min_f].back(); // 清除最低频率的最后一个元素cache_map.erase(key);            cache_list[min_f].pop_back();}Node node;node.key = key;node.value = value;node.frequency = 1;cache_list[1].push_front(key);node.it = cache_list[1].begin();min_f = 1;   //装入一个新的元素,最低频率更新为1cache_map[key] = node;}void update(Node &node){int old_f = node.frequency;int new_f = old_f + 1;cache_list[old_f].erase(node.it);cache_list[new_f].push_front(node.key);node.it = cache_list[new_f].begin();if(cache_list[old_f].empty() && old_f == min_f){   // 更新最小次数min_f = old_f+1;}}};

相关文章:

LRU与LFU的c++实现

LRU 是时间维度上最少使用 维持一个链表&#xff0c;最近使用的放在表头 淘汰表尾 LFU 是实际使用频率的最少使用 每一个对应的频率维持一个链表&#xff0c; 淘汰最低频率的最后一个 1. LRU LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;是一种常…...

什么是Docker和Docker-Compose?

Docker的构成 Docker仓库&#xff1a;https://hub.docker.com Docker自身组件 Docker Client&#xff1a;Docker的客户端 Docker Server&#xff1a;Docker daemon的主要组成部分&#xff0c;接受用户通过Docker Client发出的请求&#xff0c;并按照相应的路由规则实现路由分发…...

三.listview或tableviw显示

一.使用qt creator 转变类型 变形为listview或tableviw 二.导出ui文件为py文件 # from123.py 为导出 py文件 form.ui 为 qt creator创造的 ui 文件 pyuic5 -o x:\xxx\from123.py form.uifrom123.py listview # -*- coding: utf-8 -*-# Form implementation generated fro…...

【算法】一文带你从浅至深入门dp动态规划

文章目录 一、前言二、动态规划理论基础1、基本概念2、动态规划五部曲【✔】3、出错了如何排查&#xff1f; 三、实战演练&#x1f5e1;0x00 斐波那契数0x01 第N个泰波那契数0x02 爬楼梯0x03 三步问题0x04 使用最小花费爬楼梯⭐解法一解法二 0x05 解码方法* 四、总结与提炼 一、…...

超简单免费转换ape到flac

1. 安装最新版的ffmpeg 2. 安装cywin环境 3. 设置path到ffmpeg export PATH$PATH:"PATH/TO/FFMPEG/BIN" 4.到ape所在的目录&#xff0c;执行以下命令 find . -iname "*.ape" | while read line; do fb${line::-4}; fn"$fb.flac";echo ffm…...

JavaScript混淆加密

什么是JS混淆加密&#xff1f; JavaScript混淆加密是一种通过对源代码进行变换&#xff0c;使其变得难以理解和分析的技术。它的目标是增加攻击者破解代码的难度&#xff0c;同时保持代码的功能不受影响。混淆加密的目的是使代码难以逆向工程&#xff0c;从而防止攻击者窃取知…...

Java8特性-Lambda表达式

&#x1f4d5;概述 在Java 8中引入了Lambda表达式作为一项重要的语言特性&#xff0c;可以堪称是一种语法糖。Lambda表达式使得以函数式编程的方式解决问题变得更加简洁和便捷。 Lambda表达式的语法如下&#xff1a; (parameters) -> expression (参数) -> {代码}其中&…...

通过Power Platform自定义D365CE业务需求 - 1. Microsoft Power Apps 简介

Microsoft Power Apps是一个趋势性的、无代码和无代码的商业应用程序开发平台,配有一套应用程序、服务和连接器。其数据平台为构建适合任何业务需求的自定义业务应用程序提供了快速开发环境。随着无代码、少代码应用程序开发的引入,任何人都可以快速构建低代码应用程序,并与…...

简易实现QT中的virtualkeyboard及问题总结

文章目录 前言&#xff1a;一、虚拟键盘的实现综合代码 二、为什么选用QWidget而不适用QDialog实现键盘三、从窗体a拉起窗体b后&#xff0c;窗体b闪退问题的探讨四、关闭主窗口时子窗口未关闭的问题 前言&#xff1a; 本文章主要包含四部分&#xff1a; 虚拟键盘的实现&#…...

景联文科技可为多模态语音翻译模型提供数据采集支持

8月22日Facebook的母公司Meta Platforms发布了一种能够翻译和转录数十种语言的人工智能模型——SeamlessM4T&#xff0c;可以在日常生活中或者商务交流中为用户提供更便捷的翻译和转录服务。 相较于传统的文本翻译&#xff0c;这项技术的最大区别在于它可以实现端到端的语音翻译…...

定时器分批请求数据

<!DOCTYPE html> <html><script>//需要分页的数组let arr [1,2,3,4,5,6,7,8,9,10]//分割数组&#xff0c;每页3条splitArr(arr,4)/*** 分割数组*/function splitArr(idList,size){//当前页数let num 1//共多少页let count Math.ceil(idList.length / siz…...

【华为OD机试python】报数游戏【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 100个人围成一圈,每个人有一个编码,编号从1开始到100。 他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数, 直到剩余的人数小于M。 请问最后剩余的人在原先…...

【深度学习实战—6】:基于Pytorch的血细胞图像分类(通用型图像分类程序)

✨博客主页&#xff1a;米开朗琪罗~&#x1f388; ✨博主爱好&#xff1a;羽毛球&#x1f3f8; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深…...

华清远见第六课程day4作业

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …...

【广州华锐互动】AR远程智慧巡检在化工行业中的应用

AR远程智慧巡检是一种基于增强现实技术的新型巡检方式&#xff0c;它可以利用虚拟信息和现实场景的结合&#xff0c;实现对设备、工艺流程等方面的实时监测和识别。在化工行业中&#xff0c;AR远程智慧巡检具有广泛的应用前景&#xff0c;可以提高生产效率和安全性。 一、设备巡…...

easyui-sidemenu 菜单 后台加载

前言 一个项目的功能较齐全&#xff0c;而齐全就预示着功能菜单比较长&#xff0c;但是现实中在不同的甲方使用中往往只需要摘取其中几项功能&#xff0c;所以就想到用配置菜单以满足其需求&#xff0c;且无需变更原始代码&#xff0c;查找一些资料总是似是而非或是誊抄别的什…...

Python总结上传图片到服务器并保存的两种方式

一、前言 图片保存到服务器的两种方法&#xff1a; 1、根据图片的 URL 将其保存到服务器的固定位置 2、根据 request.FILES.get("file") 方式从请求中获取上传的图片文件&#xff0c;并将其保存到服务器的固定位置 二、方法 1、图片的 URL 要根据图片的 URL 将…...

【ETH】以太坊合约智能合约逆向方案

技术角度了解区块链 区块链技术逆袭专栏 文章目录 区块链技术逆袭专栏获取合约代码逆向工具方案1方案2实操演示:获取合约代码 在反编译之前,你需要先知道如果获取编译后的字节码。 这里以 USDT 举例 eth.getCode(0xdAC17F958D2ee523a2206206994597C13D831ec7)字节码: 0x…...

C高级Day5

课后作业&#xff1a; rootlinux:~/shell# cat qh.sh #!/bin/bash function sum_array() {local brr($*) local sum0for i in ${brr[*]} dosum$((sum i))doneecho $sum } arr(1 2 3 4 5) result$(sum_array ${arr[*]}) echo "数组的和为: $result"#!/bin/bash fun…...

AI绘画:Midjourney超详细教程Al表情包超简单制作,内附关键词和变现方式

大家好&#xff0c;本篇文章主要介绍AI绘画完成表情包的制作和变现方式分享。 你还不会AI表情包制作吗&#xff1f;下面我们详细的拆解制作过程。跟着这个教程做出一套属于自己的表情包。 核心工具Midjourney PS&#xff0c;你就可以得到一套自己的专属表情包啦~ 整体制作…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...