LRU Cache(最少最近使用机制)

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

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

2、利用双向链表和哈希表来实现
在保持高效实现put和get,效率为O(1)。那么使用双向链表和哈希表的搭配是最高效和经典的。使用双向链表是因为双向链表可以实现任意位置O(1)的插入和删除,使用哈希表是因为哈希表的增删改查也是O(1) :
在这里插入图片描述
通过链表(list)+哈希(unordered_map)实现:
list<pair<int,int>> : 在链表中存储一个kv值对;
unordered_map<int,list<pair<int,int>>::iterator> _hashmap ; :在hashmap中存储kv中的k同时将对应的list迭代器存储在hashmap的v中,用于查找,这样查找就实现了O(1),插入删除也都实现O(1) ;

3、LRU缓存机制
实现:
unordered_map<int,list<pair<int,int>>::iterator> 实现在链表list中的查找,这样就实现了O(1),当插入一个数据的时候,先用_hashmap查找,得到其中的迭代器,如果为end(),那么就表示hashmap及其list中没有当前数据,直接在_hashmap和list中插入当前数据,list中,当前数据是头插,_hashmap中,直接利用key,将list中的begin迭代器使用"[]"运算符赋值,当然,在插入之前需要判断是否为满。get函数中,如果有访问已有元素,,则得到并删除该元素,将该元素再头插于链表及_hashmap中。

// 1、此处需要实现 get & put 都为O(1)
// 2、同时还要满足LRU
// 因此最重要的就是结构的设计
// 只要被访问(get/put)的数据,就往头上放,尾部的数据自然剩下的就是最近最少访问但是数据
class LRUCache {
   
public:
    LRUCache(int capacity) {
   
        _capacity =capacity ;
    }
    int get(int key)
    {
   
        // 查找到就更新位置,表示LRU
        auto ret = _hashmap
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值