首页 > 其他分享 >LRU的实现

LRU的实现

时间:2023-08-29 12:37:03浏览次数:112  
标签:ump get 实现 cache list lst LRU key


LRU作为页面置换算法和Redis内存淘汰策略,是很重要的一种算法,在面试中经常要求手写,下面使用list+unordered_map实现了LRU

class LRUCache {
public:
	int sz;
	// list存储所有的key和value
	list<pair<int, int>> lst;
	// 存储每一个key在list中的结点位置(便于list删除结点)
	unordered_map<int, list<pair<int, int>>::iterator> ump;
	LRUCache(int capacity) {
		sz = capacity;
	}

	int get(int key) {
		// get的时候如果结点已存在,那么需要把结点移动到list头部
		if (ump.find(key) != ump.end())
		{
			put(key, ump[key]->second);
			return ump[key]->second;
		}
		else
			return -1;
	}

	void put(int key, int value) {
		// 如果key已经在list中了,先删除该节点
		if (ump.find(key) != ump.end())
		{
			lst.erase(ump[key]);
		}
		// 如果list容量已满,则删除list尾部的结点
		else if (lst.size() >= sz)
		{
			ump.erase(lst.back().first);
			lst.pop_back();
		}
		// 把新的结点添加到list头部
		lst.push_front({ key, value});
		// 保存头结点到map中
		ump[key] = lst.begin();
	}
};

// test
LRUCache cache(2);

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // returns 1
cache.put(3, 3);    // evicts key 2
cache.get(2);       // returns -1 (not found)
cache.put(4, 4);    // evicts key 1
cache.get(1);       // returns -1 (not found)
cache.get(3);       // returns 3
cache.get(4);       // returns 4


标签:ump,get,实现,cache,list,lst,LRU,key
From: https://blog.51cto.com/u_6526235/7274727

相关文章

  • String类的实现
    classmyString{public: myString(constchar*str=nullptr){ data=newchar[strlen(str)+1]; strcpy(data,str); } myString(constmyString&str){ if(this!=&str)//和自己比较 { //深拷贝,重新申请空间 data=newchar[strlen(str.data)+1];......
  • redis分布式锁,setnx+lua脚本的java实现 | 京东物流技术团队
    1前言在现在工作中,为保障服务的高可用,应对单点故障、负载量过大等单机部署带来的问题,生产环境常用多机部署。为解决多机房部署导致的数据不一致问题,我们常会选择用分布式锁。目前其他比较常见的实现方案我列举在下面:基于缓存实现分布式锁(本文主要使用redis实现)基于数据库实现分布......
  • 加密狗能实现什么功能?
    加密狗主要作用是给软件做加密和授权,防止逆向,配合软件的销售模式实现限时、限次、限制功能等,目前新一代的加密狗要具备以下功能!第一,安全加壳配合加密锁快速集成软件,加密锁厂商需要提供加壳工具保护软件代码的安全,防止被反编译。例如深盾科技的精锐5加密锁配套的加壳工具(VirboxPro......
  • 从零开始:开发高效直播带货系统源码的关键步骤与源码实现
    直播带货系统结合了实时互动和购物体验,为品牌和消费者之间建立了更紧密的联系。本文将介绍开发高效直播带货系统的关键步骤,并深入探讨其中的源码实现。第一步:项目规划与架构设计在开发直播带货系统之前,首先需要进行全面的项目规划与架构设计。这包括明确系统的功能需求、用户角色、......
  • 【数据结构与算法】TypeScript 实现图结构
    classGrapg<T>{//用于存储所有的顶点verteces:T[]=[];//用于存储所有的边采用邻接表的形式adjList:Map<T,T[]>=newMap();//添加顶点addVertex(v:T){this.verteces.push(v);//初始化顶点的邻接表this.adjList.set(v,[]);}......
  • Java 15 JSTL实现登录退出
     jstl.jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%--if--%><%@taglibprefix="fmt"uri=&......
  • RTSP/Onvif协议EasyNVR安防视频云平台配置录像阈值实现边删边录需求的具体操作步骤
    EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台,可提供丰富且灵活的视频能力,包括:设备接入、实时视频直播、录像、云存储、录像回放与检索等功能,也能支持GB28181协议进行平台级联。有很多用户咨询我们,在EasyNVR使用过程中,当开启录像时,如果磁盘的存储空间满了,就......
  • Karmada 结合 coreDNS 插件实现跨集群统一域名访问
    本文分享自华为云社区《Karmada结合coreDNS插件实现跨集群统一域名访问》,作者:云容器大未来。在多云与混合云越来越成为企业标配的今天,服务的部署和访问往往不在一个K8s集群中。如何做到服务访问与集群无关,成为了各个云服务提供商必须要面对的问题。本文基于Karmadav1.6.1版......
  • 加密狗能实现什么功能?
    加密狗主要作用是给软件做加密和授权,防止盗版,配合软件的销售模式实现限时、限次、限制功能等,目前新一代的加密狗要具备以下功能!加密锁第一,安全加壳配合加密锁快速集成软件,加密锁厂商需要提供加壳工具保护软件代码的安全,防止被反编译。例如深盾科技的精锐5加密锁配套的加壳......
  • 购物系统分析与实现 - Java编程案例
    目录1.购物系统分析2.实现购物系统2.1程序入口2.2菜单显示2.3用户输入2.4计算购买数量和剩余金额2.5结果输出3.执行购物系统总结简介:本文将介绍一个简单的购物系统的实现,使用Java编程语言来实现一个基于控制台的购物系统。通过这个实例,我们可以学习如何进行用户输入、条件......