我是靠谱客的博主 贤惠蓝天,最近开发中收集的这篇文章主要介绍LRU的C++实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(Least Recently Used Algorithm,LRU)

关于操作系统的内存管理,如何节省利用容量不大的内存最多的进程提供资源,一直是研究的重要方向。而内存的虚拟存储管理,是现在最通用,最成功的方式—— 在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息。这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。

然而,有利就有弊,虚拟页式存储管理减少了进程所需的内存空间,却也带来了运行时间变长这一缺点:进程运行过程中,不可避免地要把在外存中存放的一些信息和内存中已有的进行交换,由于外存的低速,这一步骤所花费的时间不可忽略。因而,采取尽量好的算法以减少读取外存的次数,也是相当有意义的事情。


LRU的实现有这样几种思路:

1、利用数组保存节点信息,另外节点信息除了内容还需要保存最近使用情况。

缺点:每次都需要遍历来找信息,同时也要遍历来删除(指LRU cache满了的情况)

2、链表来保存节点,双向链表,最末端为最新使用的,这样能减少删除时候的时间效率。


其实,还可以用一个哈希表来储存key值对应的节点的地址,这样就可以实现查找O(1),删除添加O(1)了。。。。。

以下为Leetcode上的LRU Cache,只用到链表。

题目要求有get,有set。

// 连表的形式来储存;
// 链表头为最早入表的节点,链表尾为最新的节点;
struct MyListNode{
	int key;
	int val;
	MyListNode* next;
	MyListNode* pre;
	MyListNode(int k, int v):key(k), val(v), next(NULL), pre(NULL){}
};
class LRUCache{
public:

	LRUCache(int capacity):cap(capacity), nodeNum(0), pHead(NULL), pTail(NULL) {
	}

	int get(int key) {
		if(pHead == NULL)
		{
			return -1;
		}
		MyListNode* pNode = pHead;
		while(pNode != NULL)
		{
			if(pNode->key == key)
			{
				int val = pNode->val;
				DeleteFromList(pNode);
				AddToList(pNode);
				return val;
			}
			pNode = pNode->next;
		}

		return -1;
	}

	void set(int key, int value) {
		MyListNode* pNode = pHead;
		while(pNode != NULL)
		{
			if(pNode->key == key)
			{
				pNode->val = value;
				DeleteFromList(pNode);
				AddToList(pNode);
				return;
			}
			pNode = pNode->next;
		}

		pNode = new MyListNode(key, value);
		AddToList(pNode);
	}
	void AddToList(MyListNode* pNode){
		if(nodeNum == cap)
		{
			MyListNode* pTmp = pHead;
			pHead = pHead->next;
			DeleteFromList(pTmp);
			delete pTmp;
			AddToList(pNode);
		}
		else
		{
			++nodeNum;
			if(nodeNum == 1)
			{
				pHead = pNode;
				pTail = pNode;
			}
			else
			{
				pTail->next = pNode;
				pNode->pre = pTail;
				pNode->next = NULL;
				pTail = pNode;
			}
		}
	}
	void DeleteFromList(MyListNode* pNode){
		MyListNode* pPre = pNode->pre;
		MyListNode* pNext = pNode->next;
		nodeNum--;
		if(pPre == NULL)
		{
			pHead = pNext;
		}
		else
		{
			pPre->next = pNext;
		}

		if(pNext == NULL)
		{
			pTail = pPre;
		}
		else
		{
			pNext->pre = pPre;
		}
	}
	MyListNode* pHead;
	MyListNode* pTail;
	int nodeNum;
	int cap;
};




最后

以上就是贤惠蓝天为你收集整理的LRU的C++实现的全部内容,希望文章能够帮你解决LRU的C++实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部