146. LRU缓存机制*【力扣】

212 篇文章 0 订阅
30 篇文章 0 订阅

题意理解

设计一个最近最少使用的LRU缓冲机制的类

问题分析

使用STL

hash表unordered_map,双链表list。

list用于缓冲区;map用于查询元素位置:list中存放key,value 对,map存放key和list的迭代器。

双链表可以插入头push_front,删除头pop_front,插入尾push_back,删除尾pop_back,

其他

0801:保证get,put都是o(1),需要查询和任意元素增删改效率都很高,还保持先后顺序。我们知道最快的查询是hash,最快的任意元素增删改是双向链表。重复用key做关键字,利用链表的迭代器只是链表的具体位置。

链接

public:
    LRUCache(int capacity) {
        cap = capacity;
    }
    void print() {
        cout << "======" << endl;
        for (auto pair:buffer) {
            cout << pair.first << ' ' << pair.second;
        }
        cout << endl;
    }
    int get(int key) {
        //cout << "get start" << endl;
        //print();
        int val = -1;
        if (dict.count(key)) {
            auto it = dict[key];
            val = it -> second;
            buffer.erase(it);
            buffer.push_front(make_pair(key, val));
            dict[key] = buffer.begin();
        }
        //cout << "get end" << endl;
        //print();
        return val;
    }
    
    void put(int key, int value) {
        //cout << "put start" << endl;
        //print();
        if (dict.count(key)) {
            auto it = dict[key];
            buffer.erase(it);
            buffer.push_front(make_pair(key,value));
            dict[key] = buffer.begin();
        }
        else if (buffer.size() < cap) {
            buffer.push_front(make_pair(key,value));
            dict[key] = buffer.begin();
        }
        else {
            //获取最后一个key
            int old_key = buffer.back().first;
            //删除dict中的key
            dict.erase(old_key);
            //删除buffer最后一个记录
            buffer.pop_back();
            //插入新记录
            buffer.push_front(make_pair(key,value));
            //插入(key,新纪录)到dict
            dict[key]=buffer.begin();
        }
        //cout << "put end" << endl;
        //print();
    }
private:
    list<pair<int,int>> buffer;
    unordered_map<int,list<pair<int,int>>::iterator> dict;
    int cap = 0;
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值