NC93设计LRU缓存结构

本文探讨如何设计LRU(Least Recently Used)缓存结构,包括两种解法:使用queue+map和双向链表+map。解法1中,queue用于记录数据使用频率,但存在操作效率问题。解法2采用双向链表,能在O(1)时间内完成插入和删除,是更优的解决方案。然而,在某些在线平台上,JS实现可能会超时,而C++版本则能顺利通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址


题目简述:

  设计数据结构,模拟 LRU(Least Recently Used),且要实现两个时间复杂度为 O(1) 的方法:

  • set(key, value) :往 LRU 结构中插入记录 key -> value
  • get(key) :从 LRU 结构中获取 key 对应的 value ,若无该记录,返回 -1

  每当使用了这两个方法之一,这个 key 记录就会变成当前最常用的记录;限制了存储容量 k,当保存的记录条数超过 k 时,就将其中最不常用的记录删除。

  定义了两个操作 121 代表了set操作,2 代表了get操作,

  输入[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3

  输出[1,-1]

  说明:输入代表了一系列操作,[1,1,1] 中第一个数字为操作,后两个数字为 keyvalue[2, 1] 第一个数字代表操作,第二个数字代表 key,最后一个数字 3 代表这个结构的容量。

解法1:queue + map

  定义一个 queue 和一个 map

  queue 是一个队列,用于存储结构中现存的 key队列中 key 的顺序就表示了这条记录的常用程度,处于队尾的最常用,处于队首的最不常用。

  当存储容量仍有剩时,往队尾中加入这个 key,当超出了存储容量时,从队首移除这个 key。当发生了getset 操作时,从这个队列中查找是否有对应记录,若有,将其移至队尾。

  map 则用于存储记录的键值对,每当插入一个 key,value 时,先查找是否存在 key 对应的记录,若存在,则更新这条记录的 value ,否则新增一条记录。

  这种方法逻辑上可行,但在进行 setget 操作时,若已存在该记录,则需要将其移至队尾,这样的操作在 O(1) 的时间内是无法完成 的。

JS 代码如下:

/**
 * lru design
 * @param operators int整型二维数组 the ops
 * @param k int整型 the k
 * @return int整型一维数组
 */
function LRU( operators ,  k ) {
   
   
    let map = new Map();
    let list = [];
    let ans = [];
    
    for (let data of operators) {
   
   
        let op = data[0];
        let key = data[1], value = data[2];
        if (op === 1) {
   
   
            if (list.length >= k) {
   
   
                list.shift()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值