LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统。

属于 我们操作系统设计中的 时间局部性原理,最长时间未被访问的数据优先淘汰,当内存中已存在的数据再次被访问时,则进行热度的提升。

本文为了巩固数据结构相关知识,特 使用链表数据结构方式完整实现LRU链表的功能。关于数据结构和算法相关的学习导图可以借鉴数据结构和算法导图

实现算法思路:

   LRU 功能的实现:1. 已有链表中存在 待插入元素,则将该元素在链表中删除,并头插法到链表头节点2. 已有链表中不存在 待插入元素:a. 若 LRU 容量已满,则删除尾元素,头插当前元素b. 若 LRU 容量未满,则直接头插法当前元素

以上实现 使用其他的线性表数据结构(栈、队列、数组)均能够实现,链表的实现方式如下:

#include <iostream>using namespace std;typedef int DataType;/*节点类*/
class Node{public:DataType val;Node *next;
};class List{private:int maxSize;int length;Node *head;public:List();List(int size);~List();void insertElementBegin(DataType x); //头插法建立链表bool findElement(DataType x);        //查找链表中是否存在元素x,存在则返回true,不存在则返回falsevoid deleteElementEnd();             //删除链表的最后一个节点bool deleteElem(DataType x);         //删除链表中值为x的节点,删除成功则返回true,不存在则返回falsebool isEmpty();                      //判断链表是否为空,是则返回true,否则返回falsebool isFull();                       //判断链表是否满,是则返回true,否则返回falsevoid printAll();                     //打印链表中的元素,链表长度,LRU长度void * findElemOptim(DataType x);       //针对此应用的优化,查找,返回指定元素的前一个节点的指针void deleteElemOptim(void * node);     //针对此应用的优化,删除
};List::List(){head = new Node;head -> next = NULL;this -> length = 0;this -> maxSize = 10;
}List::List(int size) {head = new Node;head -> next = NULL;this -> length = 0;this -> maxSize = size;
}List::~List() {Node* p, *tmp;p = head;while(p -> next) {tmp = p -> next;p -> next = p -> next -> next;delete tmp;}delete head;this -> head = NULL;this -> length = 0;
}void List::insertElementBegin(DataType x) {Node *p = new Node;p -> val = x;p -> next = head -> next;head -> next = p;this -> length ++;
}bool List::findElement(DataType x) {Node *p = head;while(p -> next != NULL) {if(p -> val == x) {return true;}p = p -> next;}return false;
}void List::deleteElementEnd() {if(head -> next == NULL) {return;}Node *tmp;Node *p = head;while(p -> next != NULL && p -> next -> next != NULL) {p = p -> next;}tmp = p -> next;p -> next = tmp -> next;this -> length --;delete tmp;
}bool List::deleteElem(DataType x) {Node *p = head;Node *tmp;while(p -> next != NULL) {if(p -> next -> val == x) {tmp = p -> next;p -> next = tmp -> next;delete tmp;this -> length --;return true;}p = p -> next;}return false;
}bool List::isEmpty() {return this -> length == 0 ? true:false;
}bool List::isFull() {return this -> length == maxSize ? true:false;
}void List::printAll() {Node *p;p = head;cout << "lru list length :" << this -> length << endl;cout << "lru list maxSize :" << this -> maxSize << endl;cout << "lru list val:" << endl;while(p -> next != NULL) {p = p -> next;cout << p -> val << " ";}cout << endl;
}void * List::findElemOptim(DataType x) {Node *p = head;while(p -> next != NULL) {if(p -> next -> val == x) {return (void *)p;}p = p -> next;}return NULL;
}void List::deleteElemOptim(void *node) {Node *p, *tmp;p = (Node*)node;tmp = p -> next;p -> next = tmp -> next;delete tmp;this -> length --;
}int main() {cout << "test LRU:" << endl;List list(10);int num = 0;while(1) {cout << "please enter a number, 99999 = exit" << endl;cin >> num;if(num == 9999) {break;}/*LRU 功能的实现:1. 已有链表中存在 待插入元素,则将该元素在链表中删除,并头插法到链表头节点2. 已有链表中不存在 待插入元素:a. 若 LRU 容量已满,则删除尾元素,头插当前元素b. 若 LRU 容量未满,则直接头插法当前元素           */Node *node = (Node*)list.findElemOptim(num);if(node != NULL) {list.deleteElemOptim(node);list.insertElementBegin(num);} else {if(list.isFull()) {list.deleteElementEnd();list.insertElementBegin(num);} else {list.insertElementBegin(num);}}list.printAll();}return 0;
}

编译g++ -std=c++11 lru_list.cc

运行如下./a.out

