实现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')

  

posted @   Esapinit  阅读(6149)  评论(1编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示