146. LRU Cache

1、题目描述

设计一个LRU的缓存机制。实现get和put函数。


2、思路

用map m记录cache中每个键值对。

用map rec记录每个键被访问的时间戳。

get函数:如果在m中能找到key,则返回,且更新时间戳;若找不到,则返回-1.

普通函数:如果m中能找到key,则更新key对应值,以及时间戳;

如果找不到,若cache没满,则直接插入键值对,和对应的时间戳对。

如果cache满了,则找到时间戳最小的那个key,把它在m和rec中的记录删除,

再插入新的键值对,时间戳对。


3、代码

class LRUCache {
public:
    map<int,int>m;
    map<int,int>rec;
    int t;
    int n;
    int c;
    LRUCache(int capacity) {
        t=0;
        n=0;
        c=capacity;
    }
    
    int get(int key) {
        t++;
        if(c==0) return -1;
        if(m.find(key)==m.end())
            return -1;
        else{
            rec[key]=t;
            return m[key];    
        }
    }
    
    void put(int key, int value) {
        t++;
        if(n>0&&m.find(key)!=m.end()){
            m[key]=value;
            rec[key]=t;
        }
        else{
            if(n<c){
                n++;
                m[key]=value;
                rec[key]=t;
            }
            else{
                map<int,int>::iterator it = rec.begin();
                int k = -1,recmin = INT_MAX;
                for(;it!=rec.end();it++){
                    if(it->second<recmin){
                        k = it->first;
                        recmin = it->second;
                    }
                }
                it = m.find(k);
                m.erase(it);
                it = rec.find(k);
                rec.erase(it);

                m[key]=value;
                rec[key]=t;
            }
        }
        
        
    }
};

法2:

class LRUCache {
    map<int,int> keysAges; //(time,key)
    map<int,pair<int,int>> LRU_CACHE; //(key,(value,time))
    int timer;
    int capacity;
public:
    LRUCache(int capacity) {
        this->capacity = capacity;
        this->timer = 0;
    }
    
    int get(int key) {
        auto&& iter = LRU_CACHE.find(key);
        if(iter == LRU_CACHE.end()) return -1;
        else {
            auto&& elem_time = iter->second.second;
            keysAges.erase(elem_time);
            iter->second.second = timer;
            keysAges[timer++] = key;
            return iter->second.first;
        }    
    }
    
    void put(int key, int value) {
        auto&& iter = LRU_CACHE.find(key);
        if(iter == LRU_CACHE.end()){
            if((LRU_CACHE.size() + 1 > capacity)){
                assert(keysAges.size() >= 1);
                auto&& begin = keysAges.begin();
                LRU_CACHE.erase(begin->second);
                keysAges.erase(begin->first);
            }
        } else {
            auto&& elem_time = iter->second.second;
            keysAges.erase(elem_time);
        }
        LRU_CACHE[key] = pair<int,int>(value,timer);
        keysAges[timer++] = key;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值