[〜#〜] lru [〜#〜]と[〜#〜] lfu [〜#〜]キャッシュの実装の違いは何ですか?
LRUはLinkedHashMap
を使用して実装できることを知っています。しかし、LFUキャッシュを実装する方法は?
キャッシュ容量が3のキャッシュリクエストの一定のストリームを考えてみましょう。以下を参照してください。
A, B, C, A, A, A, A, A, A, A, A, A, A, A, B, C, D
Least Recent Used(LRU) HashMapを使用したキャッシュ+ O(1)立ち退き時間とO(1)読み込み時間。上記のようにキャッシュ要求を処理している間に、次の要素がキャッシュされます。
[A]
[A, B]
[A, B, C]
[B, C, A] <- a stream of As keeps A at the head of the list.
[C, A, B]
[A, B, C]
[B, C, D] <- here, we evict A, we can do better!
この例を見ると、私たちがより良いことができることが簡単にわかります-将来Aをリクエストする可能性が高いので、最も使用されていない場合でも、それを排除すべきではありません。
A - 12
B - 2
C - 2
D - 1
Least Frequently Used(LFU)キャッシュは、キャッシュリクエストがエビクションアルゴリズムで使用された回数を追跡することにより、この情報を利用します。
LRUは、最も最近使用されていないキャッシュと呼ばれるキャッシュ追い出しアルゴリズムです。
これを見てください resource
LFUは、最も頻繁に使用されないキャッシュと呼ばれるキャッシュ追い出しアルゴリズムです。
3つのデータ構造が必要です。 1つは、キーを指定してO(1)でキャッシュエントリを取得できるように、キー/値をキャッシュするために使用されるハッシュテーブルです。 2つ目は、アクセスの頻度ごとの二重リンクリストです。頻度リストエントリの作成を避けるため、最大頻度はキャッシュサイズで制限されます。最大サイズ4のキャッシュがある場合、4つの異なる周波数になります。各周波数には、その特定の周波数に属するキャッシュエントリを追跡するための二重リンクリストがあります。 3番目のデータ構造は、これらの周波数リストを何らかの形でリンクすることです。キャッシュエントリにアクセスすると、時間O(1)で次の周波数リストに簡単に昇格できるように、配列または別のリンクリストのいずれかです。
主な違いは、LRUでは、他のページよりも古いページを最近使用したページのみをチェックすることです。つまり、最近使用したページのみに基づいてチェックします。しかし、LFUでは、古いページとそのページの頻度をチェックします。ページの頻度が古いページよりも大きい場合は削除できません。すべての古いページが同じ頻度である場合は、最後に取得しますFIFOそのためのメソッドです。ページを削除します...