手写LFU置换算法

public class LFUCache<K,V> {


    private Map<K, LinkNode> cache ;
    private Map<Integer, DoubleLinkList<K,V>> freq ;
    private int maxSize;
    private int size;

    public LFUCache(int maxSize) {
        this.maxSize = maxSize;
        this.cache = new HashMap<>(maxSize*4/3);
        this.freq = new HashMap<>();
    }

    public V get(K key){
        LinkNode node = cache.get(key);
        if(node==null){
            return null;
        }
        changeNodeFreq(node);
        return (V) node.value;
    }

    private void changeNodeFreq(LinkNode node) {
        freq.get(node.freq).remove(node);
        node.freq = node.freq + 1;
        if (!freq.containsKey(node.freq)) {
            freq.put(node.freq, new DoubleLinkList<>());
        }
        freq.get(node.freq).addNodeToTail(node);
    }


    public void put(K key,V value){

        LinkNode node = cache.get(key);

        if(node!=null){
            node.value = value;
            changeNodeFreq(node);
            return;
        }

        if(node==null){
            node = new LinkNode(key,value);
            cache.put(key,node);
            if(!freq.containsKey(node.freq)){
                freq.put(node.freq,new DoubleLinkList<>());
            }
            freq.get(node.freq).addNodeToTail(node);
            size++;
            if(size>maxSize){
                int minFreq = getMinFreq();
                LinkNode remove = freq.get(minFreq).removeFromHead();
                cache.remove(remove.key);
                size--;
            }
            return;
        }


    }

    public int getMinFreq(){
        int min = Integer.MAX_VALUE;
        for (Map.Entry<Integer, DoubleLinkList<K, V>> entry : freq.entrySet()) {
            Integer freq = entry.getKey();
            min = freq<min ? freq : min;
            if(min==1){
                break;
            }
        }
        return min;
    }

    public static void main(String[] args) {
        LFUCache<String,String> lfuCache = new LFUCache<>(4);

        lfuCache.put("1","1");
        lfuCache.put("2","2");
        lfuCache.put("3","3");
        lfuCache.put("4","4");

        lfuCache.get("1");
        lfuCache.get("2");

        lfuCache.put("5","5");

        System.out.println(lfuCache.get("3"));
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容