当前位置: 首页 > news >正文

LFU 缓存 -- LinkedHashSet

相关题目:
460. LFU 缓存

相关文章
LRU 缓存 – 哈希链表

# 460. LFU 缓存
# Python中和 LinkedHashSet 相似的数据结构 OrderedDict
from collections import OrderedDict
class LFUCache:# key 到 val 的映射,我们后文称为 KV 表keyToVal = {}# key 到 freq 的映射,我们后文称为 KF 表keyToFreq = {}# freq 到 key 列表的映射,我们后文称为 FK 表freqToKeys = {}# 记录最小的频次minFreq = 0# 记录 LFU 缓存的最大容量cap = 0def __init__(self, capacity: int):self.keyToVal = {}self.keyToFreq = {}self.freqToKeys = {}self.cap = capacityself.minFreq = 0def get(self, key: int) -> int:if key not in self.keyToVal:return -1# 增加 key 对应的 freqself.increaseFreq(key)return self.keyToVal[key]def put(self, key: int, val: int) -> None:if self.cap <= 0:return# 若 key 已存在,修改对应的 val 即可if key in self.keyToVal:self.keyToVal[key] = val# key 对应的 freq 加一self.increaseFreq(key)return# key 不存在,需要插入# 容量已满的话需要淘汰一个 freq 最小的 keyif self.cap <= len(self.keyToVal):self.removeMinFreqKey()# 插入 key 和 val,对应的 freq 为 1# 插入 KV 表self.keyToVal[key] = val# 插入 KF 表self.keyToFreq[key] = 1# 插入 FK 表self.freqToKeys.setdefault(1, OrderedDict())self.freqToKeys[1].setdefault(key)# 插入新 key 后最小的 freq 肯定是 1self.minFreq = 1def removeMinFreqKey(self):# freq 最小的 key 列表keyList = self.freqToKeys.get(self.minFreq)# 其中最先被插入的那个 key 就是该被淘汰的 keydeletedKey = next(iter(keyList))# 更新 FK 表keyList.pop(deletedKey)if not keyList:self.freqToKeys.pop(self.minFreq)# 问:这里需要更新 minFreq 的值吗?# 更新 KV 表self.keyToVal.pop(deletedKey)# 更新 KF 表self.keyToFreq.pop(deletedKey)def increaseFreq(self, key: int) -> None:freq = self.keyToFreq[key]# 更新 KF 表self.keyToFreq[key] = freq + 1# 更新 FK 表# 将 key 从 freq 对应的列表中删除self.freqToKeys[freq].pop(key)# 将 key 加入 freq + 1 对应的列表中self.freqToKeys.setdefault(freq + 1, OrderedDict())self.freqToKeys[freq + 1].setdefault(key)# 如果 freq 对应的列表空了,移除这个 freqif not self.freqToKeys[freq]:del self.freqToKeys[freq]# 如果这个 freq 恰好是 minFreq,更新 minFreqif freq == self.minFreq:self.minFreq += 1
http://www.lryc.cn/news/185574.html

相关文章:

  • 用IDEA操作数据库--MySQL
  • 扫雷游戏的递归解法
  • java练习 day5
  • 腾讯云轻量和CVM有啥区别?怎么选择服务器配置?
  • 服务器or虚拟机安装SSH和虚拟机or服务器设置远程服务权限
  • Sentinel入门
  • Mac解压缩软件BetterZip免费版注册码下载
  • 在win10里顺利安装了apache2.4.41和php7.4.29以及mysql8.0.33
  • 云服务仿真:完全模拟 AWS 服务的本地体验 | 开源日报 No.45
  • css实现不规则图片文字环绕效果
  • Day-05 CentOS7.5 安装 Docker
  • 激光雷达:自动驾驶的眼睛
  • Scratch3.0下载
  • 多功能频率计周期/脉宽/占空比/频率测量verilog,视频/代码
  • img标签src动态绑定资源失败问题
  • 【自学笔记】网络安全——黑客技术
  • Rust 技术文档及详细使用命令
  • 建立HTTP代理IP池的技术和工具支持
  • 【机器学习】数据格式csv/txt/pkl
  • unity脚本_Input鼠标键盘 c#
  • 解析‘找不到msvcp140.dll无法继续执行代码’这个问题的解决方法
  • 练[FBCTF2019]RCEService
  • php实战案例记录(21)sprintf函数
  • 【数据结构-二叉树 九】【树的子结构】:树的子结构
  • 七张图解锁Mybatis整体脉络,让你轻松拿捏面试官
  • 力扣之删除有序数组中的重复项
  • pnpm、npm、yarn 包管理工具『优劣对比』及『环境迁移』
  • 【AntDesign】多环境配置和启动
  • Unix Network Programming Episode 78
  • 学习笔记(css穿透、vue-cookie、拦截器、vuex、导航守卫、token/Cookie、正则校验)