test LRU:
please enter a number, 99999 = exit
2
lru list length :1
lru list maxSize :10
lru list val:
2
please enter a number, 99999 = exit
3
lru list length :2
lru list maxSize :10
lru list val:
3 2
please enter a number, 99999 = exit
4
lru list length :3
lru list maxSize :10
lru list val:
4 3 2
...
...
...
please enter a number, 99999 = exit #输入了34,此时LRU容量已满,则删除尾元素,头插入34
34
lru list length :10
lru list maxSize :10
lru list val:
34 23 12 11 1 8 7 3 2 6
please enter a number, 99999 = exit #输入23,提升23的热度
23
lru list length :10
lru list maxSize :10
lru list val:
23 34 12 11 1 8 7 3 2 6
please enter a number, 99999 = exit #输入2,提升2的热度
2
lru list length :10
lru list maxSize :10
lru list val:
2 23 34 12 11 1 8 7 3 6
please enter a number, 99999 = exit
9999

LRU算法 -- 链表 完整实现相关推荐

  1. Redis LRU算法

    一.配置Redis内存淘汰策略 maxmemory 100mbmaxmemory-policy allkeys-lrumaxmemory-samples 5 注意:Redis的LRU算法并非完整的实现 ...

  2. Redis的LRU算法

    2019独角兽企业重金招聘Python工程师标准>>> 整理自官方文档:将redis当做使用LRU算法的缓存来使用 当Redis被当做缓存来使用,当你新增数据时,让它自动地回收旧数据 ...

  3. 将redis当做使用LRU算法的缓存来使用

    当Redis被当做缓存来使用,当你新增数据时,让它自动地回收旧数据是件很方便的事情.这个行为在开发者社区非常有名,因为它是流行的memcached系统的默认行为. LRU是Redis唯一支持的回收方法 ...

  4. 十二、Redis LRU算法详述(Least Recently Used - 最近最少使用)

    简介 Redis是基于内存存储的 key-value 数据库.我们都知道,内存虽然快但空间大小有限,当物理内存达到上限时,系统就会跑的很慢,这是因为 swap 机制会将部分内存的数据转移到swap分区 ...

  5. C++圆形线性链表Cicular Linear Linked List算法(附完整源码)

    xor cipher异或密码的算法 结点结构体定义 圆形线性链表完整头文件cll.h 圆形线性链表完整源文件cll.cpp 圆形线性链表完整完整源码 main_ddl.cpp(main函数测试) 结点 ...

  6. c均值算法的设计与实现_如何使用C链表实现 LRU 算法

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

  7. c语言用单链表实现lru算法,利用单链表实现LRU算法

    利用单链表实现LRU算法 首先,我们先看下对于Node的定义: package datastructure.linklist.node; import lombok.Data; /** * 单链表节点 ...

  8. c语言用单链表实现lru算法,手写单链表实现和LRU算法模拟

    手写单链表,实现增删改查 package top.zcwfeng.java.arithmetic.lru; //单链表 public class LinkedList { Node list; int ...

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

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

最新文章

  1. android 找不到符号 符号 RequiresApi
  2. C# 仿金山毒霸启动和关闭淡入淡出效果
  3. 95后实习生的远程办公体验(asp.net mvc\C#技术栈)
  4. java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化
  5. socket 编程篇六之IPO多路复用-select poll epoll
  6. 不混淆so文件_浅尝ollvm轻度混淆后的加密算法分析
  7. 95-36-032-ChannelHandler-SimpleChannelInboundHandler
  8. HOJ 2275 Number sequence
  9. C# 中using的几个用途
  10. jQuery动态星级评分效果实现方法
  11. 传智播客 C/C++学习笔记 多级指针
  12. segue 分析小结
  13. w7文件加密提示没启用服务器,win7文件夹设置密码没有密钥提示该怎么解决
  14. Python + qrcode 实现文字转二维码
  15. 利用阿里云开发APP,实现远程数据接收
  16. openid php steam,Steam OpenID签名验证
  17. 用python写vip电影进行地址解析
  18. WE WANT U ┃中天微 国防科技大学2017届硕士专场校园宣讲会
  19. lol登入服务器显示证书,登录LOL提示安全证书不可用怎么办
  20. 在线压力并发工具AB版 简单易用

热门文章

  1. 结队编程-基于gui的四则运算生成器
  2. lists,tuples and sets of Python
  3. jsp error-page没有生效
  4. 新生选课系统使用指南
  5. 达内——java变量
  6. mysql 4.0.27 下载,CentOS编译Mysql 4.0.27数据库问题解决
  7. ps用法linux,在linux上使用ps(转载)
  8. vant组件实现上传图片裁剪_如何用 120 行代码,实现交互完整的拖拽上传组件?...
  9. pip 升级_python的pip命令
  10. egg extend ts_KPL官方给各战队排T次:大王DYG,AG是老2、TS仅K