首页 > 代码库 > LRU Cache
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.
思路:使用map和list实现LRU cache,map能够加速查找速度,而list能够快速地动态插入和删除节点。
每次若访问命中,即key存在于cache中,则将其对应的list中的元素移至list首部。然后,对于get,返回list首部元素的value值;对于set,修改list首部元素的value值。
若访问未命中,对于get,返回-1;对于set,将新的“key-地址”映射和“key-value”值对分别插入map中和list的首部。
若cache已达到容量上限,则插入新元素之后,应从list尾部删除一个元素,并将其key值对应的“key-地址”映射从map中删除。
1 class Node 2 { 3 public: 4 Node(): key(-1), value(-1) {} 5 Node( int aKey, int aValue ): key(aKey), value(aValue) {} 6 int key; 7 int value; 8 }; 9 10 class LRUCache{11 public:12 LRUCache(int capacity) { this->capacity = capacity; }13 14 int get(int key) {15 if( cacheMap.find( key ) != cacheMap.end() ) {16 list<Node>::iterator iter = cacheMap[key];17 cacheList.splice( cacheList.begin(), cacheList, iter );18 cacheMap[key] = cacheList.begin();19 return cacheList.begin()->value;20 }21 return -1;22 }23 24 void set(int key, int value) {25 if( cacheMap.find( key ) != cacheMap.end() ) {26 list<Node>::iterator iter = cacheMap[key];27 cacheList.splice( cacheList.begin(), cacheList, iter );28 cacheMap[key] = cacheList.begin();29 cacheList.begin()->value =http://www.mamicode.com/ value;30 } else {31 if( cacheMap.size() == capacity ) {32 cacheMap.erase( cacheList.back().key );33 cacheList.pop_back();34 }35 cacheList.push_front( Node(key,value) );36 cacheMap[key] = cacheList.begin();37 }38 }39 40 public:41 int capacity;42 list<Node> cacheList;43 unordered_map<int,list<Node>::iterator> cacheMap;44 };