LRU(Least Recently Used) cache.

class LRUCache 
{
    
    Map<Integer, DlinkedNode> map;
    DlinkedNode head;
    DlinkedNode tail;
    int capacity;
    int count;
    public LRUCache(int cap) 
    {
        map = new HashMap<>();
        head = new DlinkedNode(-1, -1);
        tail = new DlinkedNode(-1, -1);
        capacity = cap;
        count = 0;
        head.right = tail;
        tail.left = head;
    }   
    public int get(int key) 
    {
        if(!map.containsKey(key)) return -1;
        DlinkedNode node = map.get(key);
        moveTohead(node);
        return node.val;
    }  
    public void put(int key, int value) 
    {
        if(!map.containsKey(key))
        {
            DlinkedNode node = new DlinkedNode(key, value);
            map.put(key, node);
            addToHead(node);
            count++;
            if(count > capacity)
            {
                DlinkedNode deleNode = tail.left;
                removeTail(deleNode);
                map.remove(deleNode.key);
                count--;
            }
        }
        else
        {
            DlinkedNode node = map.get(key);
            node.val = value;
            map.put(key, node);
            moveTohead(node);
        }
    }

    public void addToHead(DlinkedNode node)
    {
        node.right = head.right;
        node.left = head;
        head.right.left = node;
        head.right = node;
    }
    public void removeTail(DlinkedNode node)
    {
        DlinkedNode pre = node.left;
        DlinkedNode post = node.right;
        pre.right = post;
        post.left = pre;
    }
    public void moveTohead(DlinkedNode node)
    {
        removeTail(node);
        addToHead(node);
    }
    
}

class DlinkedNode
{
    int key;
    int val;
    DlinkedNode left;
    DlinkedNode right;
    public DlinkedNode(int k, int v)
    {
        key = k;
        val = v;
        left = null;
        right = null;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值