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