LRU算法

1.简介

LRU(Least Resently Used,最近最久未使用)算法是一种缓存淘汰策略

2.头文件

A》基础常用头文件(我们写的demo基本用到的头文件大概都在这,线程相关的就不放了)

#include<iostream>
#include<deque>
#include<map>
#include<list>
#include<vector>
#include<unordered_map>
#include<vector>
#include<string>
#include<string.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory>
#include<algorithm>

using namespace std;

B》本次需要定义的结构体和类

一个Node结构体

一个NodeList:最终访问的数据类型

m_list:最终访问的数据变量

m_iCapacity:m_list的最大容量

m_mapLRU:作为查询用,其中k-v的k值和m_list中的k值一致,k-v的v值使用的是NodeList的向量

注:get函数最好不要用int型返回,到时候结果正确错误都不知道

#include"../base.h"


struct Node
{
    int key;
    int value;
    Node(int k,int v):key(k),value(v){}
};

typedef list<Node> NodeList;

class cLRU
{
public:
    cLRU(int maxSize):m_iCapacity(maxSize){}
    ~cLRU(){}
    void set(int k,int v);
    bool get(int &iGetV, int k);
    void print();

public:
    int m_iCapacity;
    NodeList m_list;
    unordered_map<int, NodeList::iterator> m_mapLRU;

};

C》实现

set函数:分两大部分

                                1.通过m_mapLRU通过查询k值是否存在,不存在时

                                超过最大容量则需要对m_mapLRU以m_list的尾部k值为依据擦除

                                然后头插法插入m_list,顺便更新m_mapLRU数据

                                2.通过m_mapLRU通过查询k值是否存在,存在时

                                更新m_mapLRU数据以及m_list头部置换

get函数:更新m_mapLRU数据以及m_list头部置换

#include"LRU.h"
void cLRU::set(int k, int v)
{
    if (m_mapLRU.find(k) == m_mapLRU.end())
    {
        if (m_list.size() == m_iCapacity)
        {
            m_mapLRU.erase(m_list.back().key);
            m_list.pop_back();
        }
        m_list.push_front(Node(k,v));
        m_mapLRU[k] = m_list.begin();
    }
    else
    {
        m_mapLRU[k]->value = v;
        m_list.splice(m_list.begin(), m_list, m_mapLRU[k]);
        m_mapLRU[k] = m_list.begin();
    }
    return;
}

bool cLRU::get(int &iGetV, int k)
{
    if (m_mapLRU.find(k) == m_mapLRU.end())
    {
        return false;
    }
    m_list.splice(m_list.begin(), m_list, m_mapLRU[k]);
    m_mapLRU[k] = m_list.begin();
    return true;
}

void cLRU::print()
{
    NodeList::iterator it = m_list.begin();
    for(; it != m_list.end(); it++)
    {
        cout<<"key:"<<it->key<<" value:"<<it->value<<endl;
    }
    return;
}

D》应用

这里其实bFlag需要判断的,我们懒就省略了

int main()
{
    cLRU tmp(3);
    tmp.set(1, 100);
    tmp.set(2, 200);
    tmp.set(3, 300);
    tmp.print();
    cout<<"---------------"<<endl;
    tmp.set(4, 400);
    tmp.print();
    cout<<"---------------"<<endl;
    int iGetV = 0;
    bool bFlag = tmp.get(iGetV, 2);

    tmp.print();
    return 0;
}
~       

E》运行结果

key:3 value:300
key:2 value:200
key:1 value:100
---------------
key:4 value:400
key:3 value:300
key:2 value:200
---------------
key:2 value:200
key:4 value:400
key:3 value:300

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值