c++实现lfu缓存支持o(1)操作:node含key/value/freq及list迭代器;freqmap按频次分桶,keymap映射key到迭代器;minfreq动态维护,put/get时通过桶间迁移与空桶检测确保均摊o(1)。

用C++实现LFU缓存,要求支持O(1)频率更新与最小频率节点定位
当缓存容量受限且访问模式呈现明显热点倾斜时,必须避免频繁驱逐高频项——LFU机制通过追踪每个键的访问频次来保障热点数据驻留,但朴素实现中查找最小频次桶的时间复杂度为O(F),F为当前最大频次;本方案将最小频次维护、频次桶切换、节点迁移全部压缩至均摊O(1)。
第一步:定义核心结构体Node,包含key、value、freq三个字段,并使用std::list
第二步:声明两个关键容器:std::unordered_map
第三步:维护全局变量minFreq,初始值设为0;每次get或put触发频次提升时,若原频次桶为空且原频次等于minFreq,则minFreq自增1——【minFreq只增不减,且仅在原桶清空时才更新,否则会导致误删仍存活的低频项】。
插入新键值对时的频次桶自动创建与minFreq同步逻辑
方法一:put操作中,若key不存在,先检查缓存是否已满。若满,从freqMap[minFreq]的尾部弹出一个节点(LRU策略在同频次内生效),同时从keyMap中擦除对应key。
方法二:为新节点分配频次1,直接插入freqMap[1]头部;更新keyMap[key]指向该新节点的迭代器;重置minFreq = 1——这一步不可省略,因为刚清空的旧minFreq可能已失效。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
方法三:若key已存在,先通过keyMap找到原节点,从freqMap[oldFreq]中O(1)删除它(利用保存的迭代器),再将其以oldFreq+1插入freqMap[oldFreq+1]头部;若oldFreq == minFreq且freqMap[oldFreq]变为空,则minFreq++。
get操作中频次原子递增与桶迁移的具体路径
调用get(key)时,先查keyMap。若未命中,返回-1;若命中,获取对应迭代器it及所在桶频次f。
执行freqMap[f].erase(it) → 在freqMap[f+1].push_front({key, value, f+1}) → 更新keyMap[key]为新节点的begin()迭代器。
这一步必须严格按此顺序执行:先删除再插入,否则同一key在两个桶中重复存在;【若跳过删除直接修改freq字段并移动节点,std::list迭代器会失效,引发未定义行为】。
最后返回value。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










