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

【算法】leetcode热题100 146.LRU缓存. container/list用法

https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

实现语言:go lang

LRU

最近最少未使用,是一种淘汰策略,当缓存空间不够使用的时候,淘汰一个最久没有访问的存储单元。目前已知较好表现的替换策略,具体原因翻教材。

题目要求:编写一个LRU具体类,完成指定方法,Get(key int) int {} 与 Set(key int, value int) {}
并且需要保证两个方法的时间复杂度都需要在O1

既然是是缓存而且是替换策略,我们就先假设放在一个数组里面。
最主要需要考虑替换策略。所以我们假定数组已经满了,这时候我需要set一个新的键值对进来,我需要替换哪一个?
这时候就感觉好像似乎需要针对访问顺序产生优先级顺序。但这个优先级顺序不能用排序解决,因为无论哪种排序都不可能在O1完成。
每一次最久没有访问的其实可以认为是一个贪心选择那么假设每一次访问之后,都把访问结点往前放,那么到淘汰时候一定是末尾的淘汰。

确定出方法,就需要确定数据结构以满足时间复杂度的限制。
显然之前假定的数组不可行。因为按照刚才的思路,访问的时候都需要改变一下顺序,数组显然不好改变顺序。
但链表可以,既好改变顺序,同时也好删除,复杂度都是O1.

确定了数据结构,能够解决顺序与删除问题,就剩下最后一个问题,查找
无论是Get还是进行删除之前都需要进行查找,而且也需要保证复杂度O1。
显然就只剩下hash了。

所以可以确定下来所用的数据结构为链表与hashtable

省下的就是go语言编码的问题了

go container/list

container/list是直接使用双向链表的,没有但链表这个选项,直接用就可以。
内部数据结构分为Element与List

Element相当于自己写链表的Node,内部含有结点值,前后结点的指针。
List是相当于进行封装,里面全是一堆方法。
比较有用的就是

  1. 直接含有size计数
  2. Front/Back方法,返回头/尾 Element
  3. move方法,移动结点到首部/尾部/随便结点后面
  4. delete方法,删除某个节点

具体哪个方法,查阅一下文档

https://pkg.go.dev/container/list#pkg-functions

方法不详述,直接翻官方文档就好了。


