首页 > 编程语言 >[Python手撕]LFU

[Python手撕]LFU

时间:2024-09-01 14:03:04浏览次数:10  
标签:node index fre Python self next LFU key

class Node:
    def __init__(self, key=0, val=0, pre=None, next=None, fre=0, tail=None):
        self.key = key
        self.val = val
        self.pre = pre
        self.next = next
        self.fre = fre
        self.tail = tail


class LFUCache:

    def __init__(self, capacity: int):
        self.fre_to_node = {}
        self.key_to_node = {}
        self.length = 0
        self.capacity = capacity
        self.init_fre(1)

    def init_fre(self, fre):
        # 新建一个频次的链表
        head = Node()
        tail = Node()
        head.next = tail
        tail.pre = head
        self.fre_to_node[fre] = head
        self.fre_to_node[fre].tail = tail

    def insert(self, fre, node):
        # 如果下一频次的链表还不存在
        if fre not in self.fre_to_node:
            self.init_fre(fre)
        # 插入新频次链表的头部
        node.next = self.fre_to_node[fre].next
        self.fre_to_node[fre].next.pre = node
        self.fre_to_node[fre].next = node
        node.pre = self.fre_to_node[fre]
        # 更新节点的频次值
        node.fre = fre

    def remove(self, node):
        # 从双向链表中删除节点
        node.pre.next = node.next
        node.next.pre = node.pre

    def show(self):
        print("展示---------------")
        index = 1
        while index in self.fre_to_node:
            print("频率", index)
            cur = self.fre_to_node[index].next
            while cur != self.fre_to_node[index].tail:
                print(cur.val, end="->")
                cur = cur.next
            print()
            index += 1
        print("键集合", self.key_to_node.keys())
        print("结束---------------")

    def get(self, key: int) -> int:
        # 如果键不存在
        if key not in self.key_to_node:
            return -1
        else:
            # 如果键存在,把这个节点更新到下一频次
            node = self.key_to_node[key]
            self.remove(node)
            self.insert(node.fre + 1, node)
            return node.val

    def put(self, key: int, value: int) -> None:
        # 如果键不存在
        if key not in self.key_to_node:
            # LFU未满
            if self.length < self.capacity:
                node = Node(key=key, val=value, fre=1)
                self.insert(1, node)
                self.key_to_node[key] = node
                self.length += 1
            else:
                # LFU已满
                index = 1
                while index in self.fre_to_node:
                    if self.fre_to_node[index].next != self.fre_to_node[index].tail:
                        break
                    index += 1
                t = self.fre_to_node[index].tail.pre
                del self.key_to_node[t.key]
                self.remove(t)

                node = Node(key=key, val=value, fre=1)
                self.insert(1, node)
                self.key_to_node[key] = node
        else:
            # 如果键存在,只需要更新键值,把节点更新到下一频次
            node = self.key_to_node[key]
            node.val = value
            self.remove(node)
            self.insert(node.fre + 1, node)


# Your LFUCache object will be instantiated and called as such:
# obj = LFUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)


标签:node,index,fre,Python,self,next,LFU,key
From: https://www.cnblogs.com/DCFV/p/18391245

相关文章

  • python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存及转
    一、python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存    做一个简单的事:使用python读取一个txt文件,里面存储着N行用户id,需要一行行读取后再读取另一个存储用户昵称的txt文件,判断昵称是否有重复,如果没有重复就将数据库中的当前uid用户的昵称......
  • Python 数据结构——二叉树(最最最最最实用的二叉树教程)
    本文章以实用为主,所以不多废话直接开整本文所介绍的二叉树是最基础的二叉树,不是二叉搜索树,也不是平衡二叉树,就基本的二叉树二叉树的创建基本二叉树的创建其实比链表还要简单,只需创建一个节点的类即可,随后用指针将其串起来。不同于链表的是,二叉树为一个父节点连接到两个子节......
  • 用Python解决预测问题_对数线性模型模板
    对数线性模型(Log-linearmodel)是统计学中用于分析计数数据或频率数据的一类模型,特别是在多维列联表(contingencytables)分析中非常常见。这种模型通过取对数将乘法关系转换为加法关系,从而简化了数据分析。在对数线性模型中,我们通常对观测频数的对数进行建模,模型的形式可以表示......
  • 【Python系列】signal信号处理
    ......
  • 【Python系列】 参数默认规则
    ......
  • 20240901_113250 python 知识点列表
    开发环境20240901_113224python环境依赖的备份与导入_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1188873020240901_114639填空题环境的备份与导入_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11888767......
  • 【Python】标准库的使用
    Python通过模块来体现“库”降低了程序猿的学习成本提高了程序的开发效率库就是是别人已经写好了的代码,可以让我们直接拿来用荀子曰:“君子性非异也,善假于物也”一个编程语言能不能流行起来,一方面取决于语法是否简单方便容易学习,一方面取决于生态是否完备所谓的......
  • 20240901_113224 python 环境依赖的备份与导入
    20240830_173845python当前环境依赖包导出到文件中_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1187710920240830_183845python从依赖包记录文件中批量安装包_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11877185......
  • Python 潮流周刊#67:uv 的重磅更新(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,全文2000字。以下是本期摘要:......
  • 基于python+flask框架的衣洗净管理系统的设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快,人们对便捷、高效的生活服务需求日益增长。在日常生活中,洗衣作为家庭日常活动之一,占据了人们不少的时间和精力。传......