【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

这篇具有很好参考价值的文章主要介绍了【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、定义

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。
Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

二、LRU模拟实现

146.LRU缓存
【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存),数据结构,缓存,leetcode

下面我们就借力扣的这道题来简单实现一个

题目中要求我们以O(1)的时间复杂度来完成,查找的话我们首先肯定会想到哈希表,但又涉及一个问题,我们查找完之后还需要更新一下刚刚查找数据的位置,将这个数据置为是新的数据,我们如何解决查找完改变数据的标识也做到O(1)呢?

要保持高效实现O(1)的put和get,那么使用双向链表和
哈希表的搭配是最高效和经典的
。使用双向链表是因为双向链表可以实现任意位置O(1)的插入和删除,使用哈希表是因为哈希表的增删查改也是O(1)。
【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存),数据结构,缓存,leetcode

需要注意:这里最巧的设计就是将unordered_map的value type放成list<pair<int, int>>::iterator,因为这样,当get一个已有的值以后,就可以直接找到key在list中对应的iterator,然后将这个值移动到链表的头部,保持LRU。文章来源地址https://www.toymoban.com/news/detail-777974.html

二、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<list>
#include<unordered_map>

using namespace std;


class LRUCache {

public:
	LRUCache(int capacity)
		:_capacity(capacity)
	{}

	int get(int key) {
		
		auto ret = _hashMap.find(key);
		//在hash中找到了key存的地方
		if (ret != _hashMap.end()) {
			LtIter it = ret->second;

			//将it移动到_LRUList的头部
			_LRUList.splice(_LRUList.begin(), _LRUList, it);
			return it->second;
		}
		else {
			return -1;
		}
	}

	void put(int key, int value) {
		auto ret = _hashMap.find(key);

		//原来没有key的数据则添加
		if (ret == _hashMap.end()) {

			//LRU满了,删除最近最少使用的就是链表尾部
			if (_capacity == _hashMap.size()) {
				pair<int, int>back = _LRUList.back();

				_hashMap.erase(back.first);//删哈希里面
				//链表里面k存的和哈希的是同一个key
				_LRUList.pop_back();//删链表尾部
			}
			//放入新的数据到链表头部
			_LRUList.push_front(make_pair(key, value));
			//哈希表中添加
			_hashMap[key] = _LRUList.begin();
		}

		//原来有key的数据则更新
		else {
			LtIter it = ret->second;
			it->second = value;
			//将这个位置移到链表头部
			_LRUList.splice(_LRUList.begin(), _LRUList, it);
		}
	}

private:
	//链表存kv结构
	//k为key值,v为我们要更新的数据
	typedef list<pair<int, int>>::iterator LtIter;//重命名链表迭代器

	int _capacity; // 容量大小,超过容量则换出,保持LRU
	//_LRUList假设链表头部为最近使用的,尾部为最近最少使用
	list<pair<int, int>> _LRUList;
	//hash中存放的是key值与对应链表迭代器的的映射关系
	unordered_map<int, LtIter>_hashMap;
 };

到了这里,关于【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法训练-模拟 一】模拟设计LRU缓存结构

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是LRU缓存结构设计,这类题目出现频率还是很高的,几乎所有大厂都常考。 当然面对这道题,首先要讲清楚LRU是干什么的 LRU(Least Recently Used)缓存结构是一种常见的缓存管理策略, 用于

    2024年02月10日
    浏览(34)
  • [算法与数据结构]:LRU Cache 的原理与C++实现

    ​ LRU全称是Least Recently Used,即 最近最久未使用,是一种简单的缓存策略。顾名思义,LRU 算法会选出最近最少使用的数据进行淘汰。 ​ 那么什么是缓存(Cache)呢?缓存是一种提高数据读取性能的技术,可以有效解决存储器性能和容量的矛盾,是一种空间换时间的设计思想,比

    2024年01月20日
    浏览(36)
  • LRU数据结构

    LRU缓存是非常经典的数据结构设计,本文重点在于设计出get、put方法时间复杂度都为O(1)的LRU缓存 LRU缓存特征是当超出容量时会将最近最少使用的元素逐出 第一次的失败尝试——记录有效区间 记录有效区间的方法是通过计数器counter为每一个最近使用的元素记录最新计数,在

    2024年02月15日
    浏览(30)
  • 数据结构:LRU Cache

    LRU 是 Least Recently Used 的缩写,意思是最近最少使用,它是一种 Cache 替换算法。 什么是 Cache ?狭义的 Cache 指的是位于 CPU 和主存间的快速 RAM , 通常它不像系统主存那样使用 DRAM 技术,而使用昂贵但较快速的 SRAM 技术。 广义上的 Cache 指的是位于速度相差较大的两种硬件之间

    2024年02月19日
    浏览(23)
  • 数据结构---LRU CACHE

    通过之前的学习我们知道计算机在处理任务的时候是先将数据从硬盘中提取出来加载进内存,然后再将内存中的数据加载进入cpu进行计算,但是这里存在一个问题cpu的计算速度非常快,而内存中加载数据的速度又很慢,所以为了提供整机的工作效率我们就得在内存和cpu计算机

    2024年02月15日
    浏览(28)
  • LRU 该用什么数据结构

    LRU(最近最少使用),是一种缓存置换算法。缓存是用来存储常用的数据,加速常用数据访问的数据结构。有软件实现,比如数据库的缓存;也有硬件实现,比如我们上一讲学的 TLB。 缓存设计中有一个重要的环节:当缓存满了,新的缓存条目要写入时,哪个旧条目被置换出

    2024年02月06日
    浏览(28)
  • 【数据结构】“栈”的模拟实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 栈 :一种特殊的线性

    2024年02月12日
    浏览(31)
  • 【数据结构】顺序队列模拟实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 一、队列的基本概念

    2024年02月10日
    浏览(28)
  • 模拟实现链式二叉树及其结构学习——【数据结构】

    W...Y的主页 😊 代码仓库分享 💕 之前我们实现了用顺序表完成二叉树(也就是堆),顺序二叉树的实际作用就是解决堆排序以及Topk问题。 今天我们要学习的内容是链式二叉树,并且实现链式二叉树,这篇博客与递归息息相关! 目录 链式存储 二叉树链式结构的实现 链式二叉

    2024年02月07日
    浏览(28)
  • 【数据结构】二叉树的模拟实现

    前言:前面我们学习了堆的模拟实现,今天我们来进一步学习二叉树,当然了内容肯定是越来越难的,各位我们一起努力! 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博主和博主一起学习!一起努力! 树是一

    2024年02月03日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包