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,);
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)的更多相关文章
- Android图片缓存之Lru算法
前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...
- OS存储管理——FIFO,LRU,OPT命中率
课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...
- [LeetCode] LRU Cache 最近最少使用页面置换缓存器
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- 页置换算法FIFO、LRU、OPT
页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...
- LRU LFU FIFO 转载
-------------------------------------->href--------------------------> http://blog.chinaunix.n ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- 【leetcode】LRU Cache
题目简述: Design and implement a data structure for Least Recently Used (LRU) cache. It should support t ...
- memcache的lru删除机制
惰性删除,get时才删除 LRU原理:当某个单元被请求的时候,维护一个计数器,通过计数器来判断最近谁最少使用,那就把谁踢出去. 注:即使某个key设置的永久有效,也会被踢出来,这个就是永久数据被踢的现 ...
- 链表&LRU
简介 链表就是链式存储数据的一种数据结构.双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针). class DSChain<T> { //使用栈来进行废弃空间回收 priv ...
随机推荐
- 使用ReentrantLock
/** * java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁* 因为synchronized是Java语言层面提供的语法,所以 ...
- 精通awk系列(11):awk的工作流程
回到: Linux系列文章 Shell系列文章 Awk系列文章 awk工作流程 参考自:man awk的"AWK PROGRAM EXECUTION"段. man --pager= ...
- ASP.NET MVC5基础-过滤器(Filters)详解
什么是过滤器? 过滤器的类型与作用 定义过滤器 授权过滤器 动作过滤器 结果过滤器 异常处理过滤器 过滤器的使用方法 总结 什么是过滤器? 通过上一篇关于Controller控制器的文章我们知道,MV ...
- spring cloud学习与思考——总起篇
接下来就spring cloud( Spring Boot 2.0版本)写一个系列,一方面加深记忆理解,做个日志,另一个方面,借这个方式跟朋友们沟通交流. 1.Spring boot是Spring的一 ...
- 海康Poe 摄像头尾线与8根网线连接方法
家里海康POE摄像头铜丝断了一根,拆开自己接了个RJ44座,线序黑. 棕. 绿. 橙. 红. 黄. 紫. 蓝 以此 对应橙白.橙.绿白.蓝.蓝白.绿.棕白.棕经测试无误,可以正常使用
- MS16-072域内中间人攻击
0x01 漏洞利用 在目标主机域用户口令已知的条件下,目标主机在进行策略更新时,对域服务器的认证存在漏洞,攻击者劫持认证服务器的过程,引导至伪造的域服务器,并在域服务器中制定用户的计划任务策略,可以获 ...
- Oracle GoldenGate常用参数详解
Oracle GoldenGate常用参数详解http://blog.itpub.net/28389881/viewspace-2564461/
- ML.NET Model Builder 更新
ML.NET是面向.NET开发人员的跨平台机器学习框架,而Model Builder是Visual Studio中的UI工具,它使用自动机器学习(AutoML)轻松地允许您训练和使用自定义ML.NET ...
- 【模板】分治 FFT
Link Solution 有两种解法. 法1: 直接上分治FFT,也就是CDQ分治+FFT. 具体做法是先递归左半边,算出左半边答案之后,将左半边贡献到右半边,然后递归右半边. 分治是一个log的, ...
- curl 带 body
curl -H "Content-Type:plain/text" -X POST -d '<?xml version="1.0" encoding=&q ...