实现LRU的两种方法---python实现
这也是豆瓣2016年的一道笔试题。。。
参考:http://www.3lian.com/edu/2015/06-25/224322.html
LRU(least recently used)就不做过多的解释了(否则你也不会找到这篇文章了)。
python实现的两种方法:
1、通过collections.OrderedDict类来实现,首先要说明的是OrderedDict是在普通字典的方法保证了插入的有序,正如它的名字一样,保存时按照它插入的顺序保存的。同时要强调的是这个类还有一个特殊的方法popitem(Last=False),当Last参数为False时,说明其是以队列先进先出方式弹出第一个插入字典的键值对,而当Last参数为True时,则是以堆栈方式弹出键值对。
2、第二种方法是借助于普通dict和list来实现,其实就是自己来实现一个OrdereDict,保证插入的有序(或说是借助列表来记录插入的顺序)
代码实现:
#!coding:utf8 import collections #基于OrderedDict实现 class LRUCache(collections.OrderedDict): """ function:利用collection.OrderedDict数据类型实现最近最少使用算法 OrderedDict有个特殊方法popitem(Last=False)时则实现队列,弹出最先插入的元素, 而当Last=True则实现堆栈方法,弹出的是最近插入的那个元素 实现了两个方法:get(key)取出键中对应的值,若没有返回None set(key, value) 根据LRU特性添加元素 time: 2016年5月4日 """ def __init__(self, size=5): self.size = size self.cache = collections.OrderedDict() def get(self,key): if self.cache.has_key(key): value = self.cache.pop(key) self.cache[key] = value return value else: value = None return value def set(self,key, value): if self.cache.has_key(key): self.cache.pop(key) self.cache[key] = value elif self.size == len(self.cache): self.cache.popitem(last = False) self.cache[key] = value else: self.cache[key] = value #基于普通dict和list实现 class LRUCache(object): def __init__(self, size = 5): self.size = size self.cache = dict() self.key = [] def get(self, key): if self.cache.has_key(key): self.key.remove(key) self.key.insert(0,key) return self.cache[key] else: return None def set(self, key, value): if self.cache.has_key(key): self.cache.pop(key) self.cache[key] = value self.key.remove(key) self.key.insert(0,key) elif len(self.cache) == self.size: old_key = self.key.pop() self.cache.pop(old_key) self.key.insert(0,key) self.cache[key] = value else: self.cache[key] = value self.key.insert(0,key) if __name__ == '__main__': test = LRUCache() test.set('a',1) test.set('b',2) test.set('c',3) test.set('d',4) test.set('e',5) # test.set('f',6) print test.get('a')