返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中怎么利用LeetCode使用页面置换缓存器
  • 728
分享到

C++中怎么利用LeetCode使用页面置换缓存器

2023-06-20 18:06:12 728人浏览 八月长安
摘要

c++中怎么利用LeetCode使用页面置换缓存器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。[LeetCode] 146. LRU Cache 最近最少使用页面置换缓存

c++中怎么利用LeetCode使用页面置换缓存器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

[LeetCode] 146. LRU Cache 最近最少使用页面置换缓存器

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
put(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

Follow up:
Could you do both operations in O(1) time complexity?

Example:

LRUCache cache = new LRUCache( 2 );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // returns 1
cache.put(3, 3);    // evicts key 2
cache.get(2);       // returns -1 (not found)
cache.put(4, 4);    // evicts key 1
cache.get(1);       // returns -1 (not found)
cache.get(3);       // returns 3
cache.get(4);       // returns 4

这道题让我们实现一个 LRU 缓存器,LRU 是 Least Recently Used 的简写,就是最近最少使用的意思。那么这个缓存器主要有两个成员函数,get 和 put,其中 get 函数是通过输入 key 来获得 value,如果成功获得后,这对 (key, value) 升至缓存器中最常用的位置(顶部),如果 key 不存在,则返回 -1。而 put 函数是插入一对新的 (key, value),如果原缓存器中有该 key,则需要先删除掉原有的,将新的插入到缓存器的顶部。如果不存在,则直接插入到顶部。若加入新的值后缓存器超过了容量,则需要删掉一个最不常用的值,也就是底部的值。具体实现时我们需要三个私有变量,cap, l和m,其中 cap 是缓存器的容量大小,l是保存缓存器内容的列表,m是 HashMap,保存关键值 key 和缓存器各项的迭代器之间映射,方便我们以 O(1) 的时间内找到目标项。

然后我们再来看 get 和 put 如何实现,get 相对简单些,我们在 HashMap 中查找给定的 key,若不存在直接返回 -1。如果存在则将此项移到顶部,这里我们使用 C++ STL 中的函数 splice,专门移动链表中的一个或若干个结点到某个特定的位置,这里我们就只移动 key 对应的迭代器到列表的开头,然后返回 value。这里再解释一下为啥 HashMap 不用更新,因为 HashMap 的建立的是关键值 key 和缓存列表中的迭代器之间的映射,get 函数是查询函数,如果关键值 key 不在 HashMap,那么不需要更新。如果在,我们需要更新的是该 key-value 键值对儿对在缓存列表中的位置,而 HashMap 中还是这个 key 跟键值对儿的迭代器之间的映射,并不需要更新什么。

对于 put,我们也是现在 HashMap 中查找给定的 key,如果存在就删掉原有项,并在顶部插入新来项,然后判断是否溢出,若溢出则删掉底部项(最不常用项)。代码如下:

class LRUCache{public:    LRUCache(int capacity) {        cap = capacity;    }        int get(int key) {        auto it = m.find(key);        if (it == m.end()) return -1;        l.splice(l.begin(), l, it->second);        return it->second->second;    }        void put(int key, int value) {        auto it = m.find(key);        if (it != m.end()) l.erase(it->second);        l.push_front(make_pair(key, value));        m[key] = l.begin();        if (m.size() > cap) {            int k = l.rbegin()->first;            l.pop_back();            m.erase(k);        }    }    private:    int cap;    list<pair<int, int>> l;    unordered_map<int, list<pair<int, int>>::iterator> m;};

关于C++中怎么利用LeetCode使用页面置换缓存器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网其他教程频道了解更多相关知识。

--结束END--

本文标题: C++中怎么利用LeetCode使用页面置换缓存器

本文链接: https://lsjlt.com/news/298945.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中怎么利用LeetCode使用页面置换缓存器
    C++中怎么利用LeetCode使用页面置换缓存器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。[LeetCode] 146. LRU Cache 最近最少使用页面置换缓存...
    99+
    2023-06-20
  • C++实现LeetCode(146.近最少使用页面置换缓存器)
    [LeetCode] 146. LRU Cache 最近最少使用页面置换缓存器 Design and implement a data structure for Leas...
    99+
    2024-04-02
  • C++中怎么利用LeetCode拆分词
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode拆分词,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 140.Word Break II 拆分词句之二Given a&...
    99+
    2023-06-20
  • Redis中怎么使用缓存替换策略
    Redis中怎么使用缓存替换策略,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 概述在操作系统的页面管理中,内存会维护一部分数据以备进程使用,但是由于内存的大小必然是远远...
    99+
    2023-06-20
  • 改善用户体验:ASP 页面片段缓存的利器
    ASP 页面片段缓存是什么? ASP 页面片段缓存是一个内置于 ASP.NET Core 应用程序中的功能,它允许您缓存页面中某些部分的输出。当后续请求这些页面片段时,将使用缓存的输出,从而避免重复生成这些片段。 如何启用 ASP 页面...
    99+
    2024-02-21
    ASP 页面片段缓存 用户体验 性能优化 网站速度
  • C#中缓存System.Web.Caching怎么用
    今天小编给大家分享一下C#中缓存System.Web.Caching怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sy...
    99+
    2023-06-30
  • C++中怎么利用LeetCode移除元素
    这篇文章给大家介绍C++中怎么利用LeetCode移除元素,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[LeetCode] 27. Remove Element 移除元素Given an array num...
    99+
    2023-06-20
  • Pipes中怎么利用LeetCode转置文件
    这篇文章给大家介绍Pipes中怎么利用LeetCode转置文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[LeetCode] 194.Transpose File 转置文件Given a text file&nbs...
    99+
    2023-06-20
  • 缓存的利器:ASP 页面片段缓存提高网站可用性的终极指南
    ASP.NET 页面片段缓存是一种高效的机制,用于存储和快速检索网站页面的片段。通过利用缓存,您可以显着提高网站的性能、可扩展性和响应能力。本文将深入探讨 ASP.NET 页面片段缓存的各个方面,并提供分步指南,说明如何将其集成到您的网站...
    99+
    2024-03-05
    ASP.NET、缓存、页面片段缓存、网站可用性
  • C++中怎么利用LeetCode实现快乐数
    这篇文章给大家介绍C++中怎么利用LeetCode实现快乐数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[LeetCode] 202.Happy Number 快乐数Write an algorithm to det...
    99+
    2023-06-20
  • C++中怎么利用LeetCode克隆无向图
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode克隆无向图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 133. Clone Graph 克隆无向图Given&nb...
    99+
    2023-06-20
  • pushState中怎么利用Ajax实现无刷新页面切换
    pushState中怎么利用Ajax实现无刷新页面切换,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、API1、pushSt...
    99+
    2024-04-02
  • C++中怎么利用LeetCode求位1的个数
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode求位1的个数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 191.Number of 1 Bits 位1的个数Wri...
    99+
    2023-06-20
  • C++中怎么利用LeetCode颠倒二进制位
    C++中怎么利用LeetCode颠倒二进制位,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。[LeetCode] 190. Reverse Bits 颠倒二进制位...
    99+
    2023-06-20
  • C++中怎么利用LeetCode移除链表元素
    今天就跟大家聊聊有关C++中怎么利用LeetCode移除链表元素,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。[LeetCode] 203.Remove Linked List El...
    99+
    2023-06-20
  • C++中怎么利用LeetCode读取N个字符
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode读取N个字符,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 158. Read N Characters Given ...
    99+
    2023-06-20
  • C++中怎么利用LeetCode实现两数相除
    这篇文章将为大家详细讲解有关C++中怎么利用LeetCode实现两数相除,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。[LeetCode] 29. Divide Two Integers 两...
    99+
    2023-06-20
  • C#中怎么使用Couchbase实现分布式缓存
    C#中怎么使用Couchbase实现分布式缓存,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和...
    99+
    2023-06-17
  • Spring中如何集成Ehcache使用页面以及对象缓存
    Spring中如何集成Ehcache使用页面以及对象缓存,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Ehcache在很多项目中都出现过,用法也比较简单。一般的加些配置就可...
    99+
    2023-06-17
  • C#怎么使用CallContext缓存线程数据
    本篇内容主要讲解“C#怎么使用CallContext缓存线程数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用CallContext缓存线程数据”吧!一、CallContext 概述...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作