LRU算法的一种实现方法

一,说明

LRU即最近未使用算法,是一种比较常用的内存管理算法,它在内存不足时通过唤出最近未使用的数据来确保新的数据可存储进去,说白了就是一种按进入内存的时候来淘汰数据和方法,所以得有一种数据结构来按顺序来存储数据,双向链表是一种很好的选择。

二,源码

源码中采用stl::list双向链表来存储数据,unordered_map来存储key到数据的映射关系。 get操作的时间复杂度是o(1), set操作的时候复杂度在cache没有命中时为o(n),所以set的时候复杂度为O(N)

/*************************************************************************> File Name: LRUCache.cpp> Author:zhangtx> Mail: 18510665908@163.com > Created Time: 2018年04月13日 星期五 10时52分19秒************************************************************************/
#include<iostream>
#include <map>
#include <list>
using namespace std;
struct Data
{int m_key;int m_data;
};
class LRUCache {
public:/** @param capacity: An integer*/LRUCache(int capacity):m_capacity(capacity),m_count(0) {// do intialization if necessary}/** @param key: An integer* @return: An integer*/int get(int key) {// write your code heremap<int,Data*>::iterator iter=m_data.find(key);if (iter != m_data.end()){move_to_list_head(iter->second);return iter->second->m_data;}elsereturn -1;}/** @param key: An integer* @param value: An integer* @return: nothing*/void set(int key, int value) {// write your code heremap<int,Data *>::iterator iter=m_data.find(key);if (iter != m_data.end()){Data *pdata=new Data;pdata->m_key = key;pdata->m_data = value;m_data[key]=pdata;move_to_list_head(iter->second);}else{if (m_count>=m_capacity)remove_data();Data *pdata=new Data;pdata->m_data = value;pdata->m_key = key;m_data[key] = pdata;m_list.push_front(pdata);m_count++;}return ;}void remove_data(){Data *data=m_list.back();m_list.pop_back();m_data.erase(data->m_key);delete data;m_count--;}void move_to_list_head(struct Data *data){list<Data*>::iterator iter=m_list.begin();for (;iter!=m_list.end(); iter++){if ((*iter)->m_key==data->m_key)break;}m_list.push_front(m_data[(*iter)->m_key]);m_list.erase(iter);}
private:map<int,Data *> m_data;list<Data*> m_list;int  m_capacity;int  m_count;
};
int main(int argc,char *argv[])
{LRUCache lRUCache(2);lRUCache.set(2,1);lRUCache.set(1,2);cout<<lRUCache.get(2);lRUCache.set(4,1);cout<<lRUCache.get(1);cout<<lRUCache.get(2);
}

LRU算法的一种实现方法相关推荐

  1. 索骥馆-编程语言之《算法引论-一种创造性方法》扫描版[PDF]

    内容介绍: 本书是国际算法大师乌迪·曼博(UdiManber)博士撰写的一本享有盛誉的著作.全书共分12章:第1章到第4章为介绍性内容,涉及数学归纳法.算法分析.数据结构等内容:第5章提出了与归纳证明 ...

  2. OpenRASP xss算法的几种绕过方法

    openrasp默认只能检测反射型XSS,存储型XSS仅IAST商业版支持.对于反射型xss,openrasp也只能检测可控输出点在html标签外的情况,本文的绕过方法是针对这种情况.如果可控输出点在 ...

  3. C语言学习笔记:(四)算法的5种表示方法

    目录 一.用自然语言表示算法 二.用流程图表示算法 (一)基本概念及简单实例 (二)三种基本结构 三.用N-S图表示算法 四.用伪代码表示算法 五.用计算机语言表示算法 本节所用例题为计算5!. 一. ...

  4. 手把手带你拆解 LRU 算法

    手把手带你拆解 LRU 算法 文章目录 手把手带你拆解 LRU 算法 概述 [146. LRU 缓存](https://leetcode-cn.com/problems/lru-cache/) LRU ...

  5. linux页面算法源码,LRU算法原理解析

    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的. 现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理.他将主存 ...

  6. LRU算法,以及Apache LRUMap源码解析

    1. 什么是LRU LRU(least recently used) : 最近最少使用 LRU就是一种经典的算法,在容器中,对元素定义一个最后使用时间,当新的元素写入的时候,如果容器已满,则淘汰最近最 ...

  7. 深入理解 操作系统 LRU算法(以洛谷P1540题为例)

    LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...

  8. LRU实现 Java 两种版本(使用自带LinkedHashMap和自己构造LinkedHashMap)

    LRU简介 LRU 算法就是一种缓存淘汰策略 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓 ...

  9. LRU算法四种实现方式介绍

    LRU全称是Least Recently Used,即最近最久未使用的意思. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...

  10. 缓存算法(FIFO 、LRU、LFU三种算法的区别)

    FIFO算法 FIFO 算法是一种比较容易实现的算法.它的思想是先进先出(FIFO,队列),这是最简单.最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小.空间满的时 ...

最新文章

  1. java oauth sso 源码_基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践
  2. sql server优化策略
  3. python unpack infinity_fit_转换出错:输入包含NaN、infinity或对dtype(“float64”)太大的值...
  4. #HTTP协议学习# (七)cookie
  5. Ethercat解析(十五)之程序框架
  6. 反射 数据类型_这是一份超全面详细的Java反射机制学习指南
  7. 爬虫-3.urllib请求
  8. Spyder IDE中使用git
  9. 使用函数计算打包下载OSS文件
  10. Dr.COM 宽带认证客户端频繁掉线问题解决方案
  11. android高德地图热力图,没有编程基础也可通过高德地图完成炫酷的热力图分析...
  12. HTTP协议概述 基本概念说明
  13. Azido-TAT,大环化合物,双功能螯合剂的性质
  14. cpu_relax()函数的意义
  15. 阿里云服务器 云对象存储OOS(一) ---入门级操作
  16. python 查找二维数组长度_Python二维数组中的查找
  17. 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)
  18. 火狐浏览器上的广告过滤插件
  19. python读二进制 float_Python 二进制读文件 转换 float 失败
  20. scrapy组件、中间件、spider中类方法from_crawler的作用

热门文章

  1. C#中的线程(三)多线程
  2. Reflector7.5.2.1的Bug
  3. linux之sed使用
  4. Oracle中记录被锁解锁方法
  5. VC绘制控件如何防止闪烁
  6. IIS架设FTP服务器图文教程
  7. 多个时间合并并集mysql_写个 Go 时间交并集小工具
  8. mysql 接收中文字符,MYSQL匹配中文字符
  9. android 字体加粗_Android小技巧之TextView字体加粗
  10. 在python中使用最小二乘法画出拟合曲线_Python基于最小二乘法实现曲线拟合示例...