首页 > 代码库 > LRU Cache (9)

LRU Cache (9)

 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算法。但是在时间上有限制。首先,我查看了计算机组成原理,知道了在硬件上LRU是这么实现的。每行设置一个计数器,他们的cache每命中一次,命中行计数器清零,其他行计数器增加1。当需要替换时,比较各特定行的计数值,将计数值最大的行换出。

于是,我第一次就利用了这种思路,采用map这一数据结构,每当有一行命中时,这一行计数值清零,其他行计数值加1,每次换出计数值最大的行。但是很不幸,超时了!不能采用这种解法!

我上网找了一些解法,发现他们都是利用list+unordered_map的解法,如果行被命中,就将行移至list的头部,每次替换list尾部的行。算法了然于心,剩下的就是实现了!但是,就算你知道怎么做,其中也可能有各种各样的波折。我想起了刚学数据结构时的窘迫。事后总结,还是双向链表的使用不够熟练,现在已经是22:10了,没有时间来自己实现一个双向链表,改日一定要实操成功!

总之,debug搞得头都疼了!

贴代码了:

 1 struct node { 2     int key,value; 3     node(int k,int v):key(k),value(v){ 4     } 5  6 }; 7 class LRUCache{ 8 public: 9     int size;10     int capacity;11     list <node >li;12     unordered_map <int, list<node>::iterator>mem;13     LRUCache(int c){14         capacity=c;15         size=0;16     }17     int get(int key){18         auto it=mem.find(key);//这里得到的迭代器是const的19         if(it==mem.end())20             return -1;21         auto ok=mem[key];//这里得到的迭代器不是const的22         li.splice(li.begin(),li,ok);//这里犯了一点糊涂23         mem[key]=li.begin();24         return li.begin()->value;25     }26     void set(int key,int value){27         auto it=mem.find(key);28         if(it==mem.end()){29             li.push_front(node(key,value));30             mem[key]=li.begin();31             size++;32             if(size>capacity){33                 mem.erase(li.back().key);34                 li.pop_back();35                 size--;36             }37         }38         else{39             li.splice(li.begin(),li,mem[key]);40             mem[key]=li.begin();41             li.begin()->value=http://www.mamicode.com/value;42         }43     }44 45 };

 

LRU Cache (9)