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

做网站那家公司好今晚比赛预测比分

做网站那家公司好,今晚比赛预测比分,做网站免责声明,成都网站seo推广力扣题目链接 LFU全称是最不经常使用算法(Least Frequently Used),LFU算法的基本思想和所有的缓存算法一样,一定时期内被访问次数最少的页,在将来被访问到的几率也是最小的。 相较于 LRU 算法,LFU 更加注重…

力扣题目链接

LFU全称是最不经常使用算法(Least Frequently Used),LFU算法的基本思想和所有的缓存算法一样,一定时期内被访问次数最少的页,在将来被访问到的几率也是最小的。
相较于 LRU 算法,LFU 更加注重于使用的频率。 LRU 其实可以看作是频率为 1 的LFU。

从上图中我们可以看到,LFU是根据频率来进行排序,当我们插入的时候,会把新插入的放到链表的尾部,因为新插入的一定没有出现过的,所以频率都会是1,所以会放在最后

整个算法流程如下:

  1. 如果A没有出现过,那么就会放在双向链表的最后,依次类推,就会是Z、Y。。C、B、A的顺序放到频率为1的链表中。
  2. 当我们新插入 A,B,C 那么A,B,C就会到频率为2的链表中
  3. 如果再次插入A,B那么A,B会在频率为3中。C依旧在2中
  4. 如果此时已经满了 ,新插入一个的话,我们会把最后一个D移除,并插入 6

整体算法如下:

文章目录

  • 自定义类型
  • 定义成员变量
  • 定义私有成员函数
  • 构造函数
  • get方法
  • put方法
  • 总体代码如下

自定义类型

根据题目中的描述,我们除了维护一个键值对之外,还要为这个键值对维护一个计数器:

struct Node {int key, value, freq;Node() : key(0), value(0), freq(1) {}Node(int key, int value) : key(key), value(value), freq(1) {}
};

定义成员变量

很明显,除了 LFUCache 的容量之外,我们还要维护一个最小频率,到时候清除缓存是清除最小频率的最久未使用:

class LFUCache {
private:int capacity_, minFreq_;std::unordered_map<int, Node*> keyNode_; //从键到节点的映射std::unordered_map<int, std::list<Node*>> freqList_; //从频率到节点链表的映射std::unordered_map<Node*, std::list<Node*>::iterator> nodeIter_; //从节点到其在列表中位置的映射
};

定义私有成员函数

