数据结构--链表--LRU缓存
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缓存相关推荐
- 看动画轻松理解「链表」实现「LRU缓存淘汰算法」
作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...
- 数据结构与算法 / LRU 缓存淘汰算法
一.诞生原因 缓存是一种提供数据读取性能的技术,在硬件设计.软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等.但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即: ...
- 06 | 链表(上):如何实现LRU缓存淘汰算法?
缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...
- LeetCode 146. LRU缓存机制(哈希链表)
文章目录 1. 题目信息 2. 解题 2.1 手动实现list 2.2 使用内置list 1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作 ...
- 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」
作者 | 吴至波 责编 | 胡巍巍 快速挑战Python全栈工程师: https://edu.csdn.net/topic/python115?utm_source=csdn_bw 前几节学习了「链表 ...
- 如何基于链表实现 LRU 缓存淘汰算法?
什么是LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高" ...
- 【文科生带你读JavaScript数据结构与算法】2. 双向链表与LRU缓存算法原理与实现(下)
上篇聊了聊双向链表(doubly linked list)这个数据结构,今天就来点更实际的,也可以用双链表来实现的一种生活工作中不可或缺的优化算法--LRU缓存(Least Recently Used ...
- 看动画理解「链表」实现LRU缓存淘汰算法
前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...
- 广义表head tail 运算_双链表实现LRU缓存淘汰策略
1.背景 LRU(Least Recently Used)是一种常用的缓存淘汰策略,即当缓存满了之后,删除最近最少使用的数据. LRU的实现,常用的编程语言在语言层面都有实现,可以直接使用.为了深入理 ...
最新文章
- 自定义ImageView系列
- Python中enumerate用法详解
- Java多线程(二):Callable和FutureTask结合使用获取返回值
- dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
- subclipse用法
- 绑定dictionary 给定关键字不再字典中_VBA代码集锦-利用字典做两列数据的对比并对齐...
- pdo 参数化查询 mysql函数_PDO笔记之参数化查询
- 基于ExoPlayer的ExoPlayerVideoView
- SLAM--卡尔曼滤波、粒子滤波
- 用了很多年的PC端离线版个人知识管理软件PKM2 Manager推荐给大家
- 计算机毕业设计Java演出票在线预定网站系统(源码+系统+mysql数据库+Lw文档)
- soapUI 接口测试断言
- Eclipse中source folder、folder、package的区别?
- 【文献翻译】用于5G蜂窝的毫米波移动通信:我看行!
- linux so 加壳,[android] 从加壳的so文件中抽出symbols
- Linux关闭防火墙命令
- 一个霸占程序员休息时间的 APP
- 总结Git下载及其操作
- paypal是怎么收费的?
- 三星s2 硬刷Android 8,六年老机吃上奥利奥:第三方三星S2安卓8.0刷机包发布