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 12-4
今日进步: 1.国庆答题界面和结果界面的连接完成,并能显示GetRankData API返回结果和错误题目的单词信息. 2.天赋: 完成了整个 单词挑战需要碰到的"Storage" ...
- 杭电 How far away ?
There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...
- icepdf和pdfbox转pdf文档为图片
icepdf转pdf文档为图片 首先导入icepdf jar包或maven pdfPath为pdf文件路径.pdfimgpsth为图片保存的路径 public static void icePdfIm ...
- Springboot:员工管理之环境准备(十(1))
1:静态资源 下载静态资源:https://files.cnblogs.com/files/applesnt/ztzy.zip 项目下载:https://files.cnblogs.com/files ...
- 2019-2020-1 20199326《Linux内核原理与分析》第七周作业
实验内容:分析Linux内核创建一个新进程的过程 初始化Menu Os,输入fork可以看到menuos触发了一个fork系统调用 再开一个shell,进入调试模式,设置几个断点sys_clone,d ...
- IBM WebSphere 远程代码执行漏洞安全预警通告
近日,IBM发布安全通告称修复了一个WebSphere Application Server中一个潜在的远程代码执行漏洞(CVE-2018-1567).攻击者可以构造一个恶意的序列化对象,随后通过SO ...
- Nginx四层代理
Nginx支持四层代理 http://nginx.org/en/docs/stream/ngx_stream_core_module.html 该ngx_stream_core_module模块自1. ...
- 利用python将excel数据导入mySQL
主要用到的库有xlrd和pymysql, 注意pymysql不支持python3 篇幅有限,只针对主要操作进行说明 连接数据库 首先pymysql需要连接数据库,我这里连接的是本地数据库(数据库叫ld ...
- vue2.x学习笔记(二十五)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12677019.html. 过滤器 vue允许开发者自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地 ...
- Eureka重点原理解析
前言 带着问题学习,事半功倍.本文将对如下几个问题进行总结说明: 1.EurekaServer端服务注册的流程和设计模式 2.Eureka服务续约的bug 3.EurekaClient的启动流程 4. ...