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算法的实现

  • 2017年05月07日 13:29
  • 3KB
  • 下载

LRU置换算法

  • 2013年11月28日 17:12
  • 1KB
  • 下载

FIFO、LRU、OPT这三种置换算法的缺页次数

考虑下述页面走向:           1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6      当内存块数量分别为3时,试问FIFO、LRU、OPT这三种置换算法...

LRU缓存算法

  • 2012年05月25日 09:45
  • 7KB
  • 下载

lru页面置换算法

  • 2011年12月04日 10:30
  • 1KB
  • 下载

数据库存取缓冲区的LRU与MRU算法

 原文链接: http://news.dayoo.com/tech/201005/21/10000617_102079584.htm
  • lmdcszh
  • lmdcszh
  • 2014年10月01日 11:01
  • 5226

OPT和LRU算法C语言实现

  • 2012年11月19日 18:10
  • 4KB
  • 下载

操作系统实验之页面置换算法(OPT、FIFO、LRU)C++简单实现

南邮操作系统实验之页面置换算法(OPT、FIFO、LRU)C++简单实现
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LRU算法
举报原因:
原因补充:

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