LRU Cache

news/2024/10/22 16:19:05/

前言

哈喽,各位小伙伴大家好,本章内容为大家介绍计算机当中为了提高数据相互传输时的效率而引进的一种重要设计结构叫做LRU Cache,下面将为大家详细介绍什么是LRU Cache,以及它是如何是实现的,如何提升效率的。

1.什么是LRU Cache?

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 什么是
Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使DRAM技术,而使用昂贵但较快速的SRAM技术。 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容缓存等。

Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选
并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用
的内容替换掉。
其实,LRU译成最久未使用会更形象, 因为该算法每次替换掉的就是一段时间内
最久没有使用过的内容。 

2.LRU Cache的实现

下面将通过leetcode上的一道设计LRU Cache的oj题讲解如何实现LRU Cache:

LRU Cache

题目要求:

 题目解析:
1.初始化容量大小为capacity
2.get:根据关键字key获取value值
3.put:
a.key存在,则修改value
b.key不存在,插入key-value结点
c.插入结点关键字超过capacity就移除最久未使用的关键字

要求:get和put必须以O(1)的平均时间复杂度运行

要保持高效实现O(1)的put和get,那么使用双向链表和哈希表的搭配是最高效和经典的。使用双向链表是因为双向链表可以实现任意位置O(1)的插入和删除,使用哈希表是因为哈希表的增删查改也是O(1)。

 代码实现:

class LRUCache {
public:LRUCache(int capacity) :_capacity(capacity){}int get(int key) {unordered_map<int,Liter>::iterator it = _hashMap.find(key);if(it != _hashMap.end()){//更新key位置对应的位置//splice:转移结点_LRUList.splice(_LRUList.begin(),_LRUList,it->second);return it->second->second; }return -1;}void put(int key, int value) {unordered_map<int,Liter>::iterator it = _hashMap.find(key);if(it == _hashMap.end()){//数据满了,先删除尾部的数据:if(_capacity == _hashMap.size()){pair<int,int> back = _LRUList.back();_hashMap.erase(back.first);_LRUList.pop_back();}_LRUList.push_front(make_pair(key,value));_hashMap[key] = _LRUList.begin();}else{it->second->second = value;_LRUList.splice(_LRUList.begin(),_LRUList,it->second);}}
private:typedef list<pair<int,int>>::iterator Liter;//保证查找和插入时O(1),second保存迭代器保证更新也是O(1)unordered_map<int,Liter> _hashMap;//假设尾部数据是最近最少用,修改的时候数据插入到头部list<pair<int,int>> _LRUList;size_t _capacity;
};


http://www.ppmy.cn/news/79054.html

相关文章

测牛学堂:2023软件测试学习教程之sql的分页查询

查重 所谓的查重&#xff0c;就是过滤返回数据中重复的记录。 语法关键字&#xff1a;distinct select distinct 字段列表 from tableName [where 子句]注意&#xff1a; distinct的位置有两个地方&#xff0c;一个是放在select后面&#xff0c;对筛选出来的数据去重。 一个是…

NetSuite SuiteTax之中国影响

这篇是还账。3个月前林师傅给的一个题目&#xff0c;陆陆续续的学习&#xff0c;一直没有弄完&#xff0c;直到今朝。 SuiteTax是2018年GA的一个重大功能&#xff0c;是NetSuite面向国际市场的一个标志动作。它将过去以美国为中心的税务功能&#xff0c;转向为国际市场服务。只…

泰克MDO4104C(Tektronix) mdo4104c混合域示波器

泰克 MDO4104C混合域示波器&#xff0c;1 GHz&#xff0c;4 通道&#xff0c;2.5 - 5 GS/s&#xff0c;20 M 点 ​泰克 MDO4104C 示波器是一款 6 合 1 集成示波器&#xff0c;可以配置可选的频谱分析仪、任意波形/函数发生器、逻辑分析仪、协议分析仪和 DVM/频率计数器。当配置…

位与运算符、矩阵快速幂

&运算符的作用是&#xff0c;比较两个数的二进制位&#xff0c;均1取1&#xff0c;否则该位为0。常用于&#xff1a; 判断某个非负整数的二进制最后一位是否为1&#xff1a; int x 4; if (x & 1 1) {printf("最后一位为1\n"); }和移位运算符>>结合&a…

Emacs之实时渲染markdown(九十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Three.js--》实现3d小岛模型搭建

目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还…

NFT游戏Mythical Beings将参加NFT Polygon 在线展会

Mythical Beings神秘生物是由Tarasca Art & Games 开发的基于区块链的卡牌收集游戏。游戏中每张卡牌所拥有的属性和背后的故事都是独一无二的&#xff0c;Mythical Beings不仅具有游戏属性&#xff0c;还兼具故事的传承。 作为一款跨链Polygon的NFT游戏&#xff0c;Mythic…

多态的应用

多态的应用 1.多态的构建&#xff1a; ​ 自我理解&#xff1a;就是 父类引用指向子类对象。 功能 &#xff1a; 父类能调用父类对应子类的方法和属性&#xff0c;但是都是优先调用 重写的方法 或 子类的属性&#xff01; 创建子类构造器&#xff0c;就是先进入子类构造器&…