C++ LRU

LRU:最近最少使用缓存,实现 LRUCache 类:

  • LRUCache(int capacity) :以正整数作为容量capacity,初始化LRU缓存。
  • int get(int key):如果关键字 key 存在于缓存中,则返回关键字的值,否则返回-1。
  • void put(int key, int value):如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value。如果插入操作导致关键字数量超过 capacity ,则应该逐出最久未使用的关键字。
    函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

总是希望最近使用的、最频繁使用的数据存储在比较靠前的位置。于是,LRU 缓存要具备以下特点:

  • 插入某个数据时,它应该被放到 Cache 的最前面
  • 查询某个数据之后,它应该被挪到 Cache 的最前面
  • 插入数据时,如果 Cache 的容量不够时,把 Cache 尾部的数据移出

一个常见的LRU缓存的实现思路是使用哈希表和双向链表结合的方法:

  1. 哈希表: 存储键和指向其在双向链表中节点的指针,用于O(1)时间复杂度内查找键。
  2. 双向链表: 存储键值对,链表的顺序由元素的使用顺序决定。最近使用的元素被放置在链表的前端,而最少使用的元素则被放置在链表的尾端。

如果考虑线程安全性,就需要用到锁,C++中的mutex,配合std::lock_guard使用。

#include<iostream>
#include <string.h>
#include<mutex>

namespace _LRU{
   

// 设计一个不限类型的线程安全的LRU,还不让使用STL
template<typename K, typename V>
class Node{
   
public:
    K key;
    V value;
    Node* prev;
    Node* next;

    Node(K k, V v):key(k),value(v),prev(nullptr),next(nullptr){
   }

};

template<typename K, typename V>
class LRUCache{
   
public:
    LRUCache(int cap) : capacity(cap),size(0){
   
        head = new Node<K,V>(K(),V()
LRU(Least Recently Used)是一种常见的页面置换算法,也可以用于缓存淘汰策略。在LRU算法中,缓存满时,会将最近最少使用的数据淘汰掉,以腾出空间存储新的数据。下面是一个C++实现的LRU缓存类的示例代码: ```c++ #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> lru; public: LRUCache(int capacity) { this->capacity = capacity; } int get(int key) { if (cache.find(key) == cache.end()) { return -1; } // 将访问的元素移到链表头部 lru.erase(cache[key].second); lru.push_front(key); cache[key].second = lru.begin(); return cache[key].first; } void put(int key, int value) { if (cache.find(key) != cache.end()) { // 更新元素的值,并将其移到链表头部 lru.erase(cache[key].second); lru.push_front(key); cache[key] = {value, lru.begin()}; } else { if (cache.size() == capacity) { // 淘汰最近最少使用的元素 cache.erase(lru.back()); lru.pop_back(); } // 将新元素插入链表头部 lru.push_front(key); cache[key] = {value, lru.begin()}; } } void print() { for (auto it = lru.begin(); it != lru.end(); ++it) { cout << *it << " "; } cout << endl; } }; ``` 在上面的代码中,LRUCache类包含三个私有成员变量:capacity表示缓存的容量,cache是一个哈希表,用于存储键值对和对应的链表迭代器,lru是一个双向链表,用于存储键的访问顺序。LRUCache类提供了get和put两个公有方法,分别用于获取和插入元素。在get方法中,如果元素存在,则将其移到链表头部,并返回其值;否则返回-1。在put方法中,如果元素已存在,则更新其值,并将其移到链表头部;否则,如果缓存已满,则淘汰最近最少使用的元素,并将新元素插入链表头部。LRUCache类还提供了一个print方法,用于打印当前缓存中的所有键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值