一个HashMap存储缓存元素,同时元素间使用双向链表链接,链表保持使用次数从大到小排序,在get的时候更新链表,更新方法,从当前元素往前找到一个刚好比自己使用次数多的,将当前元素删除后再插入到这个元素的后面。
比如 a使用3次,b,c,d,e都使用了2次,当前get(d)。那么d变为3,此时删除d,链表为a-3 b-2 c-2 e-2,再讲d添加到a的后面,成为a-3 d-3 b-2 c-2 e-2。
代码:
package cn.wzy.algorithm;
import java.util.HashMap;
import java.util.Map;
public class LfuCache {
static class Node {
String key;
Integer value;
Integer count;
Node pre, next;
Node(String key, Integer value, Integer count) {
this.key = key;
this.value = value;
this.count = count;
}
@Override
public String toString() {
return "Node{" +
"key='" + key + '\'' +
", value=" + value +
", count=" + count +
'}';
}
}
Map<String, Node> cache = new HashMap<>();
Node head = new Node(null, null, Integer.MAX_VALUE);
Node tail = head;
int size = 0;
void add(String key, Integer value) {
if (cache.containsKey(key)) {
Node now = cache.get(key);
now.value = value;
now.count++;
update(now);
} else if (size < 5) {
Node node = new Node(key, value, 1);
tail.next = node;
node.p