件名の説明:
あなたの処分のデータ構造、デザインを使用して(最低使用)LRUキャッシュメカニズムを実装します。これは、次の機能をサポートする必要があります。データを取得し、置く取得するデータを書き込みます。
データをゲットする(キー) - (キー)キーがキャッシュに存在する場合、キー(常に正)の取得価額、そうでない場合は-1。
(キー、値)入れてデータを書き込み-鍵は、書き込まれたデータの値が存在しない場合。キャッシュ容量の上限に達した場合、それは新しいデータ値のための余地を作るために新しいデータを書き込む前に、最低使用するデータ値を削除する必要があります。
あなたはO(1)時間複雑に両方の操作を行うことができますか?
例:
LRUCacheキャッシュ=新しいLRUCache(2 / *バッファサイズ* /);
cache.put(1 ,. 1);
cache.put(2、2);
cache.get(1); //戻ります1。
cache.put(3 ,. 3。); //この操作は、キー2無効になります
キャッシュを。 (2)取得; // -1を返します(見つからない)
cache.put(4 ,. 4。); //この操作は無効なキーが発生します
cache.get(1); // -1を返します(見つからない)
キャッシュ.get(3); //戻り3。
cache.get(4); //戻り4
アイデアの分析:
最も最近のオペレーティング・システムについて調べることを学ぶ前に、キャッシュメカニズムを使用していました。(n)の時間計算量Oの書き込みデータで完了し、データを取得できるようにする必要があります。(O(n)を必要とするので、キャッシュを保存するために、このリストを使用する操作を移動しません、あなたはそのOインサートを確保し、操作を削除することができ、配列の先頭に移動します起因するキャッシュを維持する必要性に最新の入力ノードで、ハッシュの使用を考えてみましょう1)時間。再利用マップ記憶ノードは、ノードがO(1)時間と日付で登場見つけることができると思われました。ノードはすぐに保存されたポインタに対応する値として、しかしとても便利な挿入、削除、同時にキャッシュにその場所を見つけ、このノードに記載されていなければならないので、このマップは<整数、リスト>。リストで使用されるマップは、イテレータ、便利で直接呼び出しは、開始と終了の機能であることをここで注意してください。
コード:
1 クラスLRUCache { 2 公共: 3 LRUCache(INTの容量):容量(容量){} 4 5 int型の GET(INT キー){ 6 場合(pos.find(キー)=!pos.end()) 7 { 8 PUT (キー、POS [キー] - > 秒)。 9つの リターン POS [キー] - > 第二; 10 } 11 リターン - 1 。 12 } 13 14 のボイドに置く(int型のキー、INTの値){ 15 であれば(pos.find(キー)=!pos.end()) 16 { 17 recent.erase(POS [キー])。 18 } 19 他の 20 { 21 であれば(recent.size()> = 容量) 22 { 23 pos.erase(recent.back()最初の); 24 recent.pop_back()。 25 } 26 } 27 recent.push_front({キー、値})。 28台の POS [キー] = recent.begin()。 29 } 30 プライベート: 31 int型の容量; 32 リスト<ペア< int型、int型 >> 最近、 33 unordered_map < int型、リスト<ペア< int型、int型 >> ::イテレータ> POS。 34 }。 35 36 / * * 37 あなたのLRUCacheオブジェクトがインスタンス化され、そのように呼ばれます*: 38 * LRUCache * OBJ =新しいLRUCache(容量)。 39 * int型PARAM_1 = obj->(キー)を取得します。 40 * obj->置く(キー、値); 41 * /