实现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 ...
随机推荐
- Javascript模板引擎:Hogan
hogan.js是一个开源前端模板引擎,无逻辑的设计,简单好用,性能也不错. 使用 引入hogan.js,下载链接:http://www.bootcdn.cn/hogan.js/,然后通过hogan. ...
- ios - runtime运行时应用---交换方法
runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...
- HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)
http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...
- 一:luecne初体验
package com.cmy.lucene.lucene; import java.io.File; import java.io.FileReader; import java.nio.file. ...
- WebConfig错误页配置
在system.web节下配置<customErrors mode="On" defaultRedirect="/ErrorPage/MyErrorPage.htm ...
- 【转】【RDS教程】专业DBA速成 - CPU优化篇
来源:http://bbs.aliyun.com/read/160831.html?spm=5176.7189909.0.0.0thneM&displayMode=1&page=1&a ...
- Apache JMeter安装
Apache JMeter安装说明 1. 安装环境要求: Java版本 JMeter要求充分满足JVM1.3或更高. 操作系统 JMeter可以在当前任何一个已经部署了Java的操作系统上 ...
- dev GridControl实现拖拽
一.示例说明 以gridControl1和gridControl2为例,从gridControl1拖拽行到gridControl2中去. 二.属性设置 gridControl2.AllowDrop = ...
- linux 报错 bash ‘/bin/sh: Syntax error: “(” unexpected
今天用make 编译 蹦到 bash ‘/bin/sh: Syntax error: “(” unexpected 和 /bin/sh: [[: not found 这种莫名奇妙的错误 原因是是lin ...
- 谷歌 HTML/CSS 规范 2016-12-30
背景 这篇文章定义了 HTML 和 CSS 的格式和代码规范,旨在提高代码质量和协作效率. 通用样式规范 协议 省略图片.样式.脚本以及其他媒体文件 URL 的协议部分(http:,https:),除 ...