LFU C# 实现
周六早上 做了下力扣的LRU 题目 后面接着看了LFU 缓存 难度提高了不少
首先 先说下 这2着 的差别把
LRU :最近 最少使用算法(Least Recently Used).LRU 是淘汰最长时间没有被使用的页面。
LFU:最不经常使用淘汰算法(Least Frequently Used)LFU 是淘汰 一段时间内,使用次数最少的页面。
看到这些 感觉都差不多 不是很明白 下面举个实例说明下问题
假设内存块大小是3:
我们所需页面顺序 也就是缓存读取页面的顺序是 如下:
1 2 1 2 1 3 4
当我们去获取页面4的时候 内存块里面 存是应该 是 1 2 3 这个时候 就会发生缺页中断 ,而且内存已经满了 需要策略去替换页面
如果我们采用的是LRU 算法 应该替换掉的是2 因为 2 是最长时间 没被访问的 1,3 在4之前别访问 所以要替换2
但是 如果采用LFU 算法 那替换的就是3 因为 在 4被访问之前 这段时间内 1访问3次 2是2次 3是1次 所以要替换 3 如果存在访问次数相同低的 删除 最久的节点
再次举例下 1 2 1 2 1 3 3 4 如果是这样的顺序 1是3次 2是 2次 3 页是2次 但是2访问顺序在3之前 也就是呆的久 所以替换 2节点
LRU 消耗CPU 资源少 LFU 消耗CPU 资源高 自己实现下 就知道这2个的难易程度了。
好了 说了这么多 下面show code:
public class LFUCache2
{
private Dictionary<int, LFUCacheEntity> dicData; //KeyValuePair
public Dictionary<int, LinkedList<LFUCacheEntity>> dicFrequenNodeList;// key 是频率 value是key频率下面 所挂的node 数据节点
private int _capacity;//容量大小
private int minFre;//频率值 public LFUCache2(int capacity)
{
_capacity = capacity;
dicData = new Dictionary<int, LFUCacheEntity>(capacity);
dicFrequenNodeList = new Dictionary<int, LinkedList<LFUCacheEntity>>();
minFre = ;
dicFrequenNodeList.Add(, new LinkedList<LFUCacheEntity>());
} public int Get(int key)
{
if (!dicData.ContainsKey(key))
return -;
var value = dicData[key].Value;
Put(key, value);
return value;
} public void Put(int key, int value)
{
if (_capacity == )
return; var newCacheData = new LFUCacheEntity { Key = key, Value = value, Frequen = };
if (dicData.ContainsKey(key))
{
var cacheEntity = dicData[key]; var oldFrequen = cacheEntity.Frequen;
var oldFrequenNodeList = dicFrequenNodeList[oldFrequen];
oldFrequenNodeList.Remove(cacheEntity); var newFrequen = oldFrequen + ;
if (!dicFrequenNodeList.ContainsKey(newFrequen))
{
dicFrequenNodeList.Add(newFrequen, new LinkedList<LFUCacheEntity>());
}
newCacheData.Frequen = newFrequen;
dicFrequenNodeList[newFrequen].AddLast(newCacheData);
dicData[key] = newCacheData;
if (dicFrequenNodeList.ContainsKey(minFre) && dicFrequenNodeList[minFre].Count == )
{
minFre = newFrequen;
}
return;
} if (_capacity == dicData.Count)
{
var deleteNodeList = dicFrequenNodeList[minFre];
var deleteFirstNode = deleteNodeList.First;
deleteNodeList.RemoveFirst();
dicData.Remove(deleteFirstNode.Value.Key);
}
dicFrequenNodeList[].AddLast(newCacheData);
dicData.Add(key, newCacheData);
minFre = ;
}
} public class LFUCacheEntity
{
public int Key { get; set; }
public int Value { get; set; }
public int Frequen { get; set; }
}
最后贴下 题目地址:https://leetcode-cn.com/problems/lfu-cache/
在贴下 执行的代码情况:
但是很奇怪的是:LFUCacheEntity 这个如果设置称类 耗时特别的块三百多毫秒 如果设置成结构就是近600毫秒 上面是我执行的结果情况
明天去研究下
LFU C# 实现的更多相关文章
- [LeetCode] LFU Cache 最近最不常用页面置换缓存器
Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- LRU LFU FIFO 转载
-------------------------------------->href--------------------------> http://blog.chinaunix.n ...
- Leetcode: LFU Cache && Summary of various Sets: HashSet, TreeSet, LinkedHashSet
Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- 缓存算法(页面置换算法)-FIFO、LFU、LRU
在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...
- 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)
页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...
- Cache替换算法:LRU与LFU的区别
LFU(Least Frequently Used)最近最少使用算法.它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路.LRU(Least Rece ...
- 2017-4-25/设计缓存(LFU)
1. 恒定缓存性能有哪些因素? 命中率.缓存更新策略.缓存最大数据量. 命中率:指请求缓存次数和缓存返回正确结果次数的比例.比例越高,缓存的使用率越高,用来衡量缓存机智的好坏和效率.如果数据频繁更新, ...
- 【转】缓存淘汰算法系列之2——LFU类
原文地址 :http://www.360doc.com/content/13/0805/16/13247663_304916783.shtml 1. LFU类 1.1. LFU 1.1.1. 原理 L ...
随机推荐
- stand up meeting 11/30/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 完善了UI的各项功能,弹窗的显示格式等方面的规范:解决logic部分调用该dll的问题:解决鼠标事件的捕捉中~ ...
- springboot前后端分离跨域
@Configurationpublic class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMa ...
- Apache solr velocity模块 漏洞复现
0x01 Solr简单介绍 Solr是建立在Apache Lucene ™之上的一个流行.快速.开放源代码的企业搜索平台. Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平 ...
- CVE 2019-0708 漏洞复现+
PART 1 参考链接:https://blog.csdn.net/qq_42184699/article/details/90754333 漏洞介绍: 当未经身份验证的攻击者使用 RDP 连接到目标 ...
- kubernetes的无状态服务和有状态服务介绍
无状态服务 1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的 2)多个实例可以共享相同的持久化数据.例如: nginx实例和tomcat实例 3 ...
- Java类的使用
在一个Java文件中写两个类:一个基本的类,一个测试类.注意:文件名称和测试类名称一致. 如何使用呢?创建对象使用.如何创建对象呢?格式:类名 对象名 = new 类名(); Student s = ...
- pytorch 中模型的保存与加载,增量训练
让模型接着上次保存好的模型训练,模型加载 #实例化模型.优化器.损失函数 model = MnistModel().to(config.device) optimizer = optim.Adam( ...
- python-trade
https://tool.lu/pyc/在线反编译pyc import base64 correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt' flag = base64.b6 ...
- SESSION劫持
服务端和客户端之间是通过session(会话)来连接沟通.当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session.每个用户的session都是独立的,并且由服务器来维护.每个用户的s ...
- centos7与8的区别
1.关于内核版本:RHEL8采用4.18.0-xRHEL7采用3.10-0-x 2 网络时间同步 RHEL8 只使用Chronyd,不支持NTP部署. RHEL7Chronyd与NTP两者都支持 3. ...