LRU(Least Recently Used最近最少使用)的c++实现(顺序表)

最近重修程序设计能力,有一句话对我的修行计划有很好的指导,能力(知识+思考+实践),三项中缺乏最多的就是实践,也是最耗时的。花了一早上写的一个简单的LRU程序

问题的抽象如下图:默认尾部为刚进入cache,头部为最近最久未使用

  1 //代码默认的cache有3块大小
  2
  3 #include <iostream>
  4
  5 using namespace std;
  6
  7 //定义cache类,实现顺序表cache以及LRU的用到了查找,删除和插入操作
  8 class cache
  9 {
 10 public:
 11     int arr[3];
 12     int arrlen;
 13     int current;
 14
 15     cache()
 16     {
 17         arr[0] = 0;
 18         arr[1] = 0;
 19         arr[2] = 0;
 20
 21         arrlen = 0;
 22         current = 0;
 23     }
 24
 25     int findNode(int value)   //查找节点
 26     {
 27         if(arrlen == 0)
 28         {
 29             cout << "cache为空" << endl;
 30             return -1;
 31         }
 32         for(int i = 0; i < 3; ++i)
 33         {
 34             if(arr[i] == value)
 35             {
 36                 current = i;
 37                 return 1;
 38             }
 39         }
 40         return 0;
 41
 42     }
 43     void deleteNode(int position) //删除节点(current)
 44     {
 45         if(arrlen == 0)
 46         {
 47             cout << "数组空,删除无效" << endl;
 48             return ;
 49         }
 50         if(position > 2)
 51         {
 52             cout << "删除位置不合法" << endl;
 53             return ;
 54         }
 55         for(int i = position; i < position; ++i)
 56         {
 57             arr[i] = arr[i+1];
 58         }
 59         arrlen--;
 60
 61     }
 62     void insertNode(int valuecc)  //插入节点(尾)
 63     {
 64         if(arrlen != 0)
 65         {
 66             for(int i = 2; i > 0; --i)
 67             {
 68                 arr[i] = arr[i-1];
 69             }
 70         }
 71         //bank *node= new bank;
 72         arr[0] = valuecc;
 73         arrlen = arrlen + 1;
 74     }
 75 };
 76 int main()
 77 {
 78     cache cc;
 79     int value;
 80     while(cin >> value)
 81     {
 82         if(cc.arrlen < 3)
 83         {
 84             if(cc.findNode(value) == 1)
 85             {
 86                 cc.deleteNode(cc.current);
 87                 cc.insertNode(value);
 88             }
 89             else
 90             {
 91                 cc.insertNode(value);
 92             }
 93
 94         }
 95         else
 96         {
 97             if(cc.findNode(value) == 1)
 98             {
 99                 cc.deleteNode(cc.current);
100                 cc.insertNode(value);
101             }
102             else
103             {
104                 cc.current = 2;
105                 cc.deleteNode(cc.current);
106                 cc.insertNode(value);
107             }
108         }
109     }
110     for(int i = 0; i <= 2; i++)
111     {
112         cout << cc.arr[i] << endl;
113     }
114     return 0;
115 }
时间: 2024-10-22 10:06:20

LRU(Least Recently Used最近最少使用)的c++实现(顺序表)的相关文章

LRU (Least Recently Used) 算法的Java实现

实现代码如下: import java.util.LinkedHashMap; import java.util.Map; /**  * LRU (Least Recently Used) 算法的Java实现  * @param <K>  * @param <V>  * @author 杨尚川  */ public class LRUCache<K, V> extends LinkedHashMap<K, V> {     //缓存大小     privat

使用LRU(last recently used)算法淘汰数据实例

某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问一下数据项的时候:1,5,1,3,5,2,4,1,2出现缓存直接命中的次数是?,最后缓存中即将准备淘汰的数据项是? 答案:3, 5 解答: 1调入内存 1 5调入内存 1 5 1调入内存 5 1(命中 1,更新次序) 3调入内存 5 1 3 5调入内存 1 3 5 (命中5) 2调入内存 1 3 5 2 4调入内存(1最久未使用,淘汰1) 3 5 2 4 1调入内存(3最久未使用,淘汰3) 5 2 4 1 2调入内存 5

MongoDB整理笔记のCapped Collection

1.简单介绍 capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小.如果空间用完,新添加的对象将会取代集合中最旧的对象. 2.功能特点 可以插入及更新,但更新不能超出collection 的大小,否则更新失败.不允许删除,但是可以调用drop() 删除集合中的所有行,但是drop 后需要显式地重建集合.在32 位机

MongoDB常用命令及例子详细介绍(三)

常用命令,及其高级命令使用介绍 一:增删改查的高级应用详细介绍: 增:***插入的时候c1不在的话将自动创建*** 不管插入那条记录都会自动给带个值id 自增主键唯一 insert 和 save(当id冲突是则修改,否则插入) 一:id主键不冲突的情况没区别 db.c1.insert({name:"leyangjun"}); db.c1.insert({name:"leyangjun"}); insert插入的值id都是唯一的,不会主键id冲突 db.c1.save

mongodb的固定集合(优化效率)

mongodb固定集合(Capped Collection)和大文件管理(GridFS) Capped Collection 固定集合(Capped Collection)是性能出色的有着固定大小的集合,以LRU(Least Recently Used最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先制定大小,如果空间用完,新添 加的对象将会取代集合中最旧的对象,永远保持最新的数据. 查看集合的状态信息 db.cot1.stats();

LRU 实现缓存

LRU:Least Recently used 最近最少使用 1.使用LinkedHashMap实现 inheritance实现方式 继承map类 可以使用Collections.synchronizedMap方式实现线程安全的操作 public class LruCache<K,V> extends LinkedHashMap<K,V> { private final int MAX_CACHE_SIZE; public LruCache(int cacheSize) { sup

Java集合详解5:深入理解LinkedHashMap和LRU缓存

Java集合详解5:深入理解LinkedHashMap和LRU缓存 今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/11/collection5 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net

Map 综述(二):彻头彻尾理解 LinkedHashMap

摘要: HashMap和LinkedList合二为一即是LinkedHashMap.所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表LinkedList的HashMap.由于LinkedHashMap是HashMap的子类,所以LinkedHashMap自然会拥有HashMap的所有特性.比如,LinkedHashMap的元素存取过程基本与HashMap基本类似,只是在细节实现上稍有不同.当然,这是由LinkedHashMap

为何Redis要比Memcached好用

Redis是新兴的通用存储系统,而Memcached仍有其适用领域 Memcached还是Redis? 在现代高性能Web应用中这一直是个争论不休的话题. 在基于关系型数据库的Web应用需要提高性能时,使用缓存是绝大多数架构师的第一选择,自然,Memcached和Redis通常是优先选择. 共同特征 都是 key-value 形式的内存数据库 都是NoSQL家族的数据管理解决方案 都基于同样的key-value 数据模型 所有数据全部放在内存中(这也是适用于缓存的原因) 性能得分不分伯仲,包括数