この記事はWeChatの公開アカウント「Xiaolangmazhida」から転載したもので、著者はSimon Langです。この記事を転載する場合は、Xiaolangmazhida の公開アカウントにご連絡ください。 背景 効率性を追求する私たちの世界では、何かを待つときにとてもイライラするようです。Web ページを更新できないとイライラしますし、コンピューターがプログラムを実行するのが遅いとイライラします。では、私たちは何をすべきでしょうか? 技術の創造は私たちに役立つのではないでしょうか? 今日は、キャッシュの技術についてお話しし、私たちがよく知っているデータ構造、つまりリンク リストを使用して LRU キャッシュ削除アルゴリズムを実装します。 リンク リストを使用して LRU キャッシュ削除アルゴリズムを実装する方法を学ぶ前に、いくつかの質問を提起しましょう。それらについて慎重に考えてみましょう。質問は次のとおりです。
さて、上記の質問に答えて次の研究に進みましょう。 1. キャッシュとは何ですか? また、その機能は何ですか? キャッシュとは、簡単に言えば、データのコピーを保存して、後ですぐにアクセスできるようにすることです。コンピュータの使用シナリオを例に挙げてみましょう。CPU がメモリ内のデータにアクセスする場合、まずキャッシュを検索します。キャッシュが見つかった場合は、直接使用されます。キャッシュが見つからない場合は、メモリを検索する必要があります。 同様に、データベース アクセスのシナリオでは、プロジェクト システムがデータベース内のデータの一部をクエリする必要がある場合、最初に要求でキャッシュをクエリできます。ヒットした場合は、キャッシュされた結果が直接返されます。ヒットしなかった場合は、データベースをクエリし、クエリ結果をキャッシュに格納します。次に要求されたときに、キャッシュがヒットした場合は、データベースを再度クエリせずに結果を直接返します。 上記の 2 つの例から、シナリオが何であっても、最初にキャッシュ、次にメモリ、次にキャッシュ、次にデータベースという順序があることがわかりました。しかし、キャッシュの存在はメモリ空間の一部を占有するため、キャッシュは空間を時間と交換する典型的な例であり、データのリアルタイム性を犠牲にしながらも、コンピュータの動作の高効率性を満たします。 よく考えてみると、私たちは日々の開発の中でキャッシュの例にかなり多く遭遇します。
ディスクのやり取りを減らす
データベースクエリを削減
アプリケーションサーバーへのリクエストを減らす
ウェブサイトへの訪問を減らす 2. キャッシュ除去戦略は何ですか? キャッシュの本質は、スペースを時間と交換することであるため、キャッシュの容量は制限される必要があります。キャッシュがいっぱいになった場合、キャッシュ内のどのデータをクリアし、どのデータを保持する必要がありますか? これには、キャッシュ削除戦略を決定する必要があります。 実際、一般的に使用されているキャッシュ削除戦略は 3 つあります。先入れ先出し FIFO、一定期間にアクセスが最も少ないページを削除する (最も頻繁に使用されない LFU)、最も長い間使用されていないページを削除する (最も最近使用されていない LRU) これらのアルゴリズムは、異なるレベルのキャッシュで実行された場合に効率が異なるため、特定のシナリオに基づいて選択する必要があります。 2.1 FIFOアルゴリズム FIFO アルゴリズムは先入れ先出しアルゴリズムであり、多くの場合キューを使用して実装されます。キャッシュの設計原則は、データが最初にキャッシュに入った場合は、最初に削除されるというものです。 FIFOアルゴリズム 新しくアクセスされたデータは FIFO キューの最後に挿入され、キュー内のデータはキューの先頭から順番に移動します。 キューがいっぱいになったら、キューの先頭にあるデータを削除します 2.2 LRUアルゴリズム LRU アルゴリズムは、データへの履歴アクセス数に基づいてデータを排除し、通常はリンク リストを使用して実装されます。キャッシュでは、データが最近アクセスされた場合、将来もアクセスされる可能性が高くなるという設計原則があります。 LRUアルゴリズム
2.3 LFUアルゴリズム LFU アルゴリズムは、データの過去のアクセス頻度に基づいてデータを削除します。したがって、LFU アルゴリズムの各データ ブロックには参照カウントがあります。すべてのデータ ブロックは参照カウントに従ってソートされ、同じ参照カウントを持つデータ ブロックは時間順にソートされます。キャッシュでは、データが何度もアクセスされると、将来さらに頻繁にアクセスされるという原則に基づいて設計されています。 LFUアルゴリズム
3. リンク リストを使用してキャッシュ削除を実装する方法、その特徴、最適化する方法を教えてください。 上記の記事では、キャッシュと削除戦略の概念を理解しました。その中でも、LRUアルゴリズムは筆記試験/面接で頻繁にテストされます。秋に採用活動をしていたとき、多くの企業からこのアルゴリズムを手動で記述するように求められました。誰もが陥る落とし穴を避けるために、以下にLRUキャッシュ削除アルゴリズムを手動で記述してみましょう。 リンクリストには複数の形式があることは誰もが知っていますが、どれを選択すればよいのでしょうか? 3分ほど考えてみてください... さあ、答えを発表しましょう! 実際、リンク リストは、接続構造の違いにより、単一リンク リスト、循環リンク リスト、二重リンク リストに分類できます。
二重リンクリストが単一リンクリストよりも優れている主な利点は、先行ノードの検索にかかる時間計算量が O(1) であるのに対し、単一リンクリストでは先頭ノードからゆっくりと下方向にしか検索できないため、依然として O(n) であることです。さらに、挿入と削除の最適化も行われます。 疑問が湧くかもしれません: 単一リンクリストの挿入と削除は O(1) ではないでしょうか? はい、しかし一般的に、挿入や削除の操作を実行する場合、最初に検索してから挿入または削除する必要があります。実際には最初に O(n)、次に O(1) であることがわかります。 削除操作を実行する必要があるため、ノードを削除するには、ノード自体のポインタを取得するだけでなく、他の先行ノードのポインタを操作する必要があります。双方向リンクリストは先行ノードを直接見つけることができるため、操作時間の複雑さは O(1) になります。したがって、LRU キャッシュ削除アルゴリズムを実装するための構造として双方向リンクリストを使用する方が効率的です。 アルゴリズムのアイデア キャッシュされたすべての値を格納するために二重リンク リストを維持し、最も古い値をリストの末尾に配置します。 アクセスされた値がリンクリスト内にある場合: リンクリスト内の値が検索され、削除され、その値がリンクリストの先頭に再度追加されます (リンクリスト内の値の順序が新しいものから古いものへとなるようにします) アクセスされた値がリンクリストにない場合: リンクリストがいっぱいの場合: リンクリストの最後の値を削除し、追加する値をリンクリストの先頭に置きます。リンクリストがいっぱいでない場合: リンクリストの先頭に直接追加します。 3.1 LRUキャッシュ除去アルゴリズム Geek Time Wang Zheng の「The Beauty of Data Structure and Algorithm」では、順序付き単一リンク リストを使用した LRU キャッシュ削除アルゴリズムが紹介されています。コードは次のとおりです。
このコードは、キャッシュがいっぱいかどうかに関係なく、リンク リストをトラバースする必要があるため、このリンク リストの実装に基づくキャッシュ アクセスの時間計算量は O(n) です。 3.2 ハッシュテーブルを使用して LRU を最適化する 実際、このアイデアはさらに最適化できます。単方向リンク リストを双方向リンク リストに置き換え、ハッシュ テーブルを導入することができます。
ハッシュ テーブルは検索が高速ですが、データには固定の順序がありません。一方、リンク リストには順序があります。挿入と削除は高速ですが、検索は低速です。これらを組み合わせることで、新しいデータ構造 LinkedHashMap を形成できます。 ハッシュテーブル + 二重リンクリスト Likou の質問 146 - LRU キャッシュ メカニズムを練習に使用できます。質問の画像は次のとおりです。 トピック: 既知のデータ構造を使用して、LRU (最近最も使われていない) キャッシュ メカニズムを設計および実装します。
LRUCache(int capacity) 正の整数を容量としてLRUキャッシュを初期化します。 int get(int key) キーワードキーがキャッシュ内に存在する場合はキーワードの値を返し、存在しない場合は -1 を返します。 void put(int key, int value) キーワードがすでに存在する場合は、そのデータ値を変更します。キーワードが存在しない場合は、「キーワード値」セットを挿入します。キャッシュの容量がいっぱいになると、新しいデータ値のためのスペースを確保するために、新しいデータを書き込む前に、最も最近使用されていないデータ値を削除する必要があります。 アイデア: 私たちのアイデアはハッシュテーブル+双方向リンクリストです
コード
巨人の肩の上: [1] データ構造とアルゴリズムの美しさ - 王正 [2] Likku-LRUキャッシュメカニズム(146問) [3]https://blog.csdn.net/yangpl_tale/article/details/44998423 [4]https://leetcode-cn.com/problems/lru-cache/solution/146-lru-huan-cun-ji-zhi-ha-xi-biao-shuan-l3um/ |
<<: 署名アルゴリズムに基づくシンプルで安全なAPI認証メカニズム
>>: 現在最も興味深い AI は、実は系図会社から生まれたものなのでしょうか?
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
Companies and Markets の評価レポートでは、世界の音声認識市場は今後さらに多様...
[[329380]]テクノロジーの発展に伴い、人工知能とデータサイエンスはスポーツの分野でますます重...
[51CTO.com からのオリジナル記事] 2015 年 1 月、Microsoft は長年「革...
専門家は、2025 年までにデータ ユニバース、つまりデータ ユニバースの規模が 180 ゼタバイト...
データ センターとは何ですか。どのように使用しますか。具体的には、データ センターにはどのような種類...
世界保健機関によれば、2050年までに世界中で約20億人が60歳以上になると予想されています。これら...
翻訳者 |李睿レビュー | Chonglou AI 拡張ソフトウェア エンジニアリングは、人工知能と...
今年 5 月、OpenAI はすべての ChatGPT Plus ユーザー向けにネットワーキングおよ...