146.LRUキャッシュメカニズム*【バックル】
意味の理解
最近最も少ないLRUバッファメカニズムのクラスを設計する
もんだいぶんせき
STLの使用
hashテーブルunordered_map、デュアルチェーンリスト.
Listはバッファに使用されます.mapは、要素の場所をクエリーするために使用されます.listにkey、valueペア、mapにkey、listの反復器が格納されます.
ダブルチェーンテーブルはヘッドpush_を挿入できますfront,ヘッダpop_を削除front,挿入尾push_back,削除尾pop_back,
その他
0801:get,putがo(1)であることを保証し、クエリーと任意の要素の削除と変更の効率が高く、前後の順序を維持する必要がある.最も速いクエリーはhashであり、最も速い任意の要素の削除は双方向チェーンテーブルであることを知っています.キーをキーワードとして繰り返し、チェーンテーブルを利用する反復器はチェーンテーブルの具体的な位置にすぎない.
リンク
最近最も少ないLRUバッファメカニズムのクラスを設計する
もんだいぶんせき
STLの使用
hashテーブルunordered_map、デュアルチェーンリスト.
Listはバッファに使用されます.mapは、要素の場所をクエリーするために使用されます.listにkey、valueペア、mapにkey、listの反復器が格納されます.
ダブルチェーンテーブルはヘッドpush_を挿入できますfront,ヘッダpop_を削除front,挿入尾push_back,削除尾pop_back,
その他
0801:get,putがo(1)であることを保証し、クエリーと任意の要素の削除と変更の効率が高く、前後の順序を維持する必要がある.最も速いクエリーはhashであり、最も速い任意の要素の削除は双方向チェーンテーブルであることを知っています.キーをキーワードとして繰り返し、チェーンテーブルを利用する反復器はチェーンテーブルの具体的な位置にすぎない.
リンク
public:
LRUCache(int capacity) {
cap = capacity;
}
void print() {
cout << "======" << endl;
for (auto pair:buffer) {
cout << pair.first << ' ' << pair.second;
}
cout << endl;
}
int get(int key) {
//cout << "get start" << endl;
//print();
int val = -1;
if (dict.count(key)) {
auto it = dict[key];
val = it -> second;
buffer.erase(it);
buffer.push_front(make_pair(key, val));
dict[key] = buffer.begin();
}
//cout << "get end" << endl;
//print();
return val;
}
void put(int key, int value) {
//cout << "put start" << endl;
//print();
if (dict.count(key)) {
auto it = dict[key];
buffer.erase(it);
buffer.push_front(make_pair(key,value));
dict[key] = buffer.begin();
}
else if (buffer.size() < cap) {
buffer.push_front(make_pair(key,value));
dict[key] = buffer.begin();
}
else {
// key
int old_key = buffer.back().first;
// dict key
dict.erase(old_key);
// buffer
buffer.pop_back();
//
buffer.push_front(make_pair(key,value));
// (key, ) dict
dict[key]=buffer.begin();
}
//cout << "put end" << endl;
//print();
}
private:
list> buffer;
unordered_map>::iterator> dict;
int cap = 0;
};