私は、DoublyLinkedListの独自の実装を使用してJavaでLRUキャッシュを実装していますが、整数のキーと値を持つノードでキーがページ識別子を示し、ディスク。また、O(1)アクセス用のハッシュマップを使用しています。LRUキャッシュのJavaインプリメンテーションでミスが発生した場合のSETアクション
要求されたキーがキャッシュヒットの場合、その値(つまり、その位置)を返し、このノードをDoublyLinkedListの前面に移動します。
私はそれが欠場しているときには、他の重要な側面に疑念があります。さまざまなリソースによれば、私の場合はキーであるページ番号がLinkedListの先頭にセットされ、その間に満杯になると、最後に要素を削除してからそれを正面に入力してください。今実装するために、キャッシュにそのページ番号(キー)を入れるとき、そのページ番号(キー)の「価値」はどうなのでしょうか?私はそれをゴミにセットすべきですか?私の下で提示された 'get'メソッドの実装では、私は現在-1を返しています。
また、実際のLRUキャッシュの製造コードでは、キャッシュにページ番号または実際の値が格納されていますか? T
この部分をクリアしてください。ありがとう。
import java.util.HashMap;
public class LRU {
private static class Node {
Node previous;
Node next;
int key;
int value;
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
Node head = null;
Node tail = null;
HashMap<Integer, Node> hmap = new HashMap<>();
public int get(int key) {
if (hmap.containsKey(key)) {
Node n = hmap.get(key);
remove(n);
moveToFront(n);
return n.value;
}
return -1;
}
public void remove(Node n) {
// if n is head
if (n.previous == null) {
head = head.next;
} else {
n.previous.next = n.next;
}
//if n is tail
if (n.next == null) {
tail = n.previous;
} else {
n.next.previous = n.previous;
}
}
public void moveToFront(Node n) {
if(n==head)
return;
if(n.next==null)
{
n.previous.next=n.next;
tail = n.previous;
n.previous = null;
n.next = head;
head = n;
}
else {
n.previous.next=n.next;
n.next.previous=n.previous;
}
}
public void set(int key, int value) {
}
}
"実用的なプロダクションコード"では、独自のコードを展開する代わりに、 'LinkedHashMap'を使用します。それ以外に、存在しないエントリを表すノードを挿入することは意味を成さない。この時点で、「ページ番号」または「ページ番号に格納された実際の値」が何を意味するのかを明示せずに、一種のマップを記述しただけです。だからこそ質問はしないでください。このデータにはキャッシュが必要だと決めたのはあなたです。 – Holger
簡単に行ってください。ここルーキー。 –
あなたが説明しなかったあなたのアプリケーションに特有の事柄については、私たちが質問に答えることができないことを理解するために、「ルーキー」とは何の関係もありません。 LRUキャッシュの作成は、[このコンストラクタ](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html#LinkedHashMap-int-float)を使用して、 'LinkedHashMap'をサブクラス化するのと同じくらい簡単です。 -boolean-)を 'true'で置き換えると、ヒットするとエントリが前面に移動し、[' removeEldestEntry']を上書きします(https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html# removeEldestEntry-java.util.Map.Entry-)、ドキュメントには既に固定サイズの処理方法が示されています。 – Holger