实现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,保证插入的有序(或说是借助列表来记录插入的顺序)
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #!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' ) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步