LRU页面置换算法(最近最少)的实现

题目描述:
在这里插入图片描述
思路:
首先,最直观的想法就是用STL中的list(双向链表)保存缓存中的key,表头节点表示最近操作的数据,表尾节点表示当前缓存中最少使用的数据,再利用map保存key-value。每次put操作时先用find函数在list中查找key,如果存在则将key换到list的表头;不存在就检查list是否已经满了,如果list已满就把表尾节点删除再在表头插入新节点,否则直接在表头插入新节点。

class LRU
{
public:

	LRU(int capacity)
	{
		sz = capacity;
	}
	int get(int key)
	{   //如果get时结点存在,那么需要把结点移动到list头部
		if (ump.find(key) != ump.end())
		{
			put(key, ump[key]->second);
			return ump[key]->second;
		}
		return -1;
	}
	void put(int key, int val)
	{
		//如果key已经存在list中,先删除该结点
		if (ump.find(key) != ump.end())
		{
			lst.erase(ump[key]);
		}
		else if(lst.size()>=sz)//如果list容量已满,则删除list尾部的结点
		{
			ump.erase(lst.back().first);
			lst.pop_back();
		}
		//把新结点添加在list的头部
		lst.push_front({ key,val });
		//保存结点到map中
		ump[key] = lst.begin();
	}

private:
	int sz;
	//list存储所有的key和val
	list<pair<int, int>> lst;
	//存储每一个key在list中的结点位置
	unordered_map<int, list<pair<int, int>>::iterator> ump;

};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值