LRU(Least Recently Used)算法简单介绍

LRU算法简介

LRU英文翻译过来就是least recently used,字面意思就是最近最少使用,说白了就是一种淘汰算法,当有新的元素插入进来的时候,我们的使用空间又是有限的时候,就需要淘汰旧的元素,这时候就会选择淘汰最近最少使用的元素。

使用场景

我们实现一个功能就是登陆的时候会保存每个user的ip,首先这个ip会插入数据库里面,系统启动的时候会更新到缓存里面,如果所以每次用户登陆的时候我们会先查询缓存里面是否有这个user,如果没有再查询数据库,如果数据库没有就会请求api查询这个user的ip然后更新到缓存跟数据库,随着user的增加缓存的数量也会增加,这样就会非常的耗内存,所以我们会制定一定数量的内存然后存取一定数量的user,然后就会面临着一个淘汰的机制,这个时候LRU算法就派上了用场。

简单实现

/**
 * Created by dc on 2019/6/29.
 * lru算法 least recently userd 最近最少使用的数据
 */
public class LruMap {

    /**
     * 头部节点,最后被使用的数据
     */
    private Node head;
    /**
     * 尾部节点,最近最少被使用的节点
     */
    private Node tail;
    /**
     * 存储数量
     */
    private int limit;

    private Map<String,Node> data;

    public LruMap(int limit) {
        this.data = new HashMap<>();
        this.limit
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++中最近最少使用算法LRU)的示例代码: ```c++ #include <iostream> #include <unordered_map> #include <list> using namespace std; class LRUCache { private: int capacity; unordered_map<int, list<pair<int, int>>::iterator> cache; // 哈希表,映射key和双向链表中的迭代器 list<pair<int, int>> lruList; // 双向链表,保存 (key, value) 二元组 public: LRUCache(int capacity) { this->capacity = capacity; } int get(int key) { if (cache.find(key) == cache.end()) { return -1; // 如果 key 不存在,则返回 -1 } // 把 (k, v) 提到链表头部,并更新map中该节点的迭代器 pair<int, int> kv = *cache[key]; lruList.erase(cache[key]); lruList.push_front(kv); cache[key] = lruList.begin(); return kv.second; } void put(int key, int value) { if (cache.find(key) == cache.end()) { // 如果 key 不存在 if (lruList.size() == capacity) { // 如果缓存满了 // 删除链表尾部的键值对,并删除map中对应的项 auto lastPair = lruList.back(); int lastKey = lastPair.first; cache.erase(lastKey); lruList.pop_back(); } // 在链表头部插入新的键值对,并在map中创建该项的迭代器 lruList.push_front(make_pair(key, value)); cache[key] = lruList.begin(); } else { // 如果 key 存在 // 更改链表中的节点值,并把该节点提到头部 lruList.erase(cache[key]); lruList.push_front(make_pair(key, value)); cache[key] = lruList.begin(); } } }; int main() { LRUCache cache(2); // 缓存容量为 2 cache.put(1, 1); cache.put(2, 2); cout << cache.get(1) << endl; // 返回 1 cache.put(3, 3); // 该操作会使得关键字 2 作废 cout << cache.get(2) << endl; // 返回 -1 (未找到) cache.put(4, 4); // 该操作会使得关键字 1 作废 cout << cache.get(1) << endl; // 返回 -1 (未找到) cout << cache.get(3) << endl; // 返回 3 cout << cache.get(4) << endl; // 返回 4 return 0; } ``` LRU算法的核心是使用一个双向链表和一个哈希表,其中哈希表的键为key,值为指向双向链表中的节点的迭代器。每当访问一个节点时,将其从双向链表中删除,并将其插入到链表头部,同时更新哈希表中的值。当缓存满时,删除链表尾部的节点。当插入一个新的节点时,如果缓存已满,则删除链表尾部的节点。如果缓存未满,则直接插入到链表头部。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值