這也是豆瓣2016年的一道筆試題。。。 html
參考:http://www.3lian.com/edu/2015/06-25/224322.htmlpython
LRU(least recently used)就不作過多的解釋了(不然你也不會找到這篇文章了)。算法
python實現的兩種方法:htm
一、經過collections.OrderedDict類來實現,首先要說明的是OrderedDict是在普通字典的方法保證了插入的有序,正如它的名字同樣,保存時按照它插入的順序保存的。同時要強調的是這個類還有一個特殊的方法popitem(Last=False),當Last參數爲False時,說明其是以隊列先進先出方式彈出第一個插入字典的鍵值對,而當Last參數爲True時,則是以堆棧方式彈出鍵值對。blog
二、第二種方法是藉助於普通dict和list來實現,其實就是本身來實現一個OrdereDict,保證插入的有序(或說是藉助列表來記錄插入的順序)隊列
代碼實現:rem
#!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')