Go实现LRU算法

LRU是什么?

  LRU是内存淘汰策略,LRU (Least recently used:最近最少使用)算法在缓存写满的时候,会根据所有数据的访问记录,淘汰掉未来被访问几率最低的数据。也就是说该算法认为,最近被访问过的数据,在将来被访问的几率最大。
那LRU使用什么实现的呢?双链表的话,那查询的时间复杂度不就是O(n)了,那应该怎么办,于是可以用双链表加Map的方式进行插入和查询,在插入的时候,把key,value 存到map中,那么这样查询的时候时间复杂读不就是O(n)了
假如现在我设定的内存就能存放5个数据块,现在进行插入

在这里插入图片描述  下面一次性插入五个数据块,此时,如果再有元素想插入应该怎么办?
在这里插入图片描述
  如果内存被读满,那么他就会淘汰链表的最后一个元素,如果读取链表中的元素,他就会加载到链表的头部

在这里插入图片描述

代码的具体实现

代码和双链表的思想一样,只不过加入了一个hashmap

package mainimport ("fmt"
)// LruNode创建双链表的节点
type LruNode struct {next, prev *LruNodeValue      anyKey        stringlist       *LRU
}
type LRU struct {Length   uintmaxBytes uintCache    map[string]*LruNoderoot     LruNode
}func NewLRU() *LRU {return new(LRU).Init()
}
func (l *LRU) Init() *LRU {l.root.next = &l.rootl.maxBytes = 5l.root.prev = &l.rootl.Cache = make(map[string]*LruNode)l.Length = 0return l
}// FrontBack 前插
func (l *LRU) FrontBack(k string, v any) {if node, ok := l.Cache[k]; !ok {nodeNow := &LruNode{Value: v, Key: k}l.Cache[k] = nodeNowl.insert(nodeNow, &l.root)if l.Length+1 > l.maxBytes {delete(l.Cache, l.root.prev.Key)l.delete(l.root.prev)}} else {delete(l.Cache, k)nodeNow := &LruNode{Value: v, Key: k}l.Cache[k] = nodel.insert(nodeNow, &l.root)}}// GetValue 查找k,v
func (l *LRU) GetValue(k string) (val any, ok bool) {if node, ok := l.Cache[k]; ok {l.delete(node)l.insert(node, &l.root)return node.Value, ok}return nil, ok
}
func (l *LRU) insert(node, root *LruNode) {node.prev = rootnode.next = root.nextnode.prev.next = nodenode.next.prev = nodel.Length++node.list = l
}
func (l *LRU) delete(node *LruNode) {node.prev.next = node.nextnode.next.prev = node.prevl.Length--
}// PrintlnDList 打印双链表的所有元素
func (l *LRU) PrintlnDList1() {if l.Length == 0 {}prev := l.root.nextindex := 0for prev.Value != nil {fmt.Printf("下标index: %d 元素 Element: %d\n", index, prev.Value)prev = prev.nextindex++}return
}
func main() {a := NewLRU()a.FrontBack("1", 1)a.FrontBack("2", 2)a.FrontBack("3", 3)a.FrontBack("4", 4)a.FrontBack("5", 5)a.FrontBack("5", 5)a.FrontBack("6", 6)a.FrontBack("7", 7)a.GetValue("4")a.PrintlnDList1()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码学习-Spring流程概述(一)

Spring启动的流程 public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("applicationContext.xml");Student bean context.getBean(Student.class);context.close();} }调用…

openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)

文章目录 openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)概述效果笔记编程环境界面控件的设置增加文件拖拽的类RSA证书和key是否匹配的实现在程序中加入环境变量备注备注END openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具) 概述 在学习openssl官方的…

AI嵌入式K210项目(19)-安装CanMV IDE开发软件

文章目录 前言一、软件下载安装二、软件简介三、设备连接四、在线模拟五、开机运行程序附录:MicroPython固件烧录总结 前言 前几章我们介绍K210使用C语言裸机开发方法,大家对K210内部的硬件和各种加速器有了初步的了解,但是开发人工智能相关…

24.1.24 DAY1 C++

思维导图&#xff1a; 1. 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数&#xff0c;要求使用C风格字符串完成 代码&#xff1a; #include <iostream> #include <array> using namespace std;int main(…

c++day1作业

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <iomanip> using namespace std; int main() {string a;cout<<"输入一个字符…

CFD-POST如何使用Expression计算某一点处的物理量

简介 CFD-POST是ANSYS Workbench通用的计算流体力学后处理软件&#xff0c;有时我们需要编写表达式Expression计算阻力系数或升力系数&#xff0c;这时就需要获取出口附近某一点处的气体密度&#xff08;或其他任何物理量&#xff09;。接下来将介绍如何操作 操作方法 Step1…

使用axios库创建实例的示例,(创建实例时,传入了一个配置对象)同时还包含了请求拦截器和响应拦截器

第一步&#xff1a; 在vue项目中src目录下创建utils>request.js 第二步&#xff1a; 在 request.js中&#xff0c;使用axios.create方法创建了一个名为request的axios实例&#xff08;设置基本配置信息&#xff09;通过request.interceptors.request.use方法添加了请求拦…

数据结构<1>——树状数组

树状数组&#xff0c;也叫Fenwick Tree和BIT(Binary Indexed Tree)&#xff0c;是一种支持单点修改和区间查询的&#xff0c;代码量小的数据结构。 那神马是单点修改和区间查询&#xff1f;我们来看一道题。 洛谷P3374(模板): 在本题中&#xff0c;单点修改就是将某一个数加上…

【MySQL故障】主从延迟越来越大

问题背景 研发执行了一个批量更新数据的操作&#xff0c;操作的表是个宽表&#xff0c;大概有90多个字段&#xff0c;数据量有800多w&#xff0c;但是研发是根据ID按行更新。更新开始后&#xff0c;该集群的主从延迟越来越大。 问题现象 1 从库应用binlog基本无落后&#xf…

Hbas简介:数据模型和概念、物理视图

文章目录 说明零 BigTable一 Hbase简介二 HBase 访问接口简介三 行式&列式存储四 HBase 数据模型4.1 HBase 列族数据模型4.2 数据模型的相关概念4.3 数据坐标 五 概念&物理视图 说明 本文参考自林子雨老师的大数据技术原理与应用(第三版)教材内容&#xff0c;仅供学习…

SQL 系列教程(二)

目录 SQL DELETE 语句 DELETE 语句 演示数据库 DELETE 实例 删除所有行 SQL TOP, LIMIT, ROWNUM 子句 TOP 子句 演示数据库 SQL TOP、LIMIT 和 ROWNUM 示例 SQL TOP PERCENT 实例 添加WHERE子句 SQL MIN() 和 MAX() 函数 MIN() 和 MAX() 函数 演示数据库 MIN() …

热压机PLC数据采集远程监控物联网解决方案

热压机PLC数据采集远程监控物联网解决方案 热压机是制造行业中重要的设备之一&#xff0c;广泛应用于木材加工、纸制品生产、塑料加工等领域。随着工业自动化技术的发展&#xff0c;热压机的自动化程度也越来越高。然而&#xff0c;热压机的远程监控仍然是制造企业普遍面临的问…