LRU Cacheキャッシュ
3067 ワード
迅速な理解
搬送元アドレスinterviewcake
最近の最小使用(LRU)キャッシュでは、どのデータがまだ使用されていないかをすばやく判断できます.ハンガーを干して、服がいつも片側にぶら下がっていることを想像してみてください.最近一番少ない服を探すには、物干し棚の反対側を見てください.最下位レベルでは、LRUキャッシュは、通常、二重チェーンテーブルをハッシュマッピングテーブルとペアリングすることによって実現される.
を選択します.
複雑さ
スペース
O(n)
最小アクセス項目の取得
O(1)
エントリの読み込み
O(1)
メリット:
欠点
スペースが重い.LRUキャッシュは、nエントリの長さnのチェーンテーブルと、nエントリのハッシュマップを保持する必要がある.2つのO(n)空間のデータ構造(1つではない)が必要である.
キャッシュを使用する理由
ケーキのレシピがたくさんある調理場を管理するとします.どのサイトと同様に、できるだけ早くページを提供したいと考えています.
ユーザーがフォーミュラを要求すると、ディスク上の対応するファイルを開き、HTMLを読み取り、ネットワークを介して送信できます.ディスクへのアクセスに時間がかかるため、これは動作しますが、速度が遅いです.
理想的には、多くのユーザーが同じレシピを要求している場合は、ディスクから一度だけ読み取り、必要に応じて迅速に再送信できるように、ページをメモリに保存します.はい、キャッシュを追加したばかりです.
キャッシュは高速ストレージにすぎません.キャッシュからデータを読み込むのに要する時間は、ハードディスクなどの他の方法からデータを読み取る時間よりも少ない.
ただし、使用可能なキャッシュ容量は小さい.すべてのコンテンツをキャッシュに入れることはできません.常により大きく、より遅いストレージが必要です.
すべてのコンテンツをキャッシュに入れることができない場合、キャッシュに格納すべきコンテンツをどのように決定しますか?
LRU駆逐
これは、キャッシュがn個のエントリの空間を格納できる場合、n要素が最近アクセスしたことがあるというアイデアです.
具体的には、ディスクに次の4つのレシピがあるとします.
データを記述するアイコンは、チョコレートケーキ、バニラケーキ、イチゴケーキ、ポンドケーキの異なるケーキレシピで表示されます.キャッシュには最大3つのフォーミュラしか格納できないと仮定します(少し小さいですが、この例をより理解しやすくします).
キャッシュされた廬山の正体を徐々に理解してみましょう.
まず、ユーザーはチョコレートケーキのレシピを要求します.ディスクから読み取り、キャッシュに保存してからユーザーに返します.
次に、バニラケーキのレシピをお願いする人がいます.
チョコレートケーキのレシピはキャッシュ内のレベルが低下し、最近使用されたものではないことに注意してください.
次はイチゴケーキのレシピの要求です.
もう一つはチョコレートに使われています.
この3つのレシピをキャッシュに保存したので、ディスク読み取りをスキップできます.また、最近使用した場所に復元し、他の場所を下げます.
次はポンドケーキのレシピの要求です.
キャッシュには3つのレシピしか収容できないので、1つを蹴ってスペースを空けなければなりません.キャッシュ内のすべてのレシピで最も少ないため、バニラケーキレシピを蹴り出しました.これを最近の最少使用(LRU)駆逐戦略と呼ぶ.
私たちは多くのポリシーを使用して、抜け出すレシピを選択することができます.私たちはLRUに重点を置きます.LRUはコード面接でよく見られるものだからです.
LRUキャッシュは、駆逐すべきときに効率的なキャッシュデータ構造を満たすために使用できます.目標は,最近最も使用されている項目を常にO(1)時間に置くことである.
LRUキャッシュ実装
LRUキャッシュは、2つのデータ構造を組み合わせることによって構築される:デュアルチェーンテーブルとハッシュマップ.
リンクリストを作成し、リストの上部に最も近いアイテムを使用し、リストの末尾に最も近いアイテムを使用します.
これにより,O(1)がリストの末尾にアクセスできるようになった.
キャッシュ内の特定のアイテム(チョコレートケーキなど)にどのようにアクセスしますか?
通常、チェーンテーブルでアイテムを検索するのはO(n)時間です.リスト全体を巡回する必要があるからです.しかし、キャッシュのポイントは、迅速な検索です.どうやってスピードを上げますか?
チェーンテーブルノードにマッピングするハッシュマッピングを追加します.
これにより,キャッシュされたチェーンテーブルにおいて,O(n)ではなくO(1)時間の要素を見つけることができる.
アクセスと削除
これは、プロジェクトにアクセスするたびに実行するステップです.
•ハッシュマッピングでエントリを検索します.
•ハッシュ・テーブルにアイテムがある場合は、すでにキャッシュに存在します.これをキャッシュ・ヒットと呼びます.
•ハッシュ・テーブルにアイテムがない場合は、キャッシュの空きがあります.このエントリをキャッシュにロードする必要があります.
チェーンテーブルノードの周囲を移動するときは、すべてのポインタをまっすぐに保つのは難しいです.自分で実施してみよう!なぜ私たちのチェーンテーブルが双方向リンクなのか理解できるかどうか見てみましょう.
これらのすべてのステップはO(1)であるため、一緒に置くには、O(1)要素にアクセスするたびにキャッシュが更新される時間が必要である.かっこいい!
搬送元アドレスinterviewcake
最近の最小使用(LRU)キャッシュでは、どのデータがまだ使用されていないかをすばやく判断できます.ハンガーを干して、服がいつも片側にぶら下がっていることを想像してみてください.最近一番少ない服を探すには、物干し棚の反対側を見てください.最下位レベルでは、LRUキャッシュは、通常、二重チェーンテーブルをハッシュマッピングテーブルとペアリングすることによって実現される.
を選択します.
複雑さ
スペース
O(n)
最小アクセス項目の取得
O(1)
エントリの読み込み
O(1)
メリット:
:LRU 。 O(1) 。
: , , O(1) 。
欠点
スペースが重い.LRUキャッシュは、nエントリの長さnのチェーンテーブルと、nエントリのハッシュマップを保持する必要がある.2つのO(n)空間のデータ構造(1つではない)が必要である.
キャッシュを使用する理由
ケーキのレシピがたくさんある調理場を管理するとします.どのサイトと同様に、できるだけ早くページを提供したいと考えています.
ユーザーがフォーミュラを要求すると、ディスク上の対応するファイルを開き、HTMLを読み取り、ネットワークを介して送信できます.ディスクへのアクセスに時間がかかるため、これは動作しますが、速度が遅いです.
理想的には、多くのユーザーが同じレシピを要求している場合は、ディスクから一度だけ読み取り、必要に応じて迅速に再送信できるように、ページをメモリに保存します.はい、キャッシュを追加したばかりです.
キャッシュは高速ストレージにすぎません.キャッシュからデータを読み込むのに要する時間は、ハードディスクなどの他の方法からデータを読み取る時間よりも少ない.
ただし、使用可能なキャッシュ容量は小さい.すべてのコンテンツをキャッシュに入れることはできません.常により大きく、より遅いストレージが必要です.
すべてのコンテンツをキャッシュに入れることができない場合、キャッシュに格納すべきコンテンツをどのように決定しますか?
LRU駆逐
これは、キャッシュがn個のエントリの空間を格納できる場合、n要素が最近アクセスしたことがあるというアイデアです.
具体的には、ディスクに次の4つのレシピがあるとします.
データを記述するアイコンは、チョコレートケーキ、バニラケーキ、イチゴケーキ、ポンドケーキの異なるケーキレシピで表示されます.キャッシュには最大3つのフォーミュラしか格納できないと仮定します(少し小さいですが、この例をより理解しやすくします).
キャッシュされた廬山の正体を徐々に理解してみましょう.
まず、ユーザーはチョコレートケーキのレシピを要求します.ディスクから読み取り、キャッシュに保存してからユーザーに返します.
次に、バニラケーキのレシピをお願いする人がいます.
チョコレートケーキのレシピはキャッシュ内のレベルが低下し、最近使用されたものではないことに注意してください.
次はイチゴケーキのレシピの要求です.
もう一つはチョコレートに使われています.
この3つのレシピをキャッシュに保存したので、ディスク読み取りをスキップできます.また、最近使用した場所に復元し、他の場所を下げます.
次はポンドケーキのレシピの要求です.
キャッシュには3つのレシピしか収容できないので、1つを蹴ってスペースを空けなければなりません.キャッシュ内のすべてのレシピで最も少ないため、バニラケーキレシピを蹴り出しました.これを最近の最少使用(LRU)駆逐戦略と呼ぶ.
私たちは多くのポリシーを使用して、抜け出すレシピを選択することができます.私たちはLRUに重点を置きます.LRUはコード面接でよく見られるものだからです.
LRUキャッシュは、駆逐すべきときに効率的なキャッシュデータ構造を満たすために使用できます.目標は,最近最も使用されている項目を常にO(1)時間に置くことである.
LRUキャッシュ実装
LRUキャッシュは、2つのデータ構造を組み合わせることによって構築される:デュアルチェーンテーブルとハッシュマップ.
リンクリストを作成し、リストの上部に最も近いアイテムを使用し、リストの末尾に最も近いアイテムを使用します.
これにより,O(1)がリストの末尾にアクセスできるようになった.
キャッシュ内の特定のアイテム(チョコレートケーキなど)にどのようにアクセスしますか?
通常、チェーンテーブルでアイテムを検索するのはO(n)時間です.リスト全体を巡回する必要があるからです.しかし、キャッシュのポイントは、迅速な検索です.どうやってスピードを上げますか?
チェーンテーブルノードにマッピングするハッシュマッピングを追加します.
これにより,キャッシュされたチェーンテーブルにおいて,O(n)ではなくO(1)時間の要素を見つけることができる.
アクセスと削除
これは、プロジェクトにアクセスするたびに実行するステップです.
•ハッシュマッピングでエントリを検索します.
•ハッシュ・テーブルにアイテムがある場合は、すでにキャッシュに存在します.これをキャッシュ・ヒットと呼びます.
1. 。
2. , ( )。
•ハッシュ・テーブルにアイテムがない場合は、キャッシュの空きがあります.このエントリをキャッシュにロードする必要があります.
1. ? , :
, 。
, 。
2. 。 。
3. , 。
チェーンテーブルノードの周囲を移動するときは、すべてのポインタをまっすぐに保つのは難しいです.自分で実施してみよう!なぜ私たちのチェーンテーブルが双方向リンクなのか理解できるかどうか見てみましょう.
これらのすべてのステップはO(1)であるため、一緒に置くには、O(1)要素にアクセスするたびにキャッシュが更新される時間が必要である.かっこいい!