lintcode-24-LFU缓存
24-LFU缓存
LFU是一个著名的缓存算法
实现LFU中的set 和 get样例
capacity = 3
set(2,2)
set(1,1)
get(2)
>> 2
get(1)
>> 1
get(2)
>> 2
set(3,3)
set(4,4)
get(3)
>> -1
get(2)
>> 2
get(1)
>> 1
get(4)
>> 4
思路
参考http://www.lintcode.com/zh-cn/problem/lfu-cache/
在本题中,我们必须要统计每一个 key 出现的次数,所以我们用一个哈希表 cache 来记录当前数据 {key, value} 和其出现次数之间的映射,这样还不够,为了方便操作,我们需要把相同频率的 key 都放到一个 lis t中,那么需要另一个哈希表 freq 来建立频率和一个里面所有 key 都是当前频率的 list 之间的映射。
code
#include <list>
#include <unordered_map>
class LFUCache {
private:
int capacity, minFreq;
unordered_map<int, pair<int, int>> cache;
unordered_map<int, list<int>> freq;
unordered_map<int, list<int>::iterator> iter;
public:
// @param capacity, an integer
LFUCache(int capacity) {
// Write your code here
this->capacity = capacity;
}
// @param key, an integer
// @param value, an integer
// @return nothing
void set(int key, int value) {
// Write your code here
if (capacity <= 0) {
return;
}
// key 已存在,更新 Value
if (get(key) != -1) {
cache[key].first = value;
return;
}
// cache 已满,擦除 minFreq 的 key
if (cache.size() >= capacity) {
cache.erase(freq[minFreq].front());
iter.erase(freq[minFreq].front());
freq[minFreq].pop_front();
}
// 写入新 key
cache[key] = { value, 1 };
freq[1].push_back(key);
iter[key] = --freq[1].end();
minFreq = 1;
}
// @return an integer
int get(int key) {
// Write your code here
// 不存在此 key
if (cache.count(key) == 0) {
return -1;
}
// 更新 cache
freq[cache[key].second].erase(iter[key]);
cache[key].second++;
freq[cache[key].second].push_back(key);
iter[key] = --freq[cache[key].second].end();
if (freq[minFreq].size() == 0) {
minFreq++;
}
return cache[key].first;
}
};
lintcode-24-LFU缓存的更多相关文章
- -实现 LFU 缓存算法
-实现 LFU 缓存算法, 设计一个类 LFUCache,实现下面三个函数 + 构造函数: 传入 Cache 内最多能存储的 key 的数量 + get(key):如果 Cache 中存在该 key, ...
- 算法进阶面试题06——实现LFU缓存算法、计算带括号的公式、介绍和实现跳表结构
接着第四课的内容,主要讲LFU.表达式计算和跳表 第一题 上一题实现了LRU缓存算法,LFU也是一个著名的缓存算法 自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) ...
- LFU缓存
https://leetcode-cn.com/problems/lfu-cache/description/ 缓存的实现可以采取多种策略,不同策略优点的评估就是"命中率".好的策 ...
- [LeetCode]460.LFU缓存机制
设计并实现最不经常使用(LFU)缓存的数据结构.它应该支持以下操作:get 和 put. get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1.put(key, valu ...
- mysql 开发进阶篇系列 24 查询缓存下
一. 查询缓存 1.开启缓存 [root@xuegod64 etc]# vim my.cnf 设置了缓存开启,缓存最大限制128M,重启服务后,再次查询 -- 开启查询缓存后 SHOW VARIABL ...
- [LintCode] LRU Cache 缓存器
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- 【转】缓存淘汰算法系列之2——LFU类
原文地址 :http://www.360doc.com/content/13/0805/16/13247663_304916783.shtml 1. LFU类 1.1. LFU 1.1.1. 原理 L ...
- 缓存淘汰算法之LFU
1. LFU类 1.1. LFU 1.1.1. 原理 LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频 ...
- Go -- LFU类(缓存淘汰算法)(转)
1. LFU类 1.1. LFU 1.1.1. 原理 LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频 ...
随机推荐
- 大专生自学php到找到工作的前前后后
先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...
- CDH部署(以5.7.5为例)
博客园首发,转载请注明出处https://www.cnblogs.com/tzxxh/p/9120020.html 一.准备工作(下面的内容括号内写master的表示仅在master节点执行,all代 ...
- Leecode刷题之旅-C语言/python-231 2的幂
/* * @lc app=leetcode.cn id=231 lang=c * * [231] 2的幂 * * https://leetcode-cn.com/problems/power-of-t ...
- C语言用一级指针处理字符串的反思
1.一级指针处理字符串的常见方式 如果使用单个指针,不方便对字符串本身进行操作,只适合遍历. 使用两个指针, 两个指针和字符串大致有两个常见处理方式: (1)两个指针从字符串首部开始向后移动,同时处理 ...
- 经典傅里叶算法小集合 附完整c代码
前面写过关于傅里叶算法的应用例子. <基于傅里叶变换的音频重采样算法 (附完整c代码)> 当然也就是举个例子,主要是学习傅里叶变换. 这个重采样思路还有点瑕疵, 稍微改一下,就可以支持多通 ...
- 17个C语言可以做的小案例项目
C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中……,这些迷茫也导致了我们在学习的过程 ...
- 05ICMP协议与ARP协议(IP协议中重要协议)
ICMP协议在网络层,应用:ping命令,tracert命令:追踪命令,用于静态路由. ICMP重定向 redirect
- GC错误
如果出现GC错误,可设置客户端 set mapreduce.map.java.opts 设置一下 R的GC错误,在顶端设置这个参数 options(java.parameters = "-X ...
- ELKStack入门篇(四)之Filebeat
Filebeat是轻量级单用途的日志收集工具,用于在没有安装java的服务器上专门收集日志,可以将日志转发到logstash.elasticsearch或redis等场景中进行下一步处理. 官方文档: ...
- 基于ejabberd简单实现xmpp群聊离线消息
首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...