zoukankan      html  css  js  c++  java
  • 实现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')
    

      

  • 相关阅读:
    java中Array/List/Map/Object与Json互相转换详解
    推荐几款开源的js日期控件
    12款优秀的 JavaScript 日历和时间选择控件
    12款优秀的 JavaScript 日历和时间选择控件
    StringTokenizer(字符串分隔解析类型)
    StringTokenizer(字符串分隔解析类型)
    javascript中的undefined 和 not defined
    javascript中的undefined 和 not defined
    6.静态函数库设计
    5. Linux应用程序地址布局
  • 原文地址:https://www.cnblogs.com/break-python/p/5459169.html
Copyright © 2011-2022 走看看