【アルゴリズムシリーズ】消去アルゴリズムのLRU

LRUアルゴリズム

LRU(最も最近使用されていない)は、最も最近使用されていない。

LRUアルゴリズムのアイデア

最近のデータへのアクセスがない場合、今後アクセスされる可能性は低いと考えられます。

したがって、スペースがいっぱいになると、最も古い未使用のデータが最初に削除されます。

LRUアルゴリズムの説明

キャッシュ構造を設計します。構造は、サイズがKであると仮定して、サイズの構築で決定され、2つの機能があります。

  • put(key, value)この構造にレコード(キー、値)を挿入します。キャッシュがいっぱいになると、最も古い未使用のデータが削除されます。

  • get(key)キーに対応する値を返します。

LRUアルゴリズムの実装

  1. 最も単純なアイデアは、配列+タイムスタンプメソッドを使用することですが、これは効率が悪くなります。

  2. 二重リンクリスト(LinkedList)+ハッシュテーブル(HashMap)を使用して達成できます(リンクリストは場所を示すために使用され、ハッシュテーブルは保存と検索に使用されます)。

  3. Javaのデータ構造を直接使用しますLinkedHashMap

LRUCache

package com.itplh;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author: tanpenggood
 * @date: 2020-09-17 10:49
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    
    
    private int cacheSize;

    public LRUCache(int cacheSize) {
    
    
    	// LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
        // 关键:使用的三个参数的构造方法,将accessOrder设置为true,LinkedHashMap默认为false
        super(16, (float) 0.75, true);
        this.cacheSize = cacheSize;
    }

	/**
     * 当缓存空间不够时,淘汰最久未使用的数据
     * 
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    
    
        return size() > cacheSize;
    }

}

LRUCacheTest

package com.itplh;

import lombok.extern.slf4j.Slf4j;

/**
 * @author: tanpenggood
 * @date: 2020-09-17 10:49
 */
@Slf4j
public class LRUCacheTest {
    
    

    public static void main(String[] args) {
    
    
        LRUCache<String, Integer> cache = new LRUCache<>(5);
        for (int i = 1; i <= 5; i++) {
    
    
            cache.put("k" + i, i);
        }
        log.info("all cache: {}", cache);
        cache.get("k3");
        log.info("get k3: {}", cache);
        cache.get("k4");
        log.info("get k4: {}", cache);
        cache.get("k4");
        log.info("get k4: {}", cache);
        cache.put("k" + 10, 10);
        log.info("After running the LRU algorithm cache: {}", cache);
    }
}

出力

all cache: {
    
    k1=1, k2=2, k3=3, k4=4, k5=5}
get k3: {
    
    k1=1, k2=2, k4=4, k5=5, k3=3}
get k4: {
    
    k1=1, k2=2, k5=5, k3=3, k4=4}
get k4: {
    
    k1=1, k2=2, k5=5, k3=3, k4=4}
After running the LRU algorithm cache: {
    
    k2=2, k5=5, k3=3, k4=4, k10=10}

総括する

  1. この要素からデータを最後まで取り出す意志からcacheそれぞれget
  2. スペースが最初のチーム(最近使用)の要素のうち、不足している場合、データ、最初の新しいデータは、尾に保存され、その後、十分なバッファ領域かどうかを判断します。cacheput

参照

キャッシュアルゴリズム(FIFO、LRU、LFUの違い)

おすすめ

転載: blog.csdn.net/AV_woaijava/article/details/108638788
おすすめ