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 カテゴリ推奨アルゴリズム

ブログ    

推薦する

...

この記事では機械学習における3つの特徴選択手法を紹介します。

機械学習では特徴を選択する必要があり、人生でも同じではないでしょうか?特徴選択とは、利用可能な多数の...

「ブロックチェーン+人工知能」は医療金融やその他の応用シナリオに応用されています

最近、国家インターネット金融セキュリティ技術専門家委員会と上海振聯公司は共同で「ブロックチェーン+A...

C# のデータ構造とアルゴリズムにおけるツリーの役割を紹介します

C# データ構造とアルゴリズムツリーまず、Windows でコマンド ラインに「tree」と入力しま...

ユーモアを理解し、皮肉のスキルに溢れた、マスクのChatGPTのライバルがついにチャットのスクリーンショットを公開

最近、マスク氏の伝記「イーロン・マスク:伝記」が国内外でベストセラーとなった。この本には、マスク氏の...

公正な「データアクセス」の新秩序の構築 AIが都市統治に根付く

最近では、AI テクノロジーがさまざまな業界に大きな影響を与えていることがニュースで頻繁に紹介されて...

起業180日で評価額20億ドルを達成! OpenAIの欧州版は人気があり、Llamaの開発者は独自の会社を設立し、Nvidiaが投資している

「欧州版OpenAI」の最新評価額は20億ドルに近づいています!パリを拠点とする大手モデルスタートア...

人工知能のルーツを解読する

[[384631]] ◇コンピューティングパワーアルゴリズムの重要な基盤として、人工知能チップと人...

「あなたは私の中にいて、私はあなたの中にいる」人工知能はビッグデータと恋愛関係になりたい!

最近では、「ビッグデータ」や「人工知能」ほどよく使われる流行語はほとんどありません。多くのデータ分析...

...

各国の人工知能戦略の解釈

現在、人工知能の開発は引き続き盛んに行われており、新世代の科学技術革命の先駆者となりつつあります。米...

人工知能がブルーカラーの仕事に取って代わると、どのような影響があるでしょうか?

AI と ML をより多くのタスクに統合すると、短期的には多くのメリットが得られますが、長期的には...

李菲菲の「具現化された知能」はどこまで進歩したのか?

2009年、当時プリンストン大学に勤務していたコンピューター科学者のフェイフェイ・リー氏が、人工知...