如何实现一个LFU算法

Least Frequently Used。也就是最少被使用的方法。核心思想是:如果数据过去被访问多次,那么将来被访问的频率也更高。
摘要由CSDN通过智能技术生成

在正文开始之前先讲讲我个人吧。持续了这么一段时间写作,发现一周一篇文章对目前的我来说还是有点吃力的,因为最近加班比较多,周末又容易摆烂,很少有时间想好要写什么。充电时间也感觉不够,所以准备先换成两周一篇文章了。暂时先这么定,后续适应了,再加大强度好了。

好了,开始来填坑了,之前有提到过一个LFU算法。那么什么是LFU呢?全名为:Least Frequently Used。也就是最少被使用的方法。核心思想是:如果数据过去被访问多次,那么将来被访问的频率也更高。

所以我们可以提取关键词“多次”,也就是说对于访问的元素,会有个次数统计。例如访问顺序为:1 1 1 2 6 2。那么假设真的触发淘汰的。淘汰顺序应该是 6 > 2 > 1,因为按照LFU的思想,访问次数越多越有可能被访问,也就更不应该淘汰。

原理

原理其实也很简单,就是在访问元素时,累计次数加1,然后循环判断访问次数是否大于等于它上一个元素,如果是则交换位置。具体流程如下:

当然,实现的数据结构依然是:散列表+双向链表。具体原因前一篇文章已经讲解,不清楚的小伙伴可以去看看,知道的小伙伴也可以看看,已经看过的小伙伴当然也可以复习下。

接着就show the code好了。

源码

具体逻辑依然在源码中打上注释,我这里就不再赘述了。

public final class LFUDemo<K, V> {

    @Setter
    @Getter
    private static final class Node<K, V> {
        private
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值