Golang实现LRU Cache

LRU LFU 概念、底层原理及其实现 超详细~ 计算机的运行的程序和数据保存在内存中,内存的空间是有限的,所运行的程序可能需要新的数据,而数据不在内存,在磁盘(硬盘)中。CPU 访问的页面在物理内存时,便会产生一个缺页中断,请求操作系统将所缺页调⼊到物理内存。对于要新加入内存的页面,需要一定的算法来确定把哪个页面剔除出去给新的要加进来的页面让位。所以,页面置换算法的功能是,当出现缺页异常,需调入新页面而内存已满时,选择被置换的物理页面,也就是说选择⼀个物理页面换出到磁盘,然后把需要访问的页面换入到物理页。那其算法目标则是,尽可 阅读详情

146. LRU Cache

运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?

 

package leetcode

type node struct {
	key,val    int
	prev, next *node
}


type linkedLRUCache struct {
	capacity int
	head,tail *node
	cache map[int]*node
}



func LRUCache(capacity int) LRU {
	return &linkedLRUCache{capacity:capacity,cache:make(map[int]*node)}
}


type LRU interface {
	Get(key int) int
	Put(key, value int)
}


func (c *linkedLRUCache) Get(key int) int {
	if node,ok := c.cache[key]; ok {
		c.remove(node)
		c.add(node)
		return node.val
	}
	return -1
}


func (c *linkedLRUCache) Put(key, val int) {
	if n,ok := c.cache[key]; ok {
		c.remove(n)
		n.val = val
		c.add(n)
		return
	}else {
		n = &node{key: key,val:val}
		c.cache[key] = n
		c.add(n)
	}

	if len(c.cache) > c.capacity {
		delete(c.cache,c.tail.key)
		c.remove(c.tail)
	}
}

//add node to head
func (c *linkedLRUCache) add(n *node) {
	if c.head != nil {
		c.head.prev = n
		n.next = c.head
	}

	c.head = n

	if c.tail == nil {
		c.tail = n
		c.tail.prev = n
		c.tail.next = nil
	}
}

//remove node
func (c *linkedLRUCache) remove(n *node) {
	//remove head node
	if c.head == n {
		if n.next != nil {
			n.next.prev = nil
		}
		c.head = n.next
		return
	}

	//remove tail node
	if c.tail == n {
		c.tail = c.tail.prev
		return
	}

	n.prev.next = n.next
	n.next.prev = n.prev
}





 

电磁波成像技术全解析:从γ射线到无线电波的应用实践 本文全面解析电磁波成像技术,从γ射线到无线电波的应用实践。详细介绍了不同波长电磁波的特性与实用场景,包括医疗影像、工业检测、安防监控等领域。特别探讨了X射线、红外热成像、毫米波雷达等前沿技术的实战应用,为读者提供技术选型指南和操作技巧。 阅读详情

相关推荐

告别Modern Standby!Win10/11强制S3睡眠的终极指南(含BIOS设置避坑)

本文是针对Windows 10/11用户因Modern Standby(S0低电量待机)导致睡眠耗电、发热问题的终极解决方案。文章详细对比了Modern Standby与传统S3睡眠(Suspend to RAM)的本质区别,并提供了从系统诊断、注册表修改、BIOS/UEFI设置避坑到驱动优化的完整步骤,旨在帮助用户强制启用稳定、省电的S3睡眠模式,彻底告别睡眠噩梦。

n7o8p的博客 805

LRU和LFU算法

在redis的学习中,了解到了两种缓存清理算法,分别是LRU和LFU,在此针对这两种算法进行学习。

qq_43325216的博客 5127

Elsevier投稿避坑指南:Ocean Engineering论文格式要求详解(附Checklist模板)

本文详细解析Elsevier旗下期刊Ocean Engineering的投稿格式要求与常见陷阱,提供实用的Checklist模板。涵盖文章类型确认、作者贡献声明、图表规范、数据声明等关键环节,帮助研究者高效通过格式审查。特别强调LaTeX排版细节、图表分辨率要求及现代伦理声明规范,助力海洋工程领域学者顺利投稿。

weixin_33734785的博客 1509

LRU和LFU 算法(页面置换算法)

LRU和LFU的区别 LRU和LFU都是内存管理的页面置换算法。 LRU:最近最少使用(最长时间)淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的页面。 LFU:最不经常使用(最少次)淘汰算法(Least Frequently Used)。LFU是淘汰一段时间内,使用次数最少的页面。 例子 假设LFU方法的时期T为10分钟,访问如下页面所花的时间正好为10分钟,内存块大小为3。若所需页面顺序依次如下: 2 1 2 1 2 3 4 ----------

