スペースは最低使用データを排除する不十分な場合LRUは、最小最近、最低使用、使用しています。
3通りの方法でそれを達成するための方法があります。
1、単独リンクリスト
原則:
1、挿入:データを直接リストの末尾に、最新のデータである挿入
を探し、2:データは、リストの最後尾に移動して検索し、それが最新の訪問を表します。
3.削除:リストの先頭には、リストがいっぱいになった場合は、リストデータの先頭が削除され、最低使用表し
時間複雑:O(n)は、
2、二重にリンクされたリストのハッシュテーブル+
図1に示すように、挿入は5つのノード、リスト2内の各ノードを有しています。
2、ブラックリスト、代表ハッシュ衝突後のリスト。
3、赤、代表ノード間リストの順序。
図4に示すように、各ノードは、4つの部分、すなわちプレポインタデータ、次ポインタリスト、黒、赤、次のポインタのリストで構成されています。
検索:ハッシュテーブルを検索し、その後、双方向リンクリストの末尾に移動します。
削除:ハッシュテーブルはそれを削除し、前駆体ノード二重にリンクされたリストを取得するには、一読します。
その後、直接、リストの末尾に、それ以外の不満、リストの末尾に動きがある場合は、完全なリストのヘッドノードを削除しない場合は、存在するかどうかを見て、その後、リストの末尾を挿入:挿入します。
3、のLinkedHashMap
LinkedHashMapは、HashMapのから継承され、HashMapのは、すべての機能を持っていますが、のLinkedHashMapは、二重リンクリストを実装するためのヘッドとテールポインタを増加させました。
1、挿入順、二重リンクリストのテールに新しいデータに基づいてデータを保存するためのLinkedHashMapデフォルトサポート。
アクセス方法に従って構築された2は、順序、二重リンクリストのテールに最新のデータへのアクセスをサポートしています。
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を達成することは容易です。