背景怎么样选出最受欢迎的水果中最近购买的品种的价格LRU类#include list #include map #include unordered_map templatetypename K, typename V class LRUMap { public: using ListType std::liststd::pairK, V; using CacheMap std::mapK, typename ListType::iterator; using CacheMapIter typename CacheMap::iterator; LRUMap(int cap 100) : m_capacity(cap) { } virtual ~LRUMap() { } CacheMapIter find(const K key) { return m_cache.find(key); } bool isValid(const CacheMapIter iter) const { return iter ! m_cache.end(); } V get(const K key) { return get(find(key)); } /** * brief 缓存查询 * param it */ V get(const CacheMapIter it) { if (it m_cache.end()) return {}; m_list.splice(m_list.begin(), m_list, it-second); return it-second-second; } /** * brief 缓存新增 * param key * param value */ void put(const K key, V value) { if (m_list.size() m_capacity) { // 先删除最后一个 auto last m_list.end(); --last; m_cache.erase(last-first); m_list.pop_back(); } m_list.emplace_front(key, value); m_cache.try_emplace(key, m_list.begin()); } /** * brief 热度更新。数据变更 * param it */ void update(const CacheMapIter it) { if (it m_cache.end()) return; if (m_list.size() 2) return; m_list.splice(m_list.begin(), m_list, it-second); it-second m_list.begin(); } /** * brief 热度更新。数据不变 * param it * param value */ void update(const CacheMapIter it, V value) { if (it m_cache.end()) return; if (m_list.empty()) return; if (m_list.size() 2) { m_list.begin()-second value; return; } m_list.splice(m_list.begin(), m_list, it-second); it-second m_list.begin(); it-second-second value; } private: int m_capacity; ListType m_list; std::mapK, typename ListType::iterator m_cache; };LRU键类class Key { public: Key(std::string type, std::string color):m_type(type), m_color(color){} std::string type() const { return m_type; } std::string color() const { return m_color; } private: bool operator(const Key other) const { return if(m_type other.type()) return m_color other.color(); return m_type other.type();} bool operator(const Key other) const { return m_type other.type() m_color other.color(); } private: std::string m_type; std::string m_color; };LRU扩展类class LRUCache : public LRUMapKey, float { public: LFUCache(int cap) : LRUMapKey, float(cap) , m_freq(0) { } int freq() const { return m_freq; } void setFreq(int freq) { m_freq freq; } private: int m_freq; };LFU类// LRU最近使用缓存例如青苹果和红苹果都是苹果最近出现的颜色被缓存。 // LFU出现最多缓存例如香蕉和苹果都是水果应该被分类出现次数多的水果被缓存。 // LFU嵌LRU类 class LFUCache { public: using Iter std::unordered_mapstd::string, LRUCache::iterator; LFUCache(int cap) : m_capacity(cap) { } LRUCache insert(const std::string content) { auto findIter m_fruitLRUMap.find(content); if (findIter m_fruitLRUMap.end()) { if (m_fruitLRUMap.size() m_capacity) shrink_to_fit_one(); findIter m_fruitLRUMap.try_emplace(content, 12).first; } updateFreq(findIter); return findIter-second; } private: /* * * 删除一个低频次的LRU缓存 */ void shrink_to_fit_one() { if (m_fruitFreqMap.empty()) return; auto lowFreqIter m_fruitFreqMap.begin(); if (lowFreqIter-second.empty()) return; auto removeIter lowFreqIter-second.begin(); m_fruitLRUMap.erase(*removeIter); // 更新LRU缓存 if (lowFreqIter-second.size() 2) { m_fruitFreqMap.erase(lowFreqIter); return; } lowFreqIter-second.erase(removeIter); // 删除低频次的一个 } void updateFreq(Iter iter) { // 从旧的频次中删除 auto oldFreq iter-second.freq(); auto oldFreqFindIter m_fruitFreqMap.find(oldFreq); if (oldFreqFindIter ! m_fruitFreqMap.end()) { if (oldFreqFindIter-second.size() 2) m_fruitFreqMap.erase(oldFreq); // 只剩一个整体删除 else oldFreqFindIter-second.erase(iter-first); // 局部删除 } // 新的频次添加 auto newFreq oldFreq 1; auto newFreqFindIter m_fruitFreqMap.find(newFreq); if (newFreqFindIter m_fruitFreqMap.end()) m_fruitFreqMap.try_emplace(newFreq, std::unordered_setstd::string{ iter-first }); else newFreqFindIter-second.insert(iter-first); iter-second.setFreq(newFreq); } private: std::unordered_mapstd::string, LRUCache m_fruitLRUMap; // 每种水果最近出现的品种 std::mapint, std::unordered_setstd::string m_fruitFreqMap; // 经常出现的水果 int m_capacity; };使用示例一// 水果最近有被购买 bool testPriceChange(const Key key, float price) { LRUMapstd::string, Key lastFruitMap; auto findCacheIter lastFruitMap.find(key.type()); if (!lastFruitMap.isValid(findCacheIter)) return true; if (findCacheIter-second-second ! price) return true; return false; } Key key(苹果红色); float price 10.f; auto isChange testPriceChange(key, price); std::cout Price is change isChange std::endl;使用示例二// 统计经常被购买水果价格 float testPrice(const Key key) { LFUCache fruitCache; auto lruCache fruitCache.insert(key.type()); auto cacheIter lruCache.find(key); bool hasCache lruCache.isValid(cacheIter); float price; if (hasCache) { // 最近有被购买 price cacheIter-second-second; lruCache.update(cacheIter); } else { price 10; // 请输入价格 lruCache.put(key, price); } return price; } Key key(苹果红色); auto price testPrice(key); std::cout Price is price std::endl;参考https://www.geeksforgeeks.org/lru-cache-implementation/https://leetcode.cn/problems/lru-cache/https://www.geeksforgeeks.org/least-frequently-used-lfu-cache-implementation/https://leetcode.cn/problems/lfu-cache/创作不易小小的支持一下吧
企业数字化 ERP 产品动态
相关推荐
HarmonyOS DevEco Studio的使用练习题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 21:54:44
JavaScript - 比较运算符:等于与全等的核心区别 👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕JavaScript这个话题展开,希望能为你带来一些… · 2026/11/6 12:08:18
曲阳哪里能考电工证怎么报名,证书过期了不知道怎么复审延期? 曲阳哪里能考电工证怎么报名,证书过期了不知道怎么复审延期? 证书过期了不知道怎么复审延期,这种情况在我们这个圈子里太常见了。很多人拿着电工证去工地、去维修、去安装,结果一查,证已经失效了,不仅影响工作,还可能带来安全隐患。 怎么报名… · 2026/11/7 17:56:16
重庆考电工证58同城报名入口与办理流程,学历不高也能上岗必备 重庆考电工证58同城报名入口与办理流程,学历不高也能上岗必备 你是不是也这样?初中毕业,想找个稳定的工作,结果一打听,人家说“必须有电工证”。 学历不高怕报不上名 ?别急,今天就给你讲讲重庆考电工证58同城报名的全过程,让你知道,… · 2026/11/7 17:56:16
北京大兴区低压电工证在哪考才靠谱?怕考不过白交培训费 北京大兴区低压电工证在哪考才靠谱?怕考不过白交培训费 你是不是正纠结 北京大兴区低压电工证在哪考 ,又担心培训费花了钱,最后还考不过?我来告诉你,选对地方和方式,能省下大把冤枉钱,还能顺利拿到证。下面我结合信阳中小施工企业负责人的实战经验,… · 2026/11/7 17:56:16
电工证过期了不知道怎么复审延期?网上如何查电工证呀多少钱你知道吗 电工证过期了不知道怎么复审延期?网上如何查电工证呀多少钱你知道吗 证书过期了不知道怎么复审延期,这事儿真让人头疼。你可能正对着电脑,盯着“证书已失效”的提示,心里打鼓:网上如何查电工证呀?多少钱?复审流程又该怎么走?别急,今天咱们就来聊聊电… · 2026/11/7 17:56:16
怎样识别电工证真伪证丢了怎么补办 电工证真伪怎么查?别再交钱白跑一趟,含金量还在吗? 怕考不过白交培训费?现在市面上的电工证真假混杂,不少人花了几千块报名,结果拿到手的证根本用不上,甚至影响后续找工作、考证复审。这篇文章就带你搞清楚 怎样识别电工证真伪 ,顺便讲讲电工证的… · 2026/11/7 17:56:16
黄冈弱电电工证在哪考2026河南最新政策解读 黄冈弱电电工证在哪考2026河南最新政策解读 你是不是也担心自己学历不高,考不了电工证?别慌,2026年河南最新政策已经出炉,明确指出 学历不再是报考的绝对门槛… · 2026/11/7 17:55:16
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23