IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++实现LRU缓存 -> 正文阅读

[数据结构与算法]C++实现LRU缓存

1、LRU概念:

least recently used,最近最少使用是一种存页面置换算法;
缺页异常(缺页中断):当 CPU 访问的页面不在物理内存时,便会产生?个缺页中断,请求操作系统将所缺页调入到物理内存。
在这里插入图片描述
在第4步找空闲页,找不到空闲页的话,就说明此时内存已满了,这时候,就需要页面置换算法选择?个物理页。
LRU 是通过历史的使用情况来推测要淘汰的页面。额外开销较大:需要寄存器和栈的硬件支持。
完全实现 LRU,需要在内存中维护?个所有页面的链表,最近最多使用的页面在表头,最近最少使用的页面在表尾。

2、LRU实现

双向链表+哈希map;map存储数据实现查找效率O(1);

双向链表实现逻辑:

1、新数据插入在链表头 。
2、缓存的数据被访问,把它移到链表头 。
3、新数据插入到上限,尾部数据删除,新数据放在头部。

struct ListNode       //双向链表节点结构体
{
	int Key;
	int Value;
	ListNode* pre;
	ListNode* next;
	
	ListNode(int key, int value) : Key(key),Value(value),pre(nullptr), next(nullptr) {}
	ListNode() : Key(0), Value(0), pre(nullptr), next(nullptr) {}
};
class LRU
{
private:
		int capacity;
		ListNode* head;        //头结点
		ListNode* tail;        //尾节点
		map<int, ListNode*>mp;
public:
		LUR(int size)       // 构造函数
		{
			capacity = size;
			head = new ListNode();
			tail = new ListNode();
			head->next = tail;
			tail->pre = head;
		}
		~LRU()   //析构
		{	
			if(head != nullptr){
				delete head;
				head == nullptr;
			}
			if(tail != nullptr){
				delete tail;
				tail ==NULL;
			}
			for (auto& a : mp) {
 				if (a.second != nullptr) {
 					delete a.second;
 					a.second = nullptr;
 				}
 			}
		}
		
		void Remove(ListNode* Node)  //移除,还没删除
		{	
				Node->pre->next = Node->next;
				Node->next->pre = Node->pre;
		}
		void Puthead(ListNode* node) //最近数据放在头部
		{
			node->pre = head;
            node->next = head->next;
            head->next->pre = node;
            head->next = node;
		}
		void moveToHead(ListNode* node)  //移动到头部
        {
            Remove(node);
            Puthead(node);
        }
        ListNode* removeTail()        //移除最后一个结点
        {
        	ListNode* node = tail->pre;
        	Remove(node);
        	return node;
    	}
    	
    	void Set(int key, int value)   //插入数据,存在只更新
		{
			if(mp.find(key) != mp.end())  // 存在只更新
			{
				ListNode* Node = mp[key];
				Node->Value = value;
 				moveToHead(Node);
				return;
			}
			else
			{
				ListNode* newNode = new ListNode(key, value);
				if(mp.size() >= capacity)
				{
					ListNode* removed = removeTail();
                	// 删除哈希表中对应的项
                	mp.erase(removed->Key);
                	// 防止内存泄漏
                	delete removed;
				}
				Puthead(newNode);
				mp[key] = newNode;
			}
		}
		int Get(int key)
		{
			if(mp.find(key) != mp.end())
			{
				ListNode* Node = mp[key];
				moveToHead(Node);        //最近访问放到头部
				return Node->Value;
			}
			else return -1;
		}
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 12:07:09  更:2021-08-27 12:09:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:00:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码