算法:LFU缓存机制-淘汰最近访问频率最小的元素
题目—— LFU缓存机制
url:https://leetcode-cn.com/problems/lfu-cache/
设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。
get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。
put(key, value) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除。
进阶:
你是否可以在 O(1) 时间复杂度内执行两项操作?
示例:
1 | LFUCache cache = new LFUCache( 2 /* capacity (缓存容量) */ ); |
分析
LFU(Least Frequently Used):淘汰最近访问频率最小的元素。
缺点:1. 最新加入的数据常常会被踢除,因为其起始方法次数少。 2. 如果频率时间度量是1小时,则平均一天每个小时内的访问频率1000的热点数据可能会被2个小时的一段时间内的访问频率是1001的数据剔除掉;
实现方式:
一个k-v字典存储 数据,同时存储每个item的上次访问时间time 和 累计访问次数 cnt,当容量满时,淘汰最cnt最小的,cnt相同的情况下,淘汰time最早的;
Java解法
使用HashMap存储数据,使用优先级队列PriorityQueue存储累计访问次数 和 最近访问时间
1 | import java.util.Comparator; |