LRU的实现(使用list)

Posted jsonzhangaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LRU的实现(使用list)相关的知识,希望对你有一定的参考价值。

首先是LRU的定义,LRU表示最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高。

所以逻辑应该是每次都要将新被访问的页放到列表头部,如果超过了list长度限制,就将列表尾部的元素踢出去。

 

主要结构,STL中的双向链表结构list。

主要操作有get,表示访问key对应的value,此时要查询双链表,找到key对应value,再将其从list中删除,插入到list的头部。

     set,  表示设置对应的key值为value,此时先找到key对应的元素,将其从list中删除,再插入到list的头部。

这里设置了两个辅助函数remove和setHead,分别负责删除元素和将元素加入到list头部。

 

代码实现如下:

#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>

using namespace std;

class LRUNode

    public:
        int key,value;
        LRUNode(int _key,int _value):key(_key),value(_value)
        
        
        bool operator==(LRUNode * p)
        
            return key==p->key;
        
;

class LRU

    public:
        int get(int key);
        void set(int key,int val);
        LRU(int _cap):cap(_cap)
        
        
        int cap;//代表存放的最大页数
        void remove(int key);
        void setHead(int key,int val);
        void printLis();
        list<LRUNode *> lis;
;

void LRU::printLis()

    list<LRUNode *>::iterator it;
    for(it=lis.begin();it!=lis.end();it++)
    
        cout<<(*it)->key<<" "<<(*it)->value<<endl;
    
    cout<<endl;


void LRU::remove(int key)

    LRUNode * searchNode=new LRUNode(key,0);
    list<LRUNode *>::iterator it=find(lis.begin(),lis.end(),searchNode);
    if(it!=lis.end())
    
        lis.remove(*it);
    


void LRU::setHead(int key,int val)

    lis.push_front(new LRUNode(key,val));


int LRU::get(int key)

    LRUNode * searchNode=new LRUNode(key,0);
    list<LRUNode *>::iterator it=find(lis.begin(),lis.end(),searchNode);
    if(it!=lis.end())
    
        remove((*it)->key);
        setHead((*it)->key,(*it)->value);
        return (*it)->value;
    
    return -1;//表示没有找到


void LRU::set(int key,int value)

    if(lis.size()>=cap)
    
        lis.pop_back();
    
    LRUNode * searchNode=new LRUNode(key,0);
    list<LRUNode *>::iterator it=find(lis.begin(),lis.end(),searchNode);
    if(it!=lis.end())
    
        remove(key);
        setHead(key,value);
    
    else
    
        setHead(key,value);
    




int main()

    LRU * lru=new LRU(5);
    lru->set(1,1);
    lru->printLis();
    lru->set(2,2);
    lru->printLis();
    lru->set(3,3);
    lru->printLis();
    lru->set(4,4);
    lru->printLis();
    lru->set(5,5);
    lru->printLis();
    lru->set(6,6);
    lru->printLis();
    lru->set(7,7);
    lru->printLis();
    return 0;

运行结果:

1 1

2 2
1 1

3 3
2 2
1 1

4 4
3 3
2 2
1 1

5 5
4 4
3 3
2 2
1 1

6 6
5 5
4 4
3 3
2 2

7 7
6 6
5 5
4 4
3 3

 

以上是关于LRU的实现(使用list)的主要内容,如果未能解决你的问题,请参考以下文章

页面置换算法LRU(python语言实现)

FJUTOJ-3682 LRU算法的实现2 (链表+哈希)

LRU: C++代码实现

LRU: C++代码实现

LRU: C++代码实现

复杂的 LRU 缓存?