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 ...
随机推荐
- 【three.js第五课】光线的添加和感光材料
材料分类: MeshBasicMaterial:基础网孔材料,一个以简单着色(平面或线框)方式来绘制几何形状的材料.MeshLambertMaterial:兰伯特网孔材料,一种非发光材料(兰伯特)的表 ...
- delphi中DateTimePicker控件同时输入日期和时间
将DateTimePicker的Format属性中加入日期格式设成 'yyyy-MM-dd HH:mm',注意大小写 , 将kind设置为dtkTime即可,可以在每次Form onShow时将Dat ...
- mybatis一级缓存让我憔悴
Mybatis对缓存提供支持,是默认开启一级缓存. 来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的. @Transactional publi ...
- 忍不住还是手写了一遍博客的css
F12边调边改,的一点一点撸出来这个效果.感觉已经可以了.日历感觉没什么用直接隐藏了.
- Python - 实现文件名自动更改,避免同名文件被覆盖的两个解决方法
[原创]转载请注明作者Johnthegreat和本文链接. 在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了.为了解决这个问 ...
- Linux学习笔记(四)帮助命令
帮助命令 man info help --help man 英文原意:format and display the on-line manual pages 功能:显示联机帮助手册 语法:man 选项 ...
- 5. history
https://developer.mozilla.org/zh-CN/docs/Web/API/History_API Browser History APIs
- 初识Cobalt Strike
简介 Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,jav ...
- [PHP] 生成二维码(两种方法)
方法一:(调用google二维码接口,本人测试网不好,不好用!) <?php //1.封装生成二维码图片的函数(方法) /** *利用google api生成二维码图片 * $content:二 ...
- idea中哪些好用到飞起的插件,偷懒神器
idea中开发人员的偷懒神器-插件 本期推荐一些开发人员常用的一些idea插件.偷懒神器在此,不再秃头! 1. idea安装插件的方法. file->setting->plugins ...