leetcode460. LFU缓存 双向链表配图文详细解析

leetcode460. LFU缓存

相关资料 缓存算法

题目描述

在这里插入图片描述

解题思路:

用一个hashMap存储键值对,用于在O(1)的时间内取到需要的值。由于我们需要对对象进行某种排序(方便在缓存满了的时候,对对象进行删除)。LFU机制为:

  1. 在缓存满了的时候,先对访问次数最少的进行删除。
  2. 再对访问时间最远的进行删除。
    我们用二维的双向链表串起所有的对象。(多条双向链表串起来)

put新结点

  1. 橙色部分为一条一条不同访问频率的双向链表。刚开始put进内存的新对象,必定存放在freq = 1的newNode处。
    freq++

  2. 在freq = n 处的NodeQ对象,被访问,则这个对象会从freq = n处删除。添加到freq = n + 1处的head的后一个位置。
    在这里插入图片描述

  3. 当我们缓存满了的时候,而需要添加key5-value5这一对键值对时,我们需要去删除元素。LFU机制为:

    - 在缓存满了的时候,先对访问次数最少的进行删除。
    - 再对访问时间最远的进行删除。
    

    则我们需要对NodeX这个元素进行删除,因为我们的访问次数链表中,freq=n是访问次数最少的链表。这其中,访问最少的结点则为NodeX,我们需要删除它,再将新的KV添加进来。
    putNewNode

    代码实现(含详细注释):

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值