import "container/list"func main() {// 构造一个list对象,前面这个list代表list这个packagel := list.New()// 需要用什么值,直接调用list.PushBack/PushFront,然后把值丢进去就可以了// 不需要自己封装Elementl.PushBack(111)}

代码

go语言的一些问题:

  1. 为什么需要使用Pair
    其实是我傻了,后面发现可以不用

  2. 为什么需要插入时候,需要&Pair
    因为题目设定二次访问是更新值,如果不设置成指针,go是不让修改数据。

  3. 为什么delNode.Value.(*Pair) 要这么写
    因为源码Element是Any类型,也就是interface{}。由于拿出来需要访问以Pair访问Key Value,需要进行显示转换


// 需要实现的特征
// 存取o1
// 维持这个队列o1
// put:
// 查看字典是否存在
// 如果存在,更新队列参数
// 如果使用队列?
import "container/list"type LRUCache struct {size intcapacity intcache map[int]*list.Elementlist *list.List
}type Pair struct{Key intValue int
}func Constructor(capacity int) LRUCache {l := LRUCache {size: 0,capacity: capacity,cache: make(map[int]*list.Element),list: list.New(),}return l
}func (this *LRUCache)Get(key int) int{if _, ok := this.cache[key]; !ok {return -1}node := this.cache[key]this.list.MoveToFront(node)return node.Value.(*Pair).Value
}func (this *LRUCache) Put(key int, value int) {if _, ok := this.cache[key]; !ok {node := this.list.PushFront(&Pair{key, value})this.cache[key] = nodethis.size++if this.size > this.capacity {delNode := this.list.Back()nodeValue := delNode.Value.(*Pair)delete(this.cache, nodeValue.Key)this.list.Remove(delNode)this.size--}} else {node := this.cache[key]node.Value.(*Pair).Value = valuethis.list.MoveToFront(node)}
}

相关文章:

【算法】leetcode热题100 146.LRU缓存. container/list用法

https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 实现语言:go lang LRU 最近最少未使用,是一种淘汰策略,当缓存空间不够使用的时候,淘汰一个最久没有访问的存储单元。目前…...

[论文总结] 深度学习在农业领域应用论文笔记13

文章目录 1. Downscaling crop production data to fine scale estimates with geostatistics and remote sensing: a case study in mapping cotton fibre quality (Precision Agriculture ,2024, IF5.585)背景方法结果结论个人总…...

《Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images》论文阅读

学习资料 论文题目:Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images(低分辨率UAV遥感图像中茶叶枯萎病的检测)论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber10345618 Abstr…...

低代码BPA(业务流程自动化)技术探讨

一、BPA流程设计平台的特点 可视化设计工具 大多数BPA流程设计平台提供直观的拖拽式界面,用户可以通过图形化方式设计、修改及优化业务流程。这种可视化的方式不仅降低了门槛,还便于非技术人员理解和参与流程设计。集成能力 现代BPA平台通常具备与其他系…...

开闭原则(OCP)

开闭原则(OCP):Open Closed Princide:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有代码,实现一个热插拔的效果。 简言之,是为了使程序的扩展性更好,…...

Unity之 TextMeshPro 介绍

TextMeshPro 是 Unity 中用于处理文本显示的高级插件,旨在替代 Unity 内置的 UI.Text 和 TextMesh 组件。与默认的文本组件相比,TextMeshPro 提供了更高的文本渲染质量和更多的文本样式选项,同时具备强大的优化能力。 TextMeshPro 的主要特点…...

Linux套接字Socket

Linux套接字Socket 前提知识补充 为不同机器上的两个进程之间提供通信机制 主机字节序小端存储,网络字节序大端存储 特点TCPUDP连接类型面向连接无连接可靠性高低有序性保证数据包按顺序到达不保证数据包顺序流量控制有滑动窗口机制无拥塞控制有拥塞控制机制无复杂性较高较低…...

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述,回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…...

【MySQL】基础入门篇

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:理解什么是MySQL,如何安装MySQL,简单使用MySQL。 > 毒鸡汤:有些事情,总是不明白,所以我不…...

uni-app vue3封装websocket,支持微信小程序

一、创建useWebSocket.js 文件 // useWebSocket.js // 获取链接的URL前缀 import {BASE_URL } from "./request";import {ref,onMounted,onBeforeUnmount } from "vue";// 假设我们使用 uni-app 的 globalData 或 Vuex 来管理用户状态 // 这里为了简单起…...

杭州算力小镇:AI泛化解锁新机遇,探寻AI Agent 迭代新路径

人工智能技术不断迭代,重点围绕着两个事情,一是数据,二是算力。 算法的迭代推动着AI朝向多模态的方向发展,使之能够灵活应对不同领域的不同任务,模型的任务执行能力大大提升,人工智能泛化能力被推上高潮。…...

IT行业的现状与发展趋势

IT行业的现状与发展趋势 随着信息技术的迅速发展,IT行业已成为全球经济的重要支柱之一。无论是传统行业的数字化转型,还是新兴技术的快速崛起,IT行业都在不断推动社会的进步和发展。本文将探讨IT行业的现状及未来发展趋势。 IT行业的现状 …...

华为认证HCIA篇--网络通信基础

大家好呀!我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分,偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过,如果是新手或小白的话建议还是看一看,先有个印象,好为后续的…...

【linux】regulartor-fixed

作用:创建一个固定的 regulator。一般是一个 GPIO 控制了一路电,只有开(enable) \ 关(disabled)两种操作。 device-tree node io_vdd_en: regulator-JW5217DFND {compatible "regulator-fixed"…...

11年408考研真题解析-计算机网络

第一题: 解析:网络层虚电路服务和数据报服务 传输服务只有:有连接可靠和无连接不可靠两种,直接排除BC。 网络层指的是IP协议,由图二可知:运输层,网际层,网络接口层唯一有连接可靠的协…...

wireshark使用要点

目录 IP过滤 端口过滤 内容过滤 过滤udp 过滤tcp IP过滤 ip.src XXX.XXX.XXX.XXX 只显示消息源地址为XXX.XXX.XXX.XXX的信息 ip.dst XXX.XXX.XXX.XXX 只显示消息目的地址为XXX.XXX.XXX.XXX的信息 ip.addr XXX.XXX.XXX.XXX显示消息源地址为XXX.XXX.XXX.XXX&#xff0…...

WebGL扩展与WebGPU

目录 WebGPU扩展的探索使用实验性或未标准化的特性示例:使用纹理压缩扩展多视口渲染自定义着色器阶段可变多重采样抗锯齿...

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏 目前存在的游戏: 植物大战僵尸:demos/pvz羊了个羊:demos/yang消消乐:demos/xiaoxiaole华容道:demos/huarongdao PVZ功能展示可见: 羊了个羊: 消消…...

Java List sort() 排序

sort是java.util.List接口的默认方法。 List的排序方法在Java 8中被引入。 排序方法接受比较器作为参数&#xff0c;并根据指定的比较器对这个列表进行排序。 default void sort(Comparator<? super E> c) 示例代码&#xff1a; import java.text.Collator; import …...

Vue.js 与 Flask 或 Django 后端配合

Vue.js 与 Flask 或 Django 后端配合是一种常见的全栈开发方式&#xff0c;用于构建动态且响应迅速的 Web 应用程序。Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架&#xff0c;而 Flask 和 Django 是 Python 语言的两个非常流行的 Web 框架。下面将分别介绍 Vue.js …...

告别插件切换!一款满足你所有挖洞需求的浏览器插件助力高效挖洞

0x01 工具介绍 由于目前网上流通的插件功能都各有千秋&#xff0c;每个插件都有他自己的亮点&#xff0c;每次使用都得按场景去选择插件&#xff0c;为了能够有一款属于自己的完美插件&#xff0c;不用来回倒腾切换&#xff0c;由此GodEyes 诞生了。 它是一款可以帮助安全研究…...

Vmware系列虚拟机系列【仅供参考】:解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“ 解决 VMware 嵌套虚拟化提示 关闭"侧通道缓解" 解决方法 方法1: 方法2: 完全禁用 Hyper-V 方法3 参考链接: 解决 VMware 嵌套虚拟化提示 关闭"侧通道缓解" 最近给电脑做了新版的 Windows 11 LTSC操作系…...

C语言实战:构建嵌入式eMMC RPMB安全读写组件

1. eMMC RPMB分区基础解析 我第一次接触RPMB分区是在开发智能门锁项目时&#xff0c;需要存储指纹特征码等敏感数据。传统存储方式容易被篡改&#xff0c;而RPMB完美解决了这个问题。RPMB&#xff08;Replay Protected Memory Block&#xff09;是eMMC芯片中的特殊安全存储区域…...

CBAM实战指南:如何通过通道与空间注意力提升CNN模型性能

1. 为什么你的CNN模型需要CBAM注意力模块 如果你正在使用卷积神经网络&#xff08;CNN&#xff09;处理图像分类任务&#xff0c;可能会遇到这样的困境&#xff1a;模型在训练集上表现不错&#xff0c;但测试集准确率始终卡在一个瓶颈。这时候不妨试试CBAM&#xff08;Convolu…...

JVS-APS智能排产后如何配置移动端扫码报工

报工是在工厂中&#xff0c;确定人员/产线按照计划执行后&#xff0c;提交生产结果数据&#xff0c;那么在APS 完成计划排产后&#xff0c;如何能便捷的报工&#xff0c;下面我们有JVS快速开发平台做了一个报工的应用&#xff0c;实现 aps-mes 之间 任务下发与任务结果反馈的整…...

M2LOrder模型Typora写作辅助插件开发:实时监测文章情感基调

M2LOrder模型Typora写作辅助插件开发&#xff1a;实时监测文章情感基调 不知道你有没有过这样的经历&#xff1a;写了一篇技术文章&#xff0c;自己读起来总觉得哪里不对劲&#xff0c;但又说不出来具体问题。或者写产品文案时&#xff0c;明明想表达积极向上的情绪&#xff0…...

医疗AI智能体:从数据到关怀人文设计:告别冰冷精准,构建有温度的诊疗交互.131

一、智能体的人文设计医疗AI智能体以大模型为核心&#xff0c;串联医学知识图谱、实体识别模块、风险评估模块、话术生成模块、伦理审核模块五大核心组件&#xff0c;最终实现精准医学判断 人性化交互的双重目标。而在医疗场景中&#xff0c;用户的核心需求从来不是单纯的数据…...

Adobe软件非正版弹窗终极解决方案:PS/Ai/PR/AE禁用提示一键清除指南

1. Adobe弹窗问题的根源分析 最近不少朋友打开Photoshop、Illustrator这些Adobe软件时&#xff0c;突然跳出一个烦人的提示框&#xff1a;"Your non-genuine Adobe app will be disabled soon"。这个警告不仅影响使用体验&#xff0c;严重时还会导致软件直接罢工。作…...

Python中缓存入门实战之核心概念与用法详解

缓存是提升程序性能的关键技术——将频繁访问的「计算结果/数据」临时存储在高速介质&#xff08;如内存&#xff09;中&#xff0c;避免重复计算/重复查询&#xff08;如数据库、API&#xff09;&#xff0c;从而大幅降低响应时间。以下是 Python 缓存的入门指南&#xff0c;涵…...

ICLR 2026 | 告别Top-K检索!RF-Mem在嵌入空间逐步重构证据链,实现长记忆渐进式唤醒

今天分享一篇来自大连理工大学、香港城市大学、华为和中国科学技术大学的最新工作 RF-Mem&#xff0c;发表于ICLR 2026。这篇工作关注个性化大模型中的一个关键问题&#xff1a;当用户历史越来越长时&#xff0c;模型到底该怎样从海量记忆里&#xff0c;准确找回“此时此刻最相…...