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