首页 > 其他分享 >LRU

LRU

时间:2024-07-02 12:52:32浏览次数:1  
标签:capacity int cache 链表 LRU key lruList

#include <iostream>
#include <unordered_map>
#include <list>

using namespace std;

class LRUCache {
private:
    int capacity;
    unordered_map<int, pair<int, list<int>::iterator>> cache;
    list<int> lruList;

public:
    LRUCache(int capacity) {
        this->capacity = capacity;
    }
    
    int get(int key) {
        if (cache.find(key) != cache.end()) {
            // 更新访问顺序
            lruList.splice(lruList.begin(), lruList, cache[key].second);
            return cache[key].first;
        } else {
            return -1;
        }
    }
    
    void put(int key, int value) {
        if (cache.find(key) != cache.end()) {
            // 如果已经存在,更新值并更新访问顺序
            cache[key].first = value;
            lruList.splice(lruList.begin(), lruList, cache[key].second);
        } else {
            // 如果不存在,插入新值
            if (cache.size() >= capacity) {
                // 移除最久未使用的元素
                int lruKey = lruList.back();
                cache.erase(lruKey);
                lruList.pop_back();
            }
            // 插入新元素
            lruList.push_front(key);
            cache[key] = {value, lruList.begin()};
        }
    }
};

int main() {
    LRUCache lruCache(2);

    lruCache.put(1, 1);
    lruCache.put(2, 2);
    cout << lruCache.get(1) << endl; // 输出 1
    lruCache.put(3, 3);
    cout << lruCache.get(2) << endl; // 输出 -1,因为键 2 不再缓存中
    lruCache.put(4, 4);
    cout << lruCache.get(1) << endl; // 输出 -1,因为键 1 不再缓存中
    cout << lruCache.get(3) << endl; // 输出 3
    cout << lruCache.get(4) << endl; // 输出 4

    return 0;
}

实现说明:

  • LRUCache 类:通过双向链表 lruList 记录访问顺序,哈希表 cache 用于快速查找键值对。

  • 构造函数:初始化缓存容量 capacity

  • get 方法:根据给定的键 key 返回对应的值。如果存在于缓存中,则将其移到链表头部表示最近使用;否则返回 -1

  • put 方法:插入或更新缓存。如果键已存在,则更新其值,并将其移到链表头部。如果缓存达到容量上限,则淘汰最近最少使用的元素,并在链表头部插入新元素。

  • main 函数:示例展示了如何使用 LRUCache 类,进行插入、获取操作,并验证LRU算法的正确性。

这个实现基于哈希表和双向链表实现了高效的LRU缓存,保证了O(1)时间复杂度的get和put操作。

标签:capacity,int,cache,链表,LRU,key,lruList
From: https://www.cnblogs.com/whcjob/p/18279688

相关文章

  • 带有ttl的Lru在Rust中的实现及源码解析
    TTL是TimeToLive的缩写,通常意味着元素的生存时间是多长。应用场景数据库:在redis中我们最常见的就是缓存我们的数据元素,但是我们又不想其保留太长的时间,因为数据时间越长污染的可能性就越大,我们又不想在后续的程序中设置删除,所以我们此时需要设置过期时间来让数据自动淘汰。......
  • Lru-k在Rust中的实现及源码解析
    LRU-K是一种缓存淘汰算法,旨在改进传统的LRU(LeastRecentlyUsed,最近最少使用)算法的性能。将其中高频的数据达到K次访问移入到另一个队列进行保护。算法思想LRU-K中的“K”代表最近使用的次数。因此,LRU可以认为是LRU-1的特例。LRU-K的主要目的是为了解决LRU算法“缓存污染”的......
  • Leedcode【146】. LRU 缓存——Java实现
    Problem: 146.LRU缓存思路解题方法复杂度Code效果思路使用一个双向链表来维护缓存的访问顺序,最近使用的节点在链表头部,最久未使用的节点在链表尾部。使用一个哈希表来存储缓存中的键值对,哈希表中的键对应双向链表中的节点。解题方法Node类:表示双向链表的节点,每......
  • Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试
    性能测试,在编写代码后,单元测试及性能测试是重要的验收点,好的性能测试可以让我们提前发现程序中存在的问题。测试用例在Rust中,测试通常有两部分,一部分是文档测试,一部分是模块测试。通常我们在函数定义的开始可以看到以///三斜杠开头的就是文档注释发布的时候会将自动生成到docs.......
  • Lru在Rust中的实现, 源码解析
    LRU(LeastRecentlyUsed)是一种常用的页面置换算法,其核心思想是选择最近最久未使用的页面予以淘汰。LRU算法原理基本思想:LRU算法基于一个假设,即如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很低。因此,当缓存空间不足时,算法会选择最久未使用的数据进行......
  • 记录ILRuntime使用过程中的一些坑
    这是一些网友的文章,仅供参考,还没验证现在的ILRT版本是否还存在:ILRuntime热更方案坑点-那一轮弯月~-博客园(cnblogs.com) 1.在热更工程里使用主工程声明的二维索引器,会出错,目前还没测试是传入的二维坐标变成其他数字,还是返回的时候变成其他,亦或者是中间函数出问题,该BUG......
  • 前端记忆函数和LRU缓存
    在Js中,“记忆化(Memoization)”是一种优化技术,它通过存储昂贵函数的结果,并复用这些结果以避免重复执行,从而可以加快代码执行速度。这种技术在处理递归和迭代问题时尤其有用。下面是一个记忆化函数的一般实现:functionmemoize(fn){letcache={}returnfunction(.......
  • 算法:LRU 和 LFU 缓存淘汰算法
    零、资料LRU和LFU缓存淘汰算法(javascript与go语言实现) 一、基本概念LRU(LeastRecentlyUsed)和LFU(LeastFrequentlyUsed)是两种常见的缓存淘汰算法,用于在缓存空间有限的情况下选择合适的缓存对象进行淘汰,以提高缓存的利用效率LRU算法基于"最近最少使用"的原则进行淘汰......
  • ibatis-LruCache
    核心对象当Map存储key数量超出初始化设置的size时,标记最老的key,下次put时会自行删除eldestkey。Map<Object,Object>keyMap=newLinkedHashMap();为什么使用LinkedHashMap?支持头、尾,快速获取头结点,从Map中快速删除数据。实现removeEldestEntry方法,用于获取eldestKey。putO......
  • LruCache源码解析
    最近被问到LruCache原理一直觉得很简单的东西猛然一想,卧槽忘了,赶紧翻开源码瞧瞧!1、首先构造lrucache的时候会新建一个linkedHashMap来作为存储容器publicLruCache(intmaxSize){if(maxSize<=0){thrownewIllegalArgumentException("maxSize<=......