zoukankan      html  css  js  c++  java
  • LRU Cache

            hash+双向链表

    #include <iostream>
    #include <map>
    #include <list>
    #include <utility>
    using namespace std;
    
    class LRUCache{
    public:
        LRUCache(int capacity) {
            m_capacity = capacity ;
        }
    
        int get(int key) {
            int retValue = -1 ;
            map<int, list<pair<int, int> > :: iterator> ::iterator it = cachesMap.find(key) ;
    
             //如果在Cashe中,将记录移动到链表的最前端
            if (it != cachesMap.end())
            {
                retValue = it ->second->second ;
                //移动到最前端
                list<pair<int, int> > :: iterator ptrPair = it -> second ;
                pair<int, int> tmpPair = *ptrPair ;
                caches.erase(ptrPair) ;
                caches.push_front(tmpPair) ;
    
                //修改map中的值
                cachesMap[key] = caches.begin() ;
            }
            return retValue ;
    
            
        }
    
        void set(int key, int value) {
    
            map<int, list<pair<int, int> > :: iterator> ::iterator it = cachesMap.find(key) ;
    
            if (it != cachesMap.end()) //已经存在其中
            {
                 list<pair<int, int> > :: iterator ptrPait = it ->second ;
                ptrPait->second = value ;
                //移动到最前面
                pair<int , int > tmpPair = *ptrPait ;
                caches.erase(ptrPait) ;
                caches.push_front(tmpPair) ;
    
                //更新map
                cachesMap[key] = caches.begin() ;
            }
            else //不存在其中
            {
                pair<int , int > tmpPair = make_pair(key, value) ;
    
                if (m_capacity == caches.size()) //已经满
                {
                    int delKey = caches.back().first ;
                    caches.pop_back() ; //删除最后一个
    
                    //删除在map中的相应项
                    map<int, list<pair<int, int> > :: iterator> ::iterator delIt = cachesMap.find(delKey) ;
                    cachesMap.erase(delIt) ;
                }
    
                caches.push_front(tmpPair) ;
                cachesMap[key] = caches.begin() ; //更新map
            }
        }
    
    private:
        int m_capacity ;                                                                        //cashe的大小
        list<pair<int, int> > caches ;                                                    //用一个双链表存储cashe的内容
        map< int, list<pair<int, int> > :: iterator> cachesMap ;            //使用map加快查找的速度
    };
    
    int main(int argc, char **argv)
    {
        LRUCache s(2) ;
        s.set(2, 1) ;
        s.set(1, 1) ;
        cout << s.get(2) << endl;
        s.set(4, 1) ;
        cout << s.get(1) << endl;
        cout << s.get(2) << endl;
        return 0 ;
    }
  • 相关阅读:
    线性DP SGU167 I-country
    背包问题 POJ1742 Coins
    背包问题 codevs2210 数字组合
    dfs+贪心 BZOJ4027 [HEOI2015] 兔子与樱花
    spfa最短路+DP BZOJ1003 [ZJOI2006] 物流运输
    矩阵乘法 POJ3070 Fibonacci
    tarjan+spfa最短路 BZOJ1179 [Apio2009] Atm
    欧拉函数 BZOJ2190 [SDOI2008] 仪仗队
    矩阵乘法 洛谷 P3390【模板】矩阵快速幂
    裴蜀定理 BZOJ2299[HAOI2011] 向量
  • 原文地址:https://www.cnblogs.com/theCambrian/p/3950965.html
Copyright © 2011-2022 走看看