-实现 LFU 缓存算法

-实现 LFU 缓存算法, 设计一个类 LFUCache,实现下面三个函数
+ 构造函数: 传入 Cache 内最多能存储的 key 的数量
+ get(key):如果 Cache 中存在该 key,则返回对应的 value 值,否则,返回-1。
+ set(key,value):如果 Cache 中存在该 key,则重置 value 值;如果不存在该 key,则将该 key 插入到到 Cache 中,若插入后会导致 Cache 中存储的 key 个数超过最大容量,则在插入前淘汰访问次数最少的数据。

注:
所有 key 和 value 都是 int 类型。
访问次数:每次get/set一个存在的key都算作对该key的一次访问;当某个key被淘汰的时候,访问次数清零。

public class LFUCache{
HashMap<Integer,Integer> keyValues;
HashMap<Integer,Integer> keyCounts;
HashMap<Integer,LinkedHashSet<Integer>> countKeySets;

int capacity;
int min;

public LFUCache(int capacity){
this.capacity = capacity;
this.min = -1;
keyValues = new HashMap<Integer,Integer>();
keyCounts = new HashMap<Integer,Integer>();
countKeySets = new HashMap<Integer,LinkedHashSet<Integer>>;
countKeySets.put(1,LinkedHashSet<Integer>());
}

public int get(int key){
if(!keyValues.containsKey(key)){
return -1;
}
int count = KeyCounts.get(key);
keyCounts.put(key,count+1);
countKeySets.get(count).remove(key);
if(count == min && countKeySets.get(count).size() == 0){
min++;
}
if(!countKeySets.containsKey(count+1){
countKeySets.put(count+1,new LinkedHashSet<Integer>());
}
countKeySets.get(count+1).add(key);
return keyValues.get(key);
}

public void set(int key , int value){
if(capacity <= 0){
return ;
}

if(keyValues.containsKey(key)){
keyValues.put(key,value);
get(key);
return;
}
if(keyValues.size() >= capacity){
int leastFreq = countKeySets.get(min).iterator().next();
keyValues.remove(lestFreq);
keyCounts.remove(lestFreq);
countKeySets.get(min).remove(leastFreq);
}

keyValues.put(key,value);
keyCounts.put(key,1);
countKeySets.get(1).add(key);
min = 1;
}

}

原文地址:https://www.cnblogs.com/canacezhang/p/9622788.html

时间: 2024-11-13 09:55:52

-实现 LFU 缓存算法的相关文章

[转]缓存、缓存算法和缓存框架简介

以下内容转自:http://www.leexiang.com/cache-algorithm (转载请注明出处)-----------------------------------分割线---------------------------------------------- 引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪

缓存、缓存算法和缓存框架

译者:lixiang 译文:http://www.zavakid.com/25 原文:http://www.jtraining.com/component/content/article/35-jtraining-blog/98.html 引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 面试 “缓存就是存贮数

缓存、缓存算法和缓存框架简介

文章转载于:http://blog.jobbole.com/30940/ 引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 面试 “缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些.” 这就是 programmer one (programmer one 是一个面试

缓存算法

引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 面试 “缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些.” 这就是 programmer one (programmer one 是一个面试者)在面试中的回答(一个月前,他向公司提交了简历,想要应聘要求在缓存,缓存

[转] 通俗讲解:缓存、缓存算法和缓存框架

通俗讲解:缓存.缓存算法和缓存框架 1引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 2面试 “缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些.” 这就是 programmer one (programmer one 是一个面试者)在面试中的回答(一个月前,他向

缓存算法之LRU与LFU

1 LRU算法 1.1 前言     目前尽量由于摩尔定律,但是在存储硬件始终存在着矛盾,例如在容量方面,内存<外存:而在硬件成本与访问效率方面,内存>外存,并且这种区别是不在同一数量级别的差异.而目前互联网服务平台存在的特点:读多写少,数据规模巨大,长尾效应等等.正是由于场景需求与存储硬件之间的本身矛盾,缓存算法由此产生了.      一个服务平台其读取过程:总是优先去离CPU最近的地方内存中读取数据,当有限的空间读取命中为空时,则去外存的数据库或文件系统中读取.当有限的缓存空间里“人满为患

缓存算法(FIFO 、LRU、LFU三种算法的区别)

缓存算法(FIFO .LRU.LFU三种算法的区别) FIFO算法# FIFO 算法是一种比较容易实现的算法.它的思想是先进先出(FIFO,队列),这是最简单.最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小.空间满的时候,最先进入的数据会被最早置换(淘汰)掉. FIFO 算法的描述:设计一种缓存结构,该结构在构造时确定大小,假设大小为 K,并有两个功能: set(key,value):将记录(key,value)插入该结构.当缓存满时,将最先进入缓存的数据置

缓存算法合辑

缓存算法有很多种策略,具体可以参见https://en.wikipedia.org/wiki/Cache_replacement_policies.其中最常提到的就是LRU和LFU了. 1. LRU 问题描述: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put. get(key) - G

本地应用缓存算法和缓存策略的介绍

特别声明:该文章是 本人在网上搜索到的一些资料,稍作整理而成的,还望大家不要误会,具体出自于那本人也已经忘记.还请大家不要误会!!!   通过设计良好的数据分块.预取.替换.更新等算法来提高对缓存内容的命中率和一致性. 1)数据分块      Memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存.在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的.但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操