leetcode460. LFU缓存
相关资料 缓存算法
题目描述
解题思路:
用一个hashMap存储键值对,用于在O(1)的时间内取到需要的值。由于我们需要对对象进行某种排序(方便在缓存满了的时候,对对象进行删除)。LFU机制为:
- 在缓存满了的时候,先对访问次数最少的进行删除。
- 再对访问时间最远的进行删除。
我们用二维的双向链表串起所有的对象。(多条双向链表串起来)
-
橙色部分为一条一条不同访问频率的双向链表。刚开始put进内存的新对象,必定存放在freq = 1的newNode处。
-
在freq = n 处的NodeQ对象,被访问,则这个对象会从freq = n处删除。添加到freq = n + 1处的head的后一个位置。
-
当我们缓存满了的时候,而需要添加key5-value5这一对键值对时,我们需要去删除元素。LFU机制为:
- 在缓存满了的时候,先对访问次数最少的进行删除。 - 再对访问时间最远的进行删除。
则我们需要对NodeX这个元素进行删除,因为我们的访问次数链表中,freq=n是访问次数最少的链表。这其中,访问最少的结点则为NodeX,我们需要删除它,再将新的KV添加进来。
代码实现(含详细注释):
import java.util.HashMap;
import java.util.Map;
/*
* @lc app=leetcode.cn id=460 lang=java
*
* [460] LFU缓存
*/
// @lc code=start
class LFUCache {
public static void main(String[] args) {
LFUCache cache = new LFUCache( 2 /* capacity (缓存容量) */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 去除 key 2
cache.get(2); // 返回 -1 (未找到key 2)
cache.get(3); // 返回 3
cache.put(4, 4); // 去除 key 1
cache.