首页 > 试题广场 >

设计LFU缓存结构

[编程题]设计LFU缓存结构
  • 热度指数:26946 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
一个缓存结构需要实现如下功能。
  • set(key, value):将记录(key, value)插入该结构
  • get(key):返回key对应的value值
但是缓存结构中最多放K条记录,如果新的第K+1条记录要加入,就需要根据策略删掉一条记录,然后才能把新记录加入。这个策略为:在缓存结构的K条记录中,哪一个key从进入缓存结构的时刻开始,被调用set或者get的次数最少,就删掉这个key的记录;
如果调用次数最少的key有多个,上次调用发生最早的key被删除
这就是LFU缓存替换算法。实现这个结构,K作为参数给出

数据范围:
要求:get和set的时间复杂度都是 ,空间复杂度是


若opt=1,接下来两个整数x, y,表示set(x, y)
若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1

对于每个操作2,返回一个答案
示例1

输入

[[1,1,1],[1,2,2],[1,3,2],[1,2,4],[1,3,5],[2,2],[1,4,4],[2,1]],3

输出

[4,-1]

说明

在执行"1 4 4"后,"1 1 1"被删除。因此第二次询问的答案为-1   

备注:

#coding:utf-8
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# lfu design
# @param operators int整型二维数组 ops
# @param k int整型 the k
# @return int整型一维数组
#
import heapq
class Solution:
    def LFU(self , operators , k ):
        # write code here
        self.dict = {}     # 存储key value
        self.capacity = k  # 容量
        self.cache = []   # 缓存key 操作的数量等数据
        self.counter = 0  # 全局 操作了第几次
        result = []
        for operator in operators:
            opt = operator[0]
            key = operator[1]
            if opt == 1:
                value = operator[2]
                self.set(key, value)
            else:
                result.append(self.get(key))
        return result

    def set(self, key, value):
        self.counter += 1  # 操作次数 + 1
        
        if key not in self.dict.keys():  # 不在列表中 直接插入
            if len(self.dict) >= self.capacity:  # 到达上限了 按逻辑删除一个
                del_node = heapq.heappop(self.cache)  # 最小堆弹出的是综合排序最小的
                self.dict.pop(del_node[2])

            node = [1, self.counter, key, value]  # [当前key操作次数 总体数据被操作次数 key value]
            self.dict[key] = node
            heapq.heappush(self.cache, node)
        else:
            node = self.dict[key]
            node[0] += 1  # key 的操作次数+1
            node[1] = self.counter
            node[3] = value
            # dict 和 cache是引用了相同的节点 修改会同步
            heapq.heapify(self.cache)  # 更新一次最小堆

    def get(self, key):
        self.counter += 1  # 操作次数 + 1
        if key in self.dict.keys():
            node = self.dict[key]
            node[0] += 1  # key 的操作次数+1
            node[1] = self.counter
            # dict 和 cache是引用了相同的节点 修改会同步
            heapq.heapify(self.cache)  # 更新一次最小堆
            return self.dict[key][3]
        else:
            return -1

发表于 2025-03-01 01:26:45 回复(0)