实现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')
实现LRU的两种方法---python实现的更多相关文章
- 转:python list排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...
- python list排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法方法1 用List的内建函数list sort进行排序list sort(func=None, key=None, reverse=False)Pytho ...
- 「python」: arp脚本的两种方法
「python」: arp脚本的两种方法 第一种是使用arping工具: #!/usr/bin/env python import subprocess import sys import re de ...
- Python 中格式化字符串 % 和 format 两种方法之间的区别
Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...
- python将两个数组合并成一个数组的两种方法的代码
内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...
- 用Python计算幂的两种方法,非递归和递归法
用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...
- python第三方包安装方法(两种方法)
具体有以下两种方法: 第一种方法(不使用pip或者easy_install): Step1:在网上找到的需要的包,下载下来.eg. rsa-3.1.4.tar.gz Step2:解压缩该文件. Ste ...
- python中执行shell的两种方法总结
这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...
- python excel操作单元格复制和读取的两种方法
操作单元格 新建一个sheet, 单元格赋值(两种方法) 单元格A1赋值为’xiaxiaoxu’ 单元格A2赋值为‘xufengchai’ 打印A1和A2单元格的值(两种方法) #coding=utf ...
随机推荐
- RDIFramework.NET ━ .NET快速信息化系统开发框架 记录所有操作的Sql
在实际开发或试运行过程中,我们有时需要查看或分析模块执行的所有sql,以便进行相关分析.有时我们可以通过数据库自带的软件抓取,如:SQL Server Profiler.在我们RDIFramework ...
- 百度地图坐标纠偏和转换工具和DLL
百度一直以来都是个即想装出一副拥抱互联网开放的样子,又为了短期商业利益封闭自己的公司,模仿谷歌地图,开放了自己的百度地图 API,为了防止别人盗用其数据和用户自由迁移,地图相比于火星坐标,又更加封闭, ...
- with CTE AS
CTE/表变量/Temp http://www.cnblogs.com/ziyeyimeng/articles/2366855.html
- chrome调试 JavaScript 脚本
随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...
- WebForm 内置对象
内置对象: Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); Respo ...
- Eclipse的安装与调试
1.首先进入eclipse官网下载eclipse 2.根据自己的系统选择相应版本进行下载.由于我的是64bit,所以我选择64bit版下载. 3.点开下载的程序,进行安装. 4.随后进入了安装页面.和 ...
- FileSaver.js ////////////////////zzzzzzzzzzzzzz
FileSaver.js 实现浏览器端文件保存的 JavaScript 库 查看次数: 758 下载次数: 89 更新时间: 2015-06-05 发布时间: 2015-06-05 收藏 插件信息金币 ...
- java 支付宝 第三方即时到账支付 接口
alipay 的几个内核功能文件:=================================================================================== ...
- Winform-DataGridView 实现如Excel的粘贴复制
void AddDataGridView(DataGridView gridView, string s) { s = s.Replace("/", @"\") ...
- Oracle Contact By的使用
1.概述 Oracle “CONNECT BY”是层次查询子句,一般用于树状或者层次结果集的查询 2.使用方式 2.1.通过Connect by 生成序列 Oracle 构造一个月份的天数 ) s_d ...