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,所以就删除掉),查找数据的话就会将数据放在队列头。