Interactive

LFUキャッシュ可視化

LFU(Least Frequently Used)は、LRU可視化の「最近使ったか」ではなく、「何回使われたか」で追い出す対象を決めるキャッシュ方式です。 GET/PUTのたびにキーは1つ上の頻度(freq)グループへ移動し、容量超過時は最小頻度グループの中で最も使われていない側(同頻度の中ではLRUで決着)が追い出されます。 教科書として広く知られるLeetCode 460の公式例をそのまま再生できます。

容量
GET/PUTどちらもヒットすればfreqが+1されます

頻度(freq)が低いグループほど上・追い出し対象。各行の中はLRU(左)← → MRU(右)

(空)
GETヒット率: 0/0使用中: 0 / 2最小freq: (次に追い出すならこのグループから)

ここが分かる

  • LRUが「1本の順序」だけで管理できるのに対し、LFUは「頻度ごとのグループ」×「グループ内のLRU順序」という2階層が必要——だからLFUの実装はLRUより一段複雑になる。
  • 同じ頻度の中でどちらを追い出すかはLRUのルールで決着する(LeetCode 460の標準的な定義)。「何回使われたか」が同点なら「最後に使われたのはいつか」で決める、という2段階の判定。
  • LRU可視化と同じく、JS Mapの反復順序(挿入順)という仕様上の保証だけで、頻度バケツごとのO(1)実装ができる——delete→setでそのキーをバケツの末尾(MRU側)に移すだけ。
  • LFUはアクセス頻度が急に変わるワークロード(例: 昔よく見たが今は見ないページ)に弱い——頻度は下がらず貯まり続けるため、「昔の人気」が「今の人気」より優先され続けてしまう(実運用では時間減衰を加えることが多い)。