LRU算法

1.LRU最近最久未使用算法,如其名,将常使用的数据放在容易访问的地方,将不长使用的放在不容易访问的地方,或者压缩保存起来,要访问的时候再去解压缩

2.代码的实现,容器选list和map;

这里我自己实现的list,也只实现了其中的一小部分

#include<iostream>
#include<map>
using namespace std;
class listnode
{
public:
    friend class LRU;
    listnode():val(0),prev(nullptr),next(nullptr)
    {}
private:
    int val;
    listnode* prev;
    listnode* next;
};
class LRU
{
public:
    LRU()
    {    
        head = new listnode;
        head->next = head;
        head->prev = head;
        size = 4;
    }
    listnode* buynode(int num)
    {
        listnode* s = new listnode;
        s->val = num;
        return s;
    }
    
    listnode* push_head(int num)
    {
        listnode* s = buynode(num);
        s->next = head->next;
        s->next->prev = s;
        s->prev = head;
        head->next = s;
        return s;
    }
    void pop(listnode* p)
    {
        p->prev->next = p->next;
        p->next->prev = p->prev;
        delete p;
        p = nullptr;
    }
    void insert(int num)
    {
        map<int,listnode*>::iterator it=lr.find(num);
        if (it == lr.end())
        {
            if (size>0)
            {
                listnode*s=push_head(num);
                pair<int, listnode*> pa(num, s);
                lr.insert(pa);
                size--;
            }
            else
            {
                listnode* s = push_head(num);
                pair<int, listnode*> pa(num, s);
                lr.insert(pa);
                map<int,listnode*>::iterator it=lr.find(head->prev->val);
                pop(it->second);
                lr.erase(it);
            }
        }
        else
        {
            push_head(num);
            pop(it->second);
        }
    }
    int find(int num)
    {
        map<int, listnode*>::iterator it = lr.find(num);
        if (it == lr.end())
            return -1;
        else
        {
            push_head(num);
            pop(it->second);
        }
        return it->first;
    }
private:
    listnode* head;
    map<int, listnode*> lr;
    int size;
};
       在插入和查找数据的时候,会将数据放在list头部,在LRU里的size沾满之后,要接着插入数据就会将最久未使用的数据压缩(在这里由于我加入的是int,所以就删除掉),查找数据的话就会将数据放在队列头。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值