LRU キャッシュ アルゴリズムの Java カスタム実装

LRU キャッシュ アルゴリズムの Java カスタム実装

背景

LinkedHashMap は HashMap を継承し、内部的に removeEldestEntry メソッドを提供します。これは、LRU 戦略を実装するための鍵となります。HashMap は、LinkedHashMap 専用のコールバック メソッド afterNodeAccess、afterNodeInsertion、afterNodeRemoval の 3 つも提供します。これら 3 つのメソッドの文字通りの意味は非常に理解しやすく、それぞれノード アクセス、ノード挿入、ノード削除後に実行される動作です。上記の動作に基づいて、LinkedHashMap は LRUCache の機能を実現できます。

[[142638]]

LinkedHashMap の eldest について: eldest は文字通り最も古いという意味です。LinkedHashMap には accessOrder というフィールドがあります。accessOrder が true の場合、LinkedHashMap の内部ノードは訪問回数に応じてソートされます。最も古いノードは訪問回数が最も少ないノードです。 accessOrder が false の場合、LinkedHashMap の内部ノードは挿入順にソートされます。最も古いノードは、最初に挿入されたノードです。デフォルト値は false です。

成し遂げる

LRUCacheを自分で実装するには、removeEldestEntryメソッドをオーバーライドするだけです。コードは次のとおりです。

プライベート静的クラス LRUCache<K, V> は LinkedHashMap<K, V> を拡張します。
{
プライベート静的最終ロングシリアルバージョンUID = -9111855653176630846L;
プライベート静的int MAX_ELEMENTS;

パブリック LRUCache(int initCap, int maxSize) は IllegalArgumentException をスローします
{
スーパー(initCap、0.75f、true);
(最大サイズ<0)の場合
新しい IllegalArgumentException() をスローします。
MAX_ELEMENTS = 最大サイズ;
}

@オーバーライド
保護されたブール値の長男エントリを削除します(Map.Entry<K, V> 長男)
{
size() > MAX_ELEMENTS を返します。
}
}

上記のコードでは、保存されるノードの最大数を制限するために MAX_ELEMENTS 変数が必要です。ノードを挿入するときに、現在のノード数がこの値を超える、LRU 戦略に従ってアクセスが最も少ないノードが削除されます。ここで注目すべきは、デフォルトの LinkedHashMap は挿入順序を保証し、つまりノードは挿入順にソートされるため、削除された場合でも、最後に挿入されたノードが削除されるということです。ただし、コンストラクタで true を渡しました。このパラメータは、LinkedHashMap 内のノードがどのようにソートされるかを決定します。パラメータが true の場合、内部ノードは最新のアクセス時間に従ってソートされることを意味します。false の場合、挿入順にソートされることを意味します。これまでに、単純な LRUCache 実装が完了しました。

知らせ

LinkedHahsMap 実装自体はスレッドセーフではないため、この LRUCache もスレッドセーフではありません。マルチスレッド アクセスが必要な場合は、次のように使用できます: LRUCache cache = Collections.synchronizedMap (new LRUCache (10, 10))。この方法では、キャッシュは複数のスレッドで get/put 操作を実行できます。ただし、この方法で取得されたキャッシュは、複数のスレッドによって走査される場合、依然として安全ではありません。したがって、キャッシュを複数のスレッドでトラバースすることはできず、公式ドキュメントでも、同期マップをトラバースするときにはマップ自体を同期に使用することを推奨しています。

<<:  Playgroundで数値アルゴリズムを学ぶ

>>:  データマイニング: 機械学習手法に基づく POI カテゴリ推奨アルゴリズム

ブログ    
ブログ    

推薦する

ビッグデータ、機械学習、人工知能の将来に影響を与える8つの要因

人工知能と機械学習、そして増え続けるデータ量は、現在のビジネスと社会の状況を変えています。これらの領...

スポーツ業界における5つの重要なAI応用分野

データサイエンスと人工知能がスポーツ分析に導入されることは当たり前のことになりました。そして、テクノ...

...

顔認証+総合決済、モバイル決済が新たな形を生む

モバイル決済は今や人々の生活の一部となり、人々に迅速で便利なショッピング体験をもたらしています。現在...

スズメバチのように機敏! MITの中国人助教授が「センチメートルサイズ」の昆虫型ロボットを開発

目の前を飛んでいる蚊を手を振って追い払っても、また戻ってきて、とてもイライラします。しかし、蚊が飛び...

ビッグビデオモデルは世界モデルですか? DeepMind/UC Berkeley Chinese: 次のフレームを予測することで世界を変えることができる

今年初めにOpenAIが発表した壮大な傑作「Sora」が、ビデオ関連分野のコンテンツエコロジーを変え...

国産ディープラーニングフレームワーク「MegEngine」が3月末にオープンソース化

2020 年にどのディープラーニング フレームワークを選択すべきでしょうか?今、新たな選択肢がありま...

...

人工知能クロニクル | これら 10 大イベントは、人工知能の 64 年間の発展を記録しています

1956 年の夏、アメリカの小さな町ハノーバーの静かなダートマス大学に、ジョン・マッカーシー (Li...

...

あなたの写真を「秘密裏に」使用した顔認識システムはいくつありますか?ツールを使って確認する時が来た

テクノロジー企業が「個人のプライバシーを侵害する」顔認識システムを開発する際、彼らはあなたが予想して...

Daguan Data: 推奨システムアルゴリズムの再ランキングの実践

インターネットの出現と普及は、大量の情報をユーザーにもたらし、情報化時代の情報需要を満たしました。し...

研究者らは、その上に置かれた物を認識できるスマートテーブルクロス生地を開発している

将来、テーブルクロスがあなたの持ち物の所在を知らせたり、あなたの食事を追跡したりすることを想像してみ...

時系列予測におけるディープラーニングの概要と今後の方向性の分析

2023年は大きな言語モデルと着実な普及の年です。時系列の分野ではそれほど大きな成果は得られていませ...