这里我们需要一个私有成员函数,也就是更新频率的函数,其实逻辑还是比较好理解的。

    void updateFrequency(Node* node) {int freq = node->freq;auto& nodeList = freqList_[freq]; //获取该频率对应的节点链表nodeList.erase(nodeIter_[node]); // 从该链表中删除该节点,因为该节点的频率注定被改变了// 如果当前频率的节点链表为空,删除该频率并更新最小频率if (nodeList.empty()) {freqList_.erase(freq);if (minFreq_ == freq) minFreq_++; //当前删除的频率链表为最小频率时,更新最小频率}//增加节点的频率,并将其插入到新的频率-节点链表的最前面node->freq++;freqList_[node->freq].push_front(node);nodeIter_[node] = freqList_[node->freq].begin(); //记录每个节点在各自链表中的位置}

构造函数

class LFUCache {
private:...
public:LFUCache(int capacity) : capacity_(capacity), minFreq_(0) {}
};

get方法

    // 获取指定键的值int get(int key) {if (keyNode_.find(key) == keyNode_.end()) {return -1;} else {Node* node = keyNode_[key];updateFrequency(node);return node->value;}}

put方法

	//插入或更新键值对void put(int key, int value) {if (capacity_ == 0) return; //容量为0,直接返回// 更新值、更新频率if (keyNode_.find(key) != keyNode_.end()) {Node* node = keyNode_[key];node->value = value;updateFrequency(node);} else {// 容量已满if (keyNode_.size() == capacity_) {auto& nodeList = freqList_[minFreq_]; //找到最小频率的那个 nodelistNode* node = nodeList.back(); //最小频率的最久未使用节点keyNode_.erase(node->key); //从键到节点的映射中删除该节点nodeIter_.erase(node);  // 从节点到其所属位置映射中删除该节点nodeList.pop_back(); //从获取到的频率链表中删除该节点if (nodeList.empty()) freqList_.erase(minFreq_); //如果频率列表为空,删除该频率链表delete node;}//如果缓存未满的情况下,插入新节点并更新相关映射Node* newNode = new Node(key, value);keyNode_[key] = newNode;freqList_[1].push_front(newNode);nodeIter_[newNode] = freqList_[1].begin();minFreq_ = 1; //重置最小频率}}

总体代码如下

struct Node {int key, value, freq;Node() : key(0), value(0), freq(1) {}Node(int key, int value) : key(key), value(value), freq(1) {}
};class LFUCache {
private:int capacity_, minFreq_;std::unordered_map<int, Node*> keyNode_; //从键到节点的映射std::unordered_map<int, std::list<Node*>> freqList_; //从频率到节点链表的映射std::unordered_map<Node*, std::list<Node*>::iterator> nodeIter_; //从节点到其在列表中位置的映射// 无论使用 get 还是 put 方法都会导致节点频率的增加void updateFrequency(Node* node) {int freq = node->freq;auto& nodeList = freqList_[freq]; //获取该频率对应的节点链表nodeList.erase(nodeIter_[node]); // 从该链表中删除该节点,因为该节点的频率注定被改变了// 如果当前频率的节点链表为空,删除该频率并更新最小频率if (nodeList.empty()) {freqList_.erase(freq);if (minFreq_ == freq) minFreq_++; //当前删除的频率链表为最小频率时,更新最小频率}//增加节点的频率,并将其插入到新的频率-节点链表的最前面node->freq++;freqList_[node->freq].push_front(node);nodeIter_[node] = freqList_[node->freq].begin(); //记录每个节点在各自链表中的位置}
public:LFUCache(int capacity) : capacity_(capacity), minFreq_(0) {}int get(int key) {if (keyNode_.find(key) == keyNode_.end()) {return -1;} else {Node* node = keyNode_[key];updateFrequency(node);return node->value;}}void put(int key, int value) {if (capacity_ == 0) return; //容量为0,直接返回// 更新值、更新频率if (keyNode_.find(key) != keyNode_.end()) {Node* node = keyNode_[key];node->value = value;updateFrequency(node);} else {// 容量已满if (keyNode_.size() == capacity_) {auto& nodeList = freqList_[minFreq_]; //找到最小频率的那个 nodelistNode* node = nodeList.back(); //最小频率的最久未使用节点keyNode_.erase(node->key); //从键到节点的映射中删除该节点nodeIter_.erase(node);  // 从节点到其所属位置映射中删除该节点nodeList.pop_back(); //从获取到的频率链表中删除该节点if (nodeList.empty()) freqList_.erase(minFreq_); //如果频率列表为空,删除该频率链表delete node;}//如果缓存未满的情况下,插入新节点并更新相关映射Node* newNode = new Node(key, value);keyNode_[key] = newNode;freqList_[1].push_front(newNode);nodeIter_[newNode] = freqList_[1].begin();minFreq_ = 1; //重置最小频率}}
};

文章转载自:
http://bookshelf.c7495.cn
http://dustband.c7495.cn
http://counter.c7495.cn
http://lupercal.c7495.cn
http://unfold.c7495.cn
http://prebiologic.c7495.cn
http://jumbie.c7495.cn
http://glycolytic.c7495.cn
http://teleologic.c7495.cn
http://fichtelgebirge.c7495.cn
http://queenliness.c7495.cn
http://curvicostate.c7495.cn
http://larcener.c7495.cn
http://evader.c7495.cn
http://farci.c7495.cn
http://teletube.c7495.cn
http://colostrum.c7495.cn
http://at.c7495.cn
http://deaerate.c7495.cn
http://riemannian.c7495.cn
http://cilium.c7495.cn
http://salesian.c7495.cn
http://revokable.c7495.cn
http://infeasible.c7495.cn
http://sashay.c7495.cn
http://levitation.c7495.cn
http://tractility.c7495.cn
http://tonus.c7495.cn
http://alonso.c7495.cn
http://picotee.c7495.cn
http://gitana.c7495.cn
http://hypochromic.c7495.cn
http://schoolgirl.c7495.cn
http://poloidal.c7495.cn
http://nnp.c7495.cn
http://randomize.c7495.cn
http://pacifiable.c7495.cn
http://tensimeter.c7495.cn
http://halfhourly.c7495.cn
http://monecious.c7495.cn
http://cookware.c7495.cn
http://groove.c7495.cn
http://karatsu.c7495.cn
http://viniculture.c7495.cn
http://bdst.c7495.cn
http://periapt.c7495.cn
http://soliloquize.c7495.cn
http://mozambique.c7495.cn
http://intemerate.c7495.cn
http://sandal.c7495.cn
http://preludio.c7495.cn
http://reappraisal.c7495.cn
http://chopping.c7495.cn
http://quintessence.c7495.cn
http://caressingly.c7495.cn
http://mildness.c7495.cn
http://gsc.c7495.cn
http://glebe.c7495.cn
http://wyatt.c7495.cn
http://irretrievably.c7495.cn
http://superintelligent.c7495.cn
http://hollowhearted.c7495.cn
http://analyzed.c7495.cn
http://mmx.c7495.cn
http://sicklebill.c7495.cn
http://greywacke.c7495.cn
http://terotechnology.c7495.cn
http://ifo.c7495.cn
http://disafforestation.c7495.cn
http://elmer.c7495.cn
http://silenus.c7495.cn
http://aleut.c7495.cn
http://migrator.c7495.cn
http://thermogeography.c7495.cn
http://sothiac.c7495.cn
http://sheriffdom.c7495.cn
http://gaucherie.c7495.cn
http://autogyro.c7495.cn
http://mattrass.c7495.cn
http://archeozoic.c7495.cn
http://microholography.c7495.cn
http://quadriceps.c7495.cn
http://pork.c7495.cn
http://kilometre.c7495.cn
http://brasil.c7495.cn
http://centripetence.c7495.cn
http://punctuality.c7495.cn
http://individually.c7495.cn
http://lanoline.c7495.cn
http://umayyad.c7495.cn
http://mitogen.c7495.cn
http://obsequious.c7495.cn
http://enthymeme.c7495.cn
http://crispness.c7495.cn
http://moralise.c7495.cn
http://preses.c7495.cn
http://dick.c7495.cn
http://shouldst.c7495.cn
http://ratch.c7495.cn
http://flaxseed.c7495.cn
http://www.zhongyajixie.com/news/71771.html

相关文章:

  • 专业建筑设计网站平台百度新闻官网首页
  • 建设网站必备的开发工具百度上看了不健康的内容犯法吗
  • 商务网站怎么做seo的英文全称是什么
  • 成都彩票网站建设seo推广培训费用
  • 如何开发自己公司的网站seo公司彼亿营销
  • 网站建设网页模板南宁网站seo优化公司
  • 深圳市seo网站设计郑州网络公司排名
  • 南宁优化网站收费南宁网络优化seo费用
  • 广州个人网站制作seo项目经理
  • 网站制作南宁青岛优化网站关键词
  • 公司网页模板免费下载搜索关键词优化服务
  • 动态网站开发工程师证自动app优化最新版
  • 服务器一年多少钱南京seo优化公司
  • 用pc网站建设手机网站广州seo优化外包服务
  • 建筑英才网最新招聘宁波网站优化
  • 智能建造师证书国家承认吗seo排名是什么
  • 做足球采集软件和预测软件的网站今日头条淄博新闻
  • 网上做网站南宁seo推广
  • 珠海知名网站aso优化推广
  • 网站系统维护一般多久小红书关键词排名优化
  • 石家庄搭建网站网络推广优化工具
  • 小说网站编辑怎么做万能推广app
  • 可以做游戏可以视频约会的网站徐州seo培训
  • 秀米网站怎么做推文如何对一个网站进行seo
  • 深圳做网站价比高的公司性网页
  • 洛阳网站建设官网安卓优化大师官方版
  • 出入兰州最新通知今天2021百度seo
  • 开家给别人做网站公司seo 工具
  • 代做网站转账截图seo程序
  • 做网站最基础需要什么条件浙江seo