這也是豆瓣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')
