首先是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,);
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,);
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 -;//表示没有找到
} void LRU::set(int key,int value)
{
if(lis.size()>=cap)
{
lis.pop_back();
}
LRUNode * searchNode=new LRUNode(key,);
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();
lru->set(,);
lru->printLis();
lru->set(,);
lru->printLis();
lru->set(,);
lru->printLis();
lru->set(,);
lru->printLis();
lru->set(,);
lru->printLis();
lru->set(,);
lru->printLis();
lru->set(,);
lru->printLis();
return ;
}

运行结果:


LRU的实现(使用list)的更多相关文章

  1. Android图片缓存之Lru算法

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  2. OS存储管理——FIFO,LRU,OPT命中率

    课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...

  3. [LeetCode] LRU Cache 最近最少使用页面置换缓存器

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  4. 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

    在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...

  5. 页置换算法FIFO、LRU、OPT

    页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...

  6. LRU LFU FIFO 转载

    -------------------------------------->href--------------------------> http://blog.chinaunix.n ...

  7. 缓存淘汰算法--LRU算法

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...

  8. 【leetcode】LRU Cache

    题目简述: Design and implement a data structure for Least Recently Used (LRU) cache. It should support t ...

  9. memcache的lru删除机制

    惰性删除,get时才删除 LRU原理:当某个单元被请求的时候,维护一个计数器,通过计数器来判断最近谁最少使用,那就把谁踢出去. 注:即使某个key设置的永久有效,也会被踢出来,这个就是永久数据被踢的现 ...

  10. 链表&LRU

    简介 链表就是链式存储数据的一种数据结构.双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针). class DSChain<T> { //使用栈来进行废弃空间回收 priv ...

随机推荐

  1. Mysql - 高可用方案之MMM(二)

    一.概述 上一篇博客中(https://www.cnblogs.com/ddzj01/p/11535796.html)介绍了如何搭建MMM架构,本文将通过实验介绍MMM架构的优缺点. 二.优点 1. ...

  2. C# -- 优先获取电脑C盘之外的磁盘来保存数据

    C# -- 优先获取电脑C盘之外的磁盘来保存数据 1. 优先获取电脑C盘之外的磁盘来保存数据.没有其他盘则使用C盘. public string GetSaveDataDiskPath() { str ...

  3. ES-映射和分析

    参考: https://es.xiaoleilu.com/052_Mapping_Analysis/00_Intro.html 1. 概念 映射(mapping)机制用于进行字段类型确认,将每个字段匹 ...

  4. centos7设置服务开机自启

    1.在/usr/lib/systemd/system/路径下创建文件 ***.service. 写入如下内容 [Unit]Description=nginxAfter=network.target [ ...

  5. 《Web Development with Go》Middleware之使用gorilla.handlers

    可以方便的使用日志和压缩等功能. package main import ( "fmt" "log" "net/http" "os ...

  6. RabbitMQ基础理解

    RabbitMQ基本理解 MQ是消息中间件,常见的有RabbitMQ,Kafka,RocketMQ,activeMQ 等,用于分布式系统中.作用有三点 解耦 异步 削峰 RabbitMQ 整体上是一个 ...

  7. jmeter相关知识学习记录

    基于Jmeter5.2.1 断言之响应断言 响应断言:对服务器的响应接口进行断言校验,来判断接口测试得到的接口返回值是否正确. 测试字段就是指要断言的内容的匹配处. 响应文本:就是响应的body部分: ...

  8. numpy函数查询手册

    写了个程序,对Numpy的绝大部分函数及其说明进行了中文翻译. 原网址:https://docs.scipy.org/doc/numpy/reference/routines.html#routine ...

  9. TopCoder12727 「SRM590Hard」FoxAndCity 最小割离散变量模型

    问题描述 一张 \(N\) 个点无向图,边权都为 \(1\) ,添加若干条边,最小化 \(\sum\limits_{1 \le i \le n,i \in N_{+}}{(a_i-b_i)^2}\). ...

  10. 推荐系统| ② 离线推荐&基于隐语义模型的协同过滤推荐

    一.离线推荐服务 离线推荐服务是综合用户所有的历史数据,利用设定的离线统计算法和离线推荐算法周期性的进行结果统计与保存,计算的结果在一定时间周期内是固定不变的,变更的频率取决于算法调度的频率. 离线推 ...