LRUアルゴリズムを実装する方法?

スペースは最低使用データを排除する不十分な場合LRUは、最小最近、最低使用、使用しています。
3通りの方法でそれを達成するための方法があります。

1、単独リンクリスト

LRUアルゴリズムを実装する方法?

原則:
1、挿入:データを直接リストの末尾に、最新のデータである挿入
を探し、2:データは、リストの最後尾に移動して検索し、それが最新の訪問を表します。
3.削除:リストの先頭には、リストがいっぱいになった場合は、リストデータの先頭が削除され、最低使用表し

時間複雑:O(n)は、

2、二重にリンクされたリストのハッシュテーブル+

LRUアルゴリズムを実装する方法?

図1に示すように、挿入は5つのノード、リスト2内の各ノードを有しています。
2、ブラックリスト、代表ハッシュ衝突後のリスト。
3、赤、代表ノード間リストの順序。
図4に示すように、各ノードは、4つの部分、すなわちプレポインタデータ、次ポインタリスト、黒、赤、次のポインタのリストで構成されています。

検索:ハッシュテーブルを検索し、その後、双方向リンクリストの末尾に移動します。
削除:ハッシュテーブルはそれを削除し、前駆体ノード二重にリンクされたリストを取得するには、一読します。
その後、直接、リストの末尾に、それ以外の不満、リストの末尾に動きがある場合は、完全なリストのヘッドノードを削除しない場合は、存在するかどうかを見て、その後、リストの末尾を挿入:挿入します。

3、のLinkedHashMap

LinkedHashMapは、HashMapのから継承され、HashMapのは、すべての機能を持っていますが、のLinkedHashMapは、二重リンクリストを実装するためのヘッドとテールポインタを増加させました。

LRUアルゴリズムを実装する方法?

1、挿入順、二重リンクリストのテールに新しいデータに基づいてデータを保存するためのLinkedHashMapデフォルトサポート。
LRUアルゴリズムを実装する方法?
LRUアルゴリズムを実装する方法?
アクセス方法に従って構築された2は、順序、二重リンクリストのテールに最新のデータへのアクセスをサポートしています。
LRUアルゴリズムを実装する方法?
LRUアルゴリズムを実装する方法?

4、どのように自動的に期限切れのデータリストの先頭を削除することLRUアルゴリズムを実現するには?

LinkedHashMapデフォルトが自動的にリストのヘッドノードのデータを削除されていない、私たちはクラスをカバーする方法が必要です:removeEldestEntryを

クラスを達成するための1は、のLinkedHashMap LruLinkedMapを継承します

package com.jane;

import java.util.LinkedHashMap;

public class LruLinkedMap<K,V> extends LinkedHashMap<K,V> {

    private int size;

    public LruLinkedMap(int initialCapacity,
               float loadFactor,
               boolean accessOrder) {
        super(initialCapacity, loadFactor, accessOrder);
        this.size = initialCapacity;
    }

    /**
     * @description 重写LinkedHashMap中的removeEldestEntry方法,当LRU中元素多余6个时,
     *              删除最不经常使用的元素
     */
    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        if(size() > size){
            return true;
        }
        return false;
    }

}

2、起動ファイル:

package com.jane;

import java.util.Map;

public class Main {

    public static void main(String[] args) {
        LruLinkedMap<String, String> ss = new LruLinkedMap(5, 0.75f, true);

        ss.put("1", "3");
        ss.put("2", "4");
        ss.put("3", "6");
        ss.put("4", "1");
        ss.put("5", "5");

        for(Map.Entry e: ss.entrySet()) {
            System.out.println(e.getKey());
        }
        System.out.println("---------------");

        ss.get("1");

        for(Map.Entry e: ss.entrySet()) {
            System.out.println(e.getKey());
        }
        System.out.println("---------------");
        ss.put("7", "10");

        for(Map.Entry e: ss.entrySet()) {
            System.out.println(e.getKey());
        }
    }
}

3.結果:
LRUアルゴリズムを実装する方法?

このようにして、LRUを達成することは容易です。

おすすめ

転載: blog.51cto.com/janephp/2435311