热爱学习和钻研。 4万+

银河麒麟服务器操作系统V10SP3 U盘安装中“基础软件仓库错误”的排查与修复指南

本文针对在无网络环境下使用U盘安装银河麒麟服务器操作系统V10SP3时,遇到的“基础软件仓库错误”问题,提供了详细的排查与修复指南。核心解决方案是通过进入救援模式,使用lsblk命令确定U盘实际设备路径,并在系统引导时手动添加inst.repo内核参数来指定安装源,从而绕过安装程序的自动探测故障,确保安装流程顺利进行。

ik67890123的博客 1202

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7450

LRU算法和LFU算法

LRU算法和LFU算法

冯同学的博客 3506

AI视频生成本地搭建图文详细过程

在自己的电脑上搭建一个AI,主要用于通过自己输入的关键字来自动生成视频文案,把视频文案自动生成视频,再自动给视频配音配字幕。

张小三的博客 4696

golang实现LRU缓存

写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );// 返回 -1 (未找到)cache.get(1);// 返回 -1 (未找到)cache.get(1);

oHeXianRen007的博客 728

CoMP 协同多点传输技术

CoMP CoMP是什么 解决什么问题 有什么缺点 CoMP(Coordinated Multiple Points)协同多点传输,通信术语,LTE-A的重要技术之一。 CoMP传输是指地理位置上分离的多个传输点,协同参与为一个终端的数据(PDSCH)传输或者联合接收一个终端发送的数据(PUSCH),参与协作的多个传输点通常指不同小区的基站。CoMP技术将边缘用户置于几个基站的同频率上,几...

ilean_J的博客 2万+

人工蜂群优化算法(ABC)详解:原理、实现与应用

人工蜂群算法(Artificial Bee Colony, ABC)是Karaboga于2005年提出的一种群体智能优化算法,其灵感来源于蜜蜂群体在自然界中高效的采蜜行为。该算法通过模拟雇佣蜂、观察蜂和侦察蜂三种角色的分工协作来寻找最优解。在ABC算法中,每个潜在的解决方案被视为一个“食物源”,其质量由适应度函数评估。雇佣蜂负责在已知优质食物源附近进行局部开采;观察蜂根据雇佣蜂分享的信息,以一定概率选择并跟进优质食物源;侦察蜂则随机探索新区域,防止种群陷入局部最优。

qq_42212808的博客 393

LRU go cache的实现

一致性哈希算法是Cache 从单节点走向分布式节点的一个重要的环节。对于分布式缓存来说,当一个节点接收到请求,如果该节点并没有存储缓存值,那么它面临的难题是,从谁那获取数据?自己,还是节点1, 2, 3, 4…。假设包括自己在内一共有 10 个节点,当一个节点接收到请求时,随机选择一个节点,由该节点从数据源获取数据。假设第一次随机选取了节点 1 ,节点 1 从数据源获取到数据的同时缓存该数据;

General_zy的博客 2175

广东省道路工程检测练习试题(单选题)真题

1.一般项目的合格点率应达到( ),且不合格点的最大偏差值不得大于规定允许偏差值的1.5倍。A.不低于75%B.不低于80%C.不低于85%D.不低于90%答案:B2.进行土路基平整度检测时,当路宽小于9m,检测点数应为( )A.1B.2C.3D.4答案:A3.根据《城镇道路工程施工与质量验收规范》,在分部工程中,根据工种、材料、施工工艺等划分的是( )A.单位工程B.分项工程C.分部工程D.工序工程答案:B4.根据《城镇道路工程施工与质量验收规范》,土方路基压实度的检测频率为每1000m每压实层抽检( )

ZShy001238的博客 686

LRU cache原理及go实现

缓存资源通常比较昂贵,通常数据量较大时,会竟可能从较少的缓存满足尽可能多访问,这里有一种假设,通常最近被访问的数据,那么它就有可能会被后续继续访问,基于这种假设,将所有的数据按访问时间进行排序,并按驱逐出旧数据,那么存在缓存的数据就为热点数据,这样既节省了内存资源,又极大的满足了访问.LRU(Least recently used)算法就是基于这种假设的一直缓存置换算法.

javagty6778的博客 261

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Golang从0到1实现简易版expired LRU cache带图解

现在,我们将基本的数据结构定义出来,并且定义个构造器函数。

weixin_36342356的博客 133

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 分布式锁详细理解及常用的实现方式
下一篇: Java实现LRU Cache
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值