实现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,保证插入的有序(或说是借助列表来记录插入的顺序)

代码实现:

#!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 @ 2016-05-04 17:24  Esapinit  阅读(6148)  评论(1编辑  收藏  举报