一种LFU淘汰算法

【LFU算法】的实现——Java 什么是LFU算法? LFU算法淘汰的是使用频率最小的 它的名字是:Least Frequently Used algorithm 既然是跟频率有关的,那么就需要用数据结构来存放key-频率。 怎么写? 首先,列举基本的需求 在调用get(key)时,返回对应的value get 或 put 之后,这个key的频率 +1; 如果在容量满的时候进行put操作,那么就要删除频率最低的(通过频率找到key),如果有多个频率相同,删除最老的那个 以上操作希望是**O(1)**时间复杂度 根据要求 阅读详情

以前介绍过LRU高效的实现方式:

一种O1性能的LRU算法 http://blog.youkuaiyun.com/herm_lib/article/details/6535698


今天也介绍一下LFU的实现方法。LRU是最近最少使用算法,就是把最早才访问的数据淘汰掉。LFU是最近最不常用算法,就是某一段时间内被用到最少的淘汰掉。


LFU时间周期

        使用次数的时间长度,这个时间不能太短,短了体现不出哪些数据是热点;同样也不能太长,太长的话,某一个时间点的对某个数据的访问峰值可以长期影响我们的淘汰策略。一般实现的算法可以根据业务特点去调节这个参数。

上个周期访问次数权重

        在本周期开始的时候,最粗暴的做法是把所有数据的访问数据全置成0。这样上次的访问热点就体现不出来了。考虑引入一个可调整的权重,这个权重一般建议与访问次数成反比的关系。


这个算法实现比LRU稍微简单一点。

数据访问次数数组

        数组内容是数据索引+访问次数,这个数组做成线性有序数组,按访问次数降序排列。

哈希表

        数据索引作为Key,指向数据访问时间数组的下标。


访问cache

        查哈希表,查到,返回数据。根据哈希表的值(就是上面的数组下标),定位到数组元素,将数组元素访问次加1,然后和后面元素做调整。

        没查到,数据不在cache中。如果cache未满,把该数据索引加到访问次数数组的尾部。

        满了,就要淘汰了,直接把访问次数数组的最后一个元素对应的数据淘汰掉;把新数据加到哈希表,同事将访问次数元素加到数组尾部。


对整个cache启动一个以LFU时间周期长度的定时器,定时时间到,就整个cache访问数组的访问次数按权重降低。另外,如果某个数据的访问次数达到最大值了,所有的访问次数也按权重降低。权重降低是一个对整个访问次数数组的遍历过程,但一般这个周期时间不会太短(至少分钟级),而且降权重过程时间很短(100W个数据约10ms),整个过程不会产生CPU和内存访问的峰值。





用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词) 本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。 阅读详情

相关推荐

A*(star)算法原理讲解以及程序实现(基于Python)

本文将以迷宫探索最优路径为例,讲解A *搜索算法原理及其程序实现。在原理讲解部分,首先从为什么要使用A *搜索算法和A *搜索算法的全局最优逻辑出发,讲解A *算法的原理。其次对A *的行动函数g(n)和启发函数h(n)的细节进行了讲解说明,并补充了启发函数的选择对于A *算法的影响。在程序实现部分,首先从程序流程框图出发,解释A *算法的流程。其次按函数的类划分并讲解主要代码,接着展示程序的运行结果,最后对A *算法进行总结分析。

m0_73366745的博客 8283

哎,这让人抠脑壳的 LFU。

这是why哥的第 83 篇原创文章 让人抠脑壳的 LFU 前几天在某APP看到了这样的一个讨论: 看到一个有点意思的评论: LFU 是真的难,脑壳都给我抠疼了。 如果说 LRU 是 Easy 模式的话,那么把中间的字母从 R(Recently) 变成 F(Frequently),即 LFU ,那就是 hard 模式了。 你不认识 Frequently 没关系,毕竟这是一个英语专八的词汇,我这个英语八级半的选手教你: 所以 LFU 的全称是Least Frequently Used,最不经常使用策略。

qq_27243343的博客 362

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:)

从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed....

qq_40417648的博客 6228

缓存淘汰算法--LFU算法

https://blog.youkuaiyun.com/qq_32198277/article/details/79773695 LFU(Least Frequently Used)淘汰一定时期内被访问次数最少的元素。如果元素的一定时间内的访问次数相同时,则比较他们的最新一次的访问时间。 public class LFU<k, v> { private final int capcity...

z69183787的专栏 935

思必驰离线语音芯片:智能家居控制的核心引擎

