周六早上  做了下力扣的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# 实现的更多相关文章

  1. [LeetCode] LFU Cache 最近最不常用页面置换缓存器

    Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...

  2. 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

    在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...

  3. LRU LFU FIFO 转载

    -------------------------------------->href--------------------------> http://blog.chinaunix.n ...

  4. 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 ...

  5. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  6. 缓存算法(页面置换算法)-FIFO、LFU、LRU

    在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...

  7. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

  8. Cache替换算法:LRU与LFU的区别

    LFU(Least Frequently Used)最近最少使用算法.它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路.LRU(Least Rece ...

  9. 2017-4-25/设计缓存(LFU)

    1. 恒定缓存性能有哪些因素? 命中率.缓存更新策略.缓存最大数据量. 命中率:指请求缓存次数和缓存返回正确结果次数的比例.比例越高,缓存的使用率越高,用来衡量缓存机智的好坏和效率.如果数据频繁更新, ...

  10. 【转】缓存淘汰算法系列之2——LFU类

    原文地址 :http://www.360doc.com/content/13/0805/16/13247663_304916783.shtml 1. LFU类 1.1. LFU 1.1.1. 原理 L ...

随机推荐

  1. 【three.js第五课】光线的添加和感光材料

    材料分类: MeshBasicMaterial:基础网孔材料,一个以简单着色(平面或线框)方式来绘制几何形状的材料.MeshLambertMaterial:兰伯特网孔材料,一种非发光材料(兰伯特)的表 ...

  2. delphi中DateTimePicker控件同时输入日期和时间

    将DateTimePicker的Format属性中加入日期格式设成 'yyyy-MM-dd HH:mm',注意大小写 , 将kind设置为dtkTime即可,可以在每次Form onShow时将Dat ...

  3. mybatis一级缓存让我憔悴

    Mybatis对缓存提供支持,是默认开启一级缓存. 来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的. @Transactional publi ...

  4. 忍不住还是手写了一遍博客的css

    F12边调边改,的一点一点撸出来这个效果.感觉已经可以了.日历感觉没什么用直接隐藏了.

  5. Python - 实现文件名自动更改,避免同名文件被覆盖的两个解决方法

    [原创]转载请注明作者Johnthegreat和本文链接. 在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了.为了解决这个问 ...

  6. Linux学习笔记(四)帮助命令

    帮助命令 man info help --help man 英文原意:format and display the on-line manual pages 功能:显示联机帮助手册 语法:man 选项 ...

  7. 5. history

    https://developer.mozilla.org/zh-CN/docs/Web/API/History_API Browser History APIs

  8. 初识Cobalt Strike

    简介 Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,jav ...

  9. [PHP] 生成二维码(两种方法)

    方法一:(调用google二维码接口,本人测试网不好,不好用!) <?php //1.封装生成二维码图片的函数(方法) /** *利用google api生成二维码图片 * $content:二 ...

  10. idea中哪些好用到飞起的插件,偷懒神器

    idea中开发人员的偷懒神器-插件  本期推荐一些开发人员常用的一些idea插件.偷懒神器在此,不再秃头! 1. idea安装插件的方法.  file->setting->plugins ...