在现代软件开发中,LFU缓存(Least Frequently Used,最不经常使用)是一种非常重要的缓存淘汰策略。当缓存空间不足时,LFU会优先淘汰那些被访问频率最低的数据。本教程将带你从零开始,用C++语言一步步实现一个高效的LFU缓存系统,即使是编程小白也能轻松理解。
LFU(Least Frequently Used)缓存是一种基于访问频率的缓存淘汰算法。与LRU(最近最少使用)不同,LFU关注的是“使用次数”而非“使用时间”。例如:

实现LFU缓存的关键难点在于:如何高效地维护每个键的访问频率,并在O(1)时间内完成插入、获取和淘汰操作。为了达到这个目标,我们需要巧妙地结合哈希表和双向链表。
下面我们将使用C++标准库中的 unordered_map 和自定义双向链表来实现LFU缓存。我们的目标是支持以下操作:
get(key):获取缓存中的值,若存在则返回值并增加访问频率;否则返回 -1put(key, value):插入或更新键值对,若缓存已满则淘汰频率最低且最久未使用的键我们需要两个主要的数据结构:
#include <unordered_map>#include <list>#include <algorithm>using namespace std;class LFUCache {private: struct Node { int key, value, freq; Node(int k, int v, int f) : key(k), value(v), freq(f) {} }; int capacity; int minFreq; unordered_map<int, list<Node>::iterator> keyMap; unordered_map<int, list<Node>> freqMap;public: LFUCache(int capacity) : capacity(capacity), minFreq(0) {} int get(int key) { if (keyMap.find(key) == keyMap.end()) { return -1; } auto nodeIt = keyMap[key]; int val = nodeIt->value; int freq = nodeIt->freq; // 从当前频率列表中移除 freqMap[freq].erase(nodeIt); // 如果当前频率列表为空且是最小频率,则更新minFreq if (freqMap[freq].empty() && minFreq == freq) { minFreq++; } // 插入到 freq+1 的列表中 freqMap[freq + 1].emplace_front(key, val, freq + 1); keyMap[key] = freqMap[freq + 1].begin(); return val; } void put(int key, int value) { if (capacity == 0) return; if (keyMap.find(key) != keyMap.end()) { // 更新现有键 auto nodeIt = keyMap[key]; int freq = nodeIt->freq; freqMap[freq].erase(nodeIt); if (freqMap[freq].empty() && minFreq == freq) { minFreq++; } freqMap[freq + 1].emplace_front(key, value, freq + 1); keyMap[key] = freqMap[freq + 1].begin(); } else { // 插入新键 if (keyMap.size() >= capacity) { // 淘汰最小频率中最久未使用的节点 auto lastNode = freqMap[minFreq].back(); keyMap.erase(lastNode.key); freqMap[minFreq].pop_back(); } minFreq = 1; freqMap[1].emplace_front(key, value, 1); keyMap[key] = freqMap[1].begin(); } }};让我们逐段分析这段C++实现的关键部分:
通过这种设计,get 和 put 操作的时间复杂度均为 O(1),满足高性能要求。
int main() { LFUCache cache(2); cache.put(1, 1); cache.put(2, 2); cout << cache.get(1) << endl; // 输出 1 cache.put(3, 3); // 淘汰 key=2 cout << cache.get(2) << endl; // 输出 -1 cout << cache.get(3) << endl; // 输出 3 cache.put(4, 4); // 淘汰 key=1 cout << cache.get(1) << endl; // 输出 -1 cout << cache.get(3) << endl; // 输出 3 cout << cache.get(4) << endl; // 输出 4 return 0;}通过本教程,你已经掌握了如何用C++语言实现一个高效的LFU缓存系统。LFU作为经典的缓存淘汰算法,在数据库、操作系统和Web服务中广泛应用。理解其原理和实现方式,不仅能提升你的算法能力,还能在实际项目中优化系统性能。
记住,Least Frequently Used 的核心思想是“频率优先”,而高效实现的关键在于数据结构的巧妙组合。希望这篇教程对你有所帮助!
本文由主机测评网于2025-12-09发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125243.html