LRU算法

转载 2016年06月01日 18:14:56

LRU算法

  1. 是什么:LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据。而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance.
  2. 实现:
//实现
public class LRUCache1<K, V> {

    private final int MAX_CACHE_SIZE;
    private Entry first;
    private Entry last;

    private HashMap<K, Entry<K, V>> hashMap;

    public LRUCache1(int cacheSize) {
        MAX_CACHE_SIZE = cacheSize;
        hashMap = new HashMap<K, Entry<K, V>>();
    }

    public void put(K key, V value) {
        Entry entry = getEntry(key);
        if (entry == null) {
            if (hashMap.size() >= MAX_CACHE_SIZE) {
                hashMap.remove(last.key);
                removeLast();
            }
            entry = new Entry();
            entry.key = key;
        }
        entry.value = value;
        moveToFirst(entry);
        hashMap.put(key, entry);
    }

    public V get(K key) {
        Entry<K, V> entry = getEntry(key);
        if (entry == null) return null;
        moveToFirst(entry);
        return entry.value;
    }

    public void remove(K key) {
        Entry entry = getEntry(key);
        if (entry != null) {
            if (entry.pre != null) entry.pre.next = entry.next;
            if (entry.next != null) entry.next.pre = entry.pre;
            if (entry == first) first = entry.next;
            if (entry == last) last = entry.pre;
        }
        hashMap.remove(key);
    }

    private void moveToFirst(Entry entry) {
        if (entry == first) return;
        if (entry.pre != null) entry.pre.next = entry.next;
        if (entry.next != null) entry.next.pre = entry.pre;
        if (entry == last) last = last.pre;

        if (first == null || last == null) {
            first = last = entry;
            return;
        }

//这一段没看明白
        entry.next = first;
        first.pre = entry;
        first = entry;
        entry.pre = null;
    }

    private void removeLast() {
        if (last != null) {
            last = last.pre;
            if (last == null) first = null;
            else last.next = null;
        }
    }


    private Entry<K, V> getEntry(K key) {
        return hashMap.get(key);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        Entry entry = first;
        while (entry != null) {
            sb.append(String.format("%s:%s ", entry.key, entry.value));
            entry = entry.next;
        }
        return sb.toString();
    }

    class Entry<K, V> {
        public Entry pre;
        public Entry next;
        public K key;
        public V value;
    }
}
//测试
public class LRUCacheTest {
    public static void main(String[] args)throws Exception{
        System.out.println("start...");

        LRUCacheTest test = new LRUCacheTest();
        test.lruCache1();
    }

    void lruCache1(){
        System.out.println();
        System.out.println("===========================LRU 链表实现===========================");
        LRUCache1<Integer,String> lru = new LRUCache1<Integer, String>(5);
        lru.put(1,"11");
        lru.put(2,"11");
        lru.put(3,"11");
        lru.put(4,"11");
        lru.put(5,"11");
        System.out.println(lru.toString());
        lru.put(6,"66");
        lru.get(2);
        lru.put(7,"77");
        lru.get(4);
        System.out.println(lru.toString());
        System.out.println();
    }
}

相关文章推荐

LRU算法的实现

LRU置换算法

【转载】对用LRU和FIFO算法计算“缺页中断”的理解

输入缺页次数页面流:0 1 2 3 2 1 3 2 5 2 3 6 2 1 4 2 FIFO分析:012發別調入內存, 則內存:012(3次缺頁) 調入3逃汰最先進入的0,則內存:123(4次缺頁) ...

LRU缓存算法

lru页面置换算法

Lru算法在Android中的应用

Lru算法,将命中率不高的空间释放掉,保留命中率较高的空间。

OPT和LRU算法C语言实现

Java应用缓存介绍与LRU(Least Recently Used)算法

对于大规模的Java Web应用来说,会有大量的数据和大量的用户,对于如何提升网站的响应速度成为了我们开发人员的一个挑战。对于缓存来说,它可以解决其中的一部分问题。在这篇文章中,我会介绍什么是缓存,它...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)