首先是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. keras图片数据增强ImageDataGenerator

    datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shea ...

  2. Xposed反射字段流程分析

    在XposedBridge源码中,反射字段的方法封装在de.robv.android.xposed.XposedHelpers类里面.下面来看看Xposed是如何获取和设置字段的值的 获取字段的值 获 ...

  3. Nacos 集群部署

    关于nacos 集群部署,网上的示例往往不全或不可用,而官方的教程太简单了.官方也提供了一个 docker  + nacos 的伪集群的 部署示例.但毕竟是 伪, 不能实际生产使用. 全网就几乎就没有 ...

  4. Spring Boot2.2.X中Tomcat配置 错误定制

    1: Tomcat定制 EmbeddedServletContainerCustomizer 已久废弃 按照下面的方式来处理 通过的类的配置 @Component public class Tomca ...

  5. Image 缩略图

    方法一:通过调用Image对象的自带方法GetThumbnailImage()进行图片转换. /// <summary> /// 生成缩略图重载方法,返回缩略图的Image对象 /// & ...

  6. CSS之border绘制三角形

    用CSS的border可以画出高质量的三角形. 我们一般会这么使用border: #test-border { width: 100px; height: 100px; margin: 100px a ...

  7. 配置基于服务器认证的Dynamics 365 Customer Engagement和SharePoint Online集成

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. Redhat Linx使用Centos yum源

    一.故障现象: 在安装了Read linux后,使用yum安装软件,出现如下提示:[root@localhost~]# yum install xxxLoaded plugins: product-i ...

  9. mybatis基础 笔记

    Mybatis依赖<!--测试--> <dependency>      <groupId>junit</groupId>      <artif ...

  10. CentOS 7怎么删除mariadb

    参考链接:https://www.cnblogs.com/ytkah/p/10876824.html