實現LRU的兩種方法---python實現

這也是豆瓣2016年的一道筆試題。。。                                                                                                                              html

參考:http://www.3lian.com/edu/2015/06-25/224322.htmlpython

LRU(least recently used)就不作過多的解釋了(不然你也不會找到這篇文章了)。算法

python實現的兩種方法:htm

     一、經過collections.OrderedDict類來實現,首先要說明的是OrderedDict是在普通字典的方法保證了插入的有序,正如它的名字同樣,保存時按照它插入的順序保存的。同時要強調的是這個類還有一個特殊的方法popitem(Last=False),當Last參數爲False時,說明其是以隊列先進先出方式彈出第一個插入字典的鍵值對,而當Last參數爲True時,則是以堆棧方式彈出鍵值對。blog

    二、第二種方法是藉助於普通dict和list來實現,其實就是本身來實現一個OrdereDict,保證插入的有序(或說是藉助列表來記錄插入的順序)隊列

代碼實現:rem

#!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')
相關文章
相關標籤/搜索