思必驰离线语音芯片TH1520通过本地化语音识别技术,为智能家居带来革命性体验。该芯片具备200-600毫秒的快速响应、75分贝抗噪能力和双核异构设计,显著提升设备交互效率。支持自定义指令和10种音色选择,开发周期缩短至3天,BOM成本降低30%,是智能家居控制的核心引擎。

redis7keeper的博客 988

基于STM32环境温湿度监测系统设计

基于STM32环境温湿度监测系统设计1. 实验目的2. 任务和要求3. proteus仿真图4. 实验代码 1. 实验目的 (1) 掌握使用 KEIL MDK5 进行软件开发的具体流程; (2) 掌握硬件电路的设计方法; (3) 掌握 STM32 微控制器的程序设计及代码编写方法。 2. 任务和要求 (1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集; (2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超

唯一的博客 2万+

LFU算法

1,基本原理LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。具体实现如下: 1. 新加入数据插入到队列尾部(因为引用计数为1);2. 队列中的数据被访问后,引用计数增加,队列重新排序;3...

Searcher_Recommeder的博客 1万+

告别VMware Tools!用open-vm-tools在Ubuntu 22.04上搞定共享文件夹(附开机自动挂载)

本文详细介绍了在Ubuntu 22.04上使用open-vm-tools替代VMware Tools实现高效共享文件夹管理的方法。通过开源工具open-vm-tools,用户可避免传统方案的兼容性问题,享受自动适配内核、系统更新同步等优势。文章包含从安装配置到开机自动挂载的全流程指导,特别适合在VMware虚拟机中运行Ubuntu Desktop的开发者提升工作效率。

weixin_32520095的博客 585

LRU和LFU 算法(页面置换算法)

LRU和LFU的区别 LRU和LFU都是内存管理的页面置换算法。 LRU:最近最少使用(最长时间)淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的页面。 LFU:最不经常使用(最少次)淘汰算法(Least Frequently Used)。LFU是淘汰一段时间内,使用次数最少的页面。 例子 假设LFU方法的时期T为10分钟,访问如下页面所花的时间正好为10分钟,内存块大小为3。若所需页面顺序依次如下: 2 1 2 1 2 3 4 ----------

热爱学习和钻研。 4万+

如何利用VS2017创建一个简单的窗口

#如何利用VS2017创建一个简单的窗口 1、新建->Windows桌面向导 2、应用程序类型->桌面应用程序,点击确定 3、点击调试->开始调试 可建立如下图的窗口 4、可以在生成的项目文件的中找到windows17_2的应用程序,打开界面如下: 注:新建空白项目也可以,注意在解决方案资源器中添加.cpp文件,如源.cpp文件,下载代码见博文 ...

weixin_46894139的博客 2914

SimSwap复现指引及代码分析【2023有更新】

我的环境!!!😚😚😚 之后会遇到:还会遇到至此环境配置完毕!下面是所需要的checkpoint。至此环境准备结束。先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg 如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128) 表示图像预处理,相应的改为也是一样。不加就是对已经面部对齐的图像进行简单的面部交换。 加上就是无水印。 交换一张图片中的所有面孔。

zik的博客 2048

缓存淘汰算法之LFU

Windows-LFU是LFU的一个改进版,差别在于Window-LFU并不记录所有数据的访问历史,而只是记录过去一段时间内的访问历史,这就是Window的由来,基于这个原因,传统的LFU又被称为“Perfect-LFU”。LFU*数据缓存实现和LFU一样,不同的地方在于淘汰数据时,LFU*只淘汰引用计数为1的数据,且如果所有引用计数为1的数据大小之和都没有新加入的数据那么大,则不淘汰数据,新的数据也不缓存。相比LFU要低很多,不需要维护所有数据的历史访问记录,只需要维护引用次数为1的数据,也不需要排序。

m0_74282605的博客 768

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LFU算法 初始频率 动态频率

LFU(Least Frequently Used)算法是一种缓存淘汰策略,其核心思想是根据数据的访问频率来决定淘汰哪些数据。具体来说,LFU算法认为如果一个数据在过去一段时间内被访问的次数很少,那么它在未来被再次访问的概率也很低。因此,当缓存空间不足时,LFU算法会选择访问频率最低的数据进行淘汰。在C++中实现LFU算法,通常需要以下几个步骤:数据结构设计:LFU算法通常需要一个哈希表和一个优先队列。哈希表用于存储每个元素的访问计数,键是元素的标识,值是元素的访问次数。

sanqima的专栏 1054

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LFU算法代码实现记录一下

开头 最后 参考 LFU算法详解

qq_41665452的博客 758

十三、Redis LFU算法详述(Least Frequently Used - 最不常用)

十三、Redis LFU算法详述(Least Frequently Used - 最不常用)

胖太乙 5866

基础知识四、Python实现LFU算法

在第一节中实现了双向链表DoubleLinkedList类,上一节中基于双向链表实现了LRU算法,本节课我们继续基于双向链表实现LFU(Least frequently used 最不经常使用)算法。 文章目录一、重写Node节点类二、LFU实现三、测试逻辑测试结果 一、重写Node节点类 构建LFUNode类 继承自第一节中的Node类,添加freq属性用来表示节点使用频率 class LFUN...

wang_xiaowang的博客 1895

python利用双向链表和map实现LFU算法

python利用双向链表和map实现LFU算法 双向链表链接: https://blog.youkuaiyun.com/weixin_41978134/article/details/106143560 """ @File : LFU.py @Author: wangjiahui @Date : 2020/5/17 17:02 @Desc : LRU算法 """ from Computer_Organization.node1 import DoubleLinkedList, No

Davecurry 311

缓存淘汰算法LRU和LFU

前言 LRU算法和LFU算法是属于页面置换的一种算法,或者更通俗的说,就是缓存如何淘汰的一种策略。 我们通常在设计一个系统的时候,由于数据库的读取速度远小于内存的读取速度,所以为了加快读取速度,会将一部分数据放到内存中,称为缓存。 但是内存容量是有限的,当你要缓存的数据超出容量,就得有部分数据删除,这时候哪些数据删除,哪些数据保留,就是LRU算法和LFU算法要干的事。 什么是LRU算法 LRU算法,全称Least recently used,即最近最少使用。LRU算法的思想是如果数据最近被访问过,

Johnson_Marteest的博客 522

字节二面,让写一个LFU缓存策略算法,懵了

LRU全称 "Least Recently Used",最近最少使用策略,判断最近被使用的时间,距离目前最远的数据优先被淘汰,作为一种根据访问时间来更改链表顺序从而实现缓存...

weixin_45727359的博客 266

如何实现一个LFU算法

Least Frequently Used。也就是最少被使用的方法。核心思想是:如果数据过去被访问多次,那么将来被访问的频率也更高。

学习学习 700

算法-LFU算法设计

对于每个操作2,返回一个结果。

a_jie_2016_05的博客 281

LFU算法的Java代码实现

算法基础解释,已经会的可以直接跳过哈。LFU是最近不经常使用算法。听到这个名字,就问你迷糊不?还有个类似的叫LRU算法,叫最近最少使用算法。它的代码实现,本人实现了一波,有兴趣可以看下:好了,两者的应用场景基本一致,大多数都是缓存。本质上就是当我缓存的地方满了,现在又要添新的值,需要舍弃哪个旧值?LRU就是舍弃缓存数据中最后一次访问时间最早的数据。(注重时间)LFU即使舍弃访问次数最少的数据中最后一次访问时间最少的数据(注重次数+时间)什么?你还不懂?那我可要举例子了。复制代码。

BASK2311的博客 674

LRU、LFU

LRU,即:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的数据。 LFU,即:最不经常使用淘汰算法(Least Frequently Used)。LFU是淘汰一段时间内,使用次数最少的数据。 举例: 数据2 1 2 1 2 3 4,加入4时内存超过阈值。 根据LRU会淘汰1,因为1距离想加入4的时间点(也就是淘汰时间点)最长。 根据LFU会淘汰3,因为加入4前的这段时间里,3的使用次数最少。 LRU算法实现: LeetCode官方题...

haoranhaoshi的博客 621

LFU算法实现

LRU为最近最少使用,LFU为最不经常使用,它们的区别如下 例如1 ->2 -> 1 -> 2 -> 3 -> 4,缓存的容量为3 如果按照LRU,则会淘汰1,因为1访问的事件最远 按照LFU,则3,4访问次数最少,都为1次,4比3访问事件更近,则淘汰3. class LFUCache { Integer capacity; Integer minFrequency; Map<Int...

远方的少年 1433

【常数时间】LFU(Least Frequently Used)基于频次的缓存淘汰算法C++实现

struct LFUNode { int freq; list<pair<int, int>> vals; LFUNode(int f = 0) : freq(f) { } }; typedef list<LFUNode>::iterator iptr; typedef list<pair<int, int>>::iterator jptr; class LFUCache { public: LFUCache(int capacit

Eurypterid的博客 395
上一篇: 记录一下 __gnu_cxx::hash_map传一个新allocator的写法
下一篇: 系统设计随笔
herm_lib
博客等级 码龄16年 173粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值