java實現(xiàn)LFU算法的示例代碼
使用JAVA語言實現(xiàn)常用的LFU(Least Frequently Used)算法
定義一個LFUNode類來表示LFU緩存中的節(jié)點
private static class LFUNode<K, V> {
K key;
V value;
int frequency;
public LFUNode(K k, V v) {
key = k;
value = v;
frequency = 1;
}
}
接下來,我們創(chuàng)建一個LFUCache類來實現(xiàn)LFU緩存。在初始化函數(shù)中,我們需要指定緩存的最大容量。
public class LFUCache1<K, V> {
private int capacity;
private Map<K, LFUNode<K, V>> cacheMap;
private Map<Integer, LinkedHashSet<LFUNode<K, V>>> frequencyMap;
private int minFrequency;
public void init(int size) {
this.capacity = size;
cacheMap = new HashMap<>();
frequencyMap = new HashMap<>();
minFrequency = 0;
}
...
接下來,我們實現(xiàn)兩個輔助方法:
addToFrequencyMap:將節(jié)點添加到對應(yīng)頻率的鏈表中。removeFromFrequencyMap:從對應(yīng)頻率的鏈表中移除節(jié)點。
private void addToFrequencyMap(LFUNode<K, V> node) {
int frequency = node.frequency;
frequencyMap.putIfAbsent(frequency, new LinkedHashSet<>());
frequencyMap.get(frequency).add(node);
if (frequency == 1) {
minFrequency = 1;
}
}
private void removeFromFrequencyMap(LFUNode<K, V> node) {
int frequency = node.frequency;
frequencyMap.get(frequency).remove(node);
if (frequency == minFrequency && frequencyMap.get(frequency).size() == 0) {
minFrequency++;
}
}
最后實現(xiàn)核心方法:get和put
public V get(K key) {
if (cacheMap.containsKey(key)) {
LFUNode<K, V> node = cacheMap.get(key);
removeFromFrequencyMap(node);
node.frequency++;
addToFrequencyMap(node);
return node.value;
}
return null;
}
public void put(K key, V value) {
if (capacity <= 0) {
return;
}
if (cacheMap.containsKey(key)) {
LFUNode<K, V> node = cacheMap.get(key);
removeFromFrequencyMap(node);
node.value = value;
node.frequency++;
addToFrequencyMap(node);
} else {
if (cacheMap.size() >= capacity) {
LinkedHashSet<LFUNode<K, V>> minFrequencySet = frequencyMap.get(minFrequency);
LFUNode<K, V> evictNode = minFrequencySet.iterator().next();
minFrequencySet.remove(evictNode);
cacheMap.remove(evictNode.key);
}
LFUNode<K, V> newNode = new LFUNode<>(key, value);
cacheMap.put(key, newNode);
addToFrequencyMap(newNode);
minFrequency = 1;
}
}
最終驗證結(jié)果如下:
@Test
public void testCase() {
LFUCache1<Integer, String> cache = new LFUCache1<>();
cache.init(2);
cache.put(1, "Hello");
cache.put(2, "World");
System.out.println(cache.get(1)); // Output: Hello
cache.put(3, "Foo");
System.out.println(cache.get(2)); // Output: null (evicted)
System.out.println(cache.get(3)); // Output: Foo
}
到此這篇關(guān)于java實現(xiàn)LFU算法的示例代碼的文章就介紹到這了,更多相關(guān)java LFU算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項目中多數(shù)據(jù)源配置方法與使用場景
在 Spring Boot 中配置多數(shù)據(jù)源是一個非常常見的需求,本文將為大家詳細(xì)介紹兩種主流的實現(xiàn)方式與使用場景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-07-07
單點登錄的概念及SpringBoot實現(xiàn)單點登錄的操作方法
在本文中,我們將使用Spring Boot構(gòu)建一個基本的單點登錄系統(tǒng),我們將介紹如何使用Spring Security和JSON Web Tokens(JWTs)來實現(xiàn)單點登錄功能,本文假設(shè)您已經(jīng)熟悉Spring Boot和Spring Security,感興趣的朋友一起看看吧2024-10-10
spring mybatis多數(shù)據(jù)源實例詳解
本文主要介紹sping mybatis多數(shù)據(jù)源處理,在開發(fā)過程中經(jīng)常會遇到多個數(shù)據(jù)庫,這里給大家舉例說明如何處理,希望能幫助有需要的小伙伴2016-07-07
SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題
這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Spring MVC 404 Not Found無錯誤日志的解決方法
這篇文章主要為大家詳細(xì)介紹了Spring MVC 404 Not Found無錯誤日志的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12

