zoukankan      html  css  js  c++  java
  • Leetcode LRU Cache

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

    get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
    set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

    LRU是近期最少使用算法,其一个例子为:

    假设 序列为 4 3 4 2 3 1 4 2
    物理块有3个 则
    首轮 4调入内存 4
    次轮 3调入内存 3 4
    之后 4调入内存 4 3
    之后 2调入内存 2 4 3
    之后 3调入内存 3 2 4
    之后 1调入内存 1 3 2(因为最少使用的是4,所以丢弃4)
    之后 4调入内存 4 1 3(原理同上)
    最后 2调入内存 2 4 1
     
    对于set(key, value) ,
    如果不存在该cache
      如果cache已经达到了它的容量,则把最近最少使用的cache删除,然后插入新的cache
      否则直接插入新的cache
    如果存在该cache
      将该cache移动到前面,表示刚被使用
     
    对于get(key),
    如果不存在该cache,则返回-1
    否则将该cache移动到前面,表示刚被使用
     
    由于涉及到查找,由于hash_map的查找时间复杂度为O(1),故考虑用hash_map
    由于涉及到插入和删除,由于链表的插入删除时间复杂度为O(1),故考虑用list
    故将hash_map和list相结合
    class LRUCache{
    public:
        typedef pair<int,int> CacheItem;
        typedef list<CacheIterm>::iterator CacheItemIterator;
        typedef unordered_map<int,list<CacheItem>::iterator > CacheMap;
        typedef CacheMap::iterator CacheMapIterator;
        
        LRUCache(int capacity){
            m_capacity = capacity;
        }
        
        int get(int key){
            if(m_map.find(key) == m_map.end()) return -1;
            else{
                moveToFirst(key);
                return m_map[key]->second;
            }
        }
        
        void set(int key, int value){
            if(m_map.find(key) == m_map.end()){
                if(m_cache.size() >= m_capacity){
                    m_map.erase(m_cache.back().first);
                    m_cache.pop_back();
                }
                m_cache.push_front(CacheItem(key,value));
                m_map[key]=m_cache.begin();
                
            }else{
                m_map[key]->second = value;
                moveToFirst(key);
            }
        }
        
        void moveToFirst(int key){
            CacheItemIterator itemIter = cacheMap[key];
            m_cache.erase(itemIter);
            m_cache.push_front(*itemIter);
            m_map[key] = m_cache.begin();    
        }
        
    private:
        int m_capacity;
        CacheMap m_map;
        list<CacheItem> m_cache;
        
    };
     
  • 相关阅读:
    URAL——DFS找规律——Nudnik Photographer
    URAL1353——DP——Milliard Vasya's Function
    URAL1203——DPor贪心——Scientific Conference
    递推DP HDOJ 5389 Zero Escape
    区间DP UVA 1351 String Compression
    树形DP UVA 1292 Strategic game
    Manacher HDOJ 5371 Hotaru's problem
    同余模定理 HDOJ 5373 The shortest problem
    递推DP HDOJ 5375 Gray code
    最大子序列和 HDOJ 1003 Max Sum
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3795003.html
Copyright © 2011-2022 走看看