LRU(Least Recently Used)缓存策略:

通俗的讲就是,最近使用的放在最前面,不经常使用的放后面,满了就删除

C++代码实现

//用单链表实现LRU策略   2019.3.17
#include <iostream>
#include <string>
using namespace std;
struct weburl
{string website;weburl *next;};
class webList
{weburl *p_head;size_t cacheSize;
public:webList():p_head(new weburl),cacheSize(0){p_head->next = NULL;    //犯错,开始没有写这句,导致后面有的地方非法访问}~webList(){eraseAll();delete p_head;}void eraseAll(){weburl *tempNode = p_head->next, *del_Node = NULL;while(tempNode != NULL){del_Node = tempNode;tempNode = tempNode->next;delete del_Node;cacheSize--;
//          tempNode = tempNode->next;    //千万注意顺序,之前放这错了!!!}}weburl* get_head(){return p_head;}weburl* find(string &str){weburl *tempNode = p_head;while(tempNode->next != NULL){if(tempNode->next->website == str)return tempNode;    //返回的是找到的节点的上一个节点elsetempNode = tempNode->next;}return NULL;}size_t getCacheSize(){return cacheSize;}void incrCacheSize(){cacheSize++;}void decrCacheSize(){cacheSize--;}void push_front(weburl *p){p->next = p_head->next;p_head->next = p;incrCacheSize();}void move_to_front(weburl *p){p->next = p_head->next;p_head->next = p;}void pop_back(){weburl *p = p_head, *prev = NULL;while(p->next != NULL){prev = p;p = p->next;}prev->next = NULL;delete p;decrCacheSize();}void printCacheList(){cout << "the recently visit website: " << endl;weburl *tempNode = p_head;size_t i = 0;while(tempNode->next != NULL){tempNode = tempNode->next;cout << ++i << " " << tempNode->website << endl;}}
};
int main()
{char conti = 'y';size_t maxCacheSize = 5;string web;webList cacheList;while(conti == 'y' || conti == 'Y'){cout << "-------------------------------------------" << endl;cout << "please enter the weburl you want to visit: " << endl;cin >> web;weburl *tempNode = cacheList.find(web);weburl *head = cacheList.get_head();if (tempNode == NULL)    //没有找到,是新的访问记录{weburl *newWeb = new weburl;newWeb->website = web;newWeb->next = NULL;if (cacheList.getCacheSize() < maxCacheSize) //存储没满,直接加到队首{cacheList.push_front(newWeb);} else    //存储满了,删除队尾,插入新的到队首{cacheList.pop_back();cacheList.push_front(newWeb);}} else    //从已有的数据中找到了记录{if (tempNode == head)    ;   //记录在第一条,则无需操作else {weburl *mvRecord = tempNode->next;tempNode->next = mvRecord->next;    //把该记录从链表中断开cacheList.move_to_front(mvRecord);  //把该记录移到队首}}cacheList.printCacheList();cout << "continue? y/n" << endl;cin >> conti;cin.get();}return 0;
}

Valgrind检查结果

数据结构--链表--LRU缓存相关推荐

  1. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」

    作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...

  2. 数据结构与算法 / LRU 缓存淘汰算法

    一.诞生原因 缓存是一种提供数据读取性能的技术,在硬件设计.软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等.但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即: ...

  3. 06 | 链表(上):如何实现LRU缓存淘汰算法?

    缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...

  4. LeetCode 146. LRU缓存机制(哈希链表)

    文章目录 1. 题目信息 2. 解题 2.1 手动实现list 2.2 使用内置list 1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作 ...

  5. 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」

    作者 | 吴至波 责编 | 胡巍巍 快速挑战Python全栈工程师: https://edu.csdn.net/topic/python115?utm_source=csdn_bw 前几节学习了「链表 ...

  6. 如何基于链表实现 LRU 缓存淘汰算法?

    什么是LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高" ...

  7. 【文科生带你读JavaScript数据结构与算法】2. 双向链表与LRU缓存算法原理与实现(下)

    上篇聊了聊双向链表(doubly linked list)这个数据结构,今天就来点更实际的,也可以用双链表来实现的一种生活工作中不可或缺的优化算法--LRU缓存(Least Recently Used ...

  8. 看动画理解「链表」实现LRU缓存淘汰算法

    前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...

  9. 广义表head tail 运算_双链表实现LRU缓存淘汰策略

    1.背景 LRU(Least Recently Used)是一种常用的缓存淘汰策略,即当缓存满了之后,删除最近最少使用的数据. LRU的实现,常用的编程语言在语言层面都有实现,可以直接使用.为了深入理 ...

最新文章

  1. 自定义ImageView系列
  2. Python中enumerate用法详解
  3. Java多线程(二):Callable和FutureTask结合使用获取返回值
  4. dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
  5. subclipse用法
  6. 绑定dictionary 给定关键字不再字典中_VBA代码集锦-利用字典做两列数据的对比并对齐...
  7. pdo 参数化查询 mysql函数_PDO笔记之参数化查询
  8. 基于ExoPlayer的ExoPlayerVideoView
  9. SLAM--卡尔曼滤波、粒子滤波
  10. 用了很多年的PC端离线版个人知识管理软件PKM2 Manager推荐给大家
  11. 计算机毕业设计Java演出票在线预定网站系统(源码+系统+mysql数据库+Lw文档)
  12. soapUI 接口测试断言
  13. Eclipse中source folder、folder、package的区别?
  14. 【文献翻译】用于5G蜂窝的毫米波移动通信:我看行!
  15. linux so 加壳,[android] 从加壳的so文件中抽出symbols
  16. Linux关闭防火墙命令
  17. 一个霸占程序员休息时间的 APP
  18. 总结Git下载及其操作
  19. paypal是怎么收费的?
  20. 三星s2 硬刷Android 8,六年老机吃上奥利奥:第三方三星S2安卓8.0刷机包发布

热门文章

  1. mac怎么用终端编写c语言视频,【新手提问】有知道用mac终端编c语言的网络编程的人吗?...
  2. 怎么卸载apowerrec_如何删除windows10自带应用
  3. centos7配置Docker镜像加速器
  4. 学习方向、当前要做的事
  5. 树莓派3B+学习笔记:4、查看GPIO
  6. Oracle开启关闭归档日志
  7. 王译潇20162314 第九周作业总结
  8. const参数,const返回值与const函数
  9. 黑马程序员---面向对象笔记总结
  10. gcc/g++编译器的优化