Q200510-03-02: LRU缓存机制
2024-09-07 21:54:04
问题: LRU缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。
获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶:
你是否可以在 O(1) 时间复杂度内完成这两种操作?
示例:
LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 该操作会使得密钥 2 作废
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 该操作会使得密钥 1 作废
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
代码:
package test; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; class ChItem{
public ChItem(int key,int value) {
this.key=key;
this.value=value;
} int key;
int value;
}
public class LruCache2 {
private List<ChItem> dataList;
private int size; public LruCache2(int capacity) {
this.size=capacity;
dataList = new ArrayList<ChItem>();
} public int get(int key) {
int retval=-1; Iterator<ChItem> iterator = dataList.iterator();
while(iterator.hasNext()) {
ChItem item=iterator.next(); if(item.key==key) {
retval=item.value;
dataList.remove(item);
break;
}
} if(retval!=-1) {
dataList.add(0, new ChItem(key,retval));
} return retval;
} public void put(int key,int value) {
if(dataList.size()>=this.size) {
dataList.remove(dataList.size()-1);
} dataList.add(0, new ChItem(key,value));
} public void print() {
StringBuilder sb=new StringBuilder();
sb.append("["); for(ChItem item:dataList) {
sb.append("("+item.key+","+item.value+"),");
} sb.append("]");
System.out.print(sb.toString());
} public static void main(String[] args) throws Exception{
LruCache2 cache=new LruCache2(2);
cache.put(1,1);
System.out.print(".....");
cache.print();
System.out.println(); cache.put(2,2);
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(1));
System.out.print(".....");
cache.print();
System.out.println(); cache.put(3, 3);
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(2));
System.out.print(".....");
cache.print();
System.out.println(); cache.put(4, 4);
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(1));
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(3));
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(4));
System.out.print(".....");
cache.print();
System.out.println();
}
}
输出:
.....[(1,1),]
.....[(2,2),(1,1),]
1.....[(1,1),(2,2),]
.....[(3,3),(1,1),]
-1.....[(3,3),(1,1),]
.....[(4,4),(3,3),]
-1.....[(4,4),(3,3),]
3.....[(3,3),(4,4),]
4.....[(4,4),(3,3),]
--2020年5月10日 19点47分--
最新文章
- 速算1/Sqrt(x)背后的数学原理
- TCP发消息续传文件
- 如何在win7系统中安装redis
- demo
- 【BZOJ-3144】切糕 最小割-最大流
- Lock锁
- 关于解决pyinstaller2.1将.py打包成exe文件在中文目录下不能执行的问题
- How does browsersync work?
- Hadoop学习---安装部署
- 使用sql语句创建表、修改表、添加列等
- CentOS 搭建git服务
- tensorflow models api:ValueError: Tensor conversion requested dtype string for Tensor with dtype float32: &#39;Tensor(";arg0:0";, shape=(), dtype=float32, device=/device:CPU:0)&#39;
- matplotlib绘图不显示问题解决plt.show()
- AI mac安装TensorFlow
- spark sql中将数据保存成parquet,json格式
- [COGS257]动态排名系统 树状数组套主席树
- ssh登录很慢的问题
- 深入理解 flex 布局以及计算_Flexbox, Layout
- @Resource 注解的作用【和 @Autowired 的对比】
- HDU 2066 一个人的旅行(dijkstra水题+判重边)
热门文章
- 安装Scrapy的时候报错error: Microsoft Visual C++ 14.0 is required.
- 解决drf_yasg中的SwaggerAPI无法正确分组问题
- Dubbo整合Springboot框架
- [机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做
- C#LeetCode刷题之#101-对称二叉树(Symmetric Tree)
- LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
- 【ASP.NET Core学习】使用JWT认证授权
- python对端口进行扫描
- DB2根据报错代码查看表与字段信息
- G4560 HD610安装黑苹果Hakintosh