序文
アルゴリズムの質問に直接移動します。
LRUとは、メモリデータの削除戦略である最も最近使用されていないアルゴリズムのことで、実際の開発ではメモリが不足した場合、最も最近使用されていないデータを削除する必要がありますが、このアルゴリズムはどのように実装されているのでしょうか。
文章
この問いについてはいろいろな考え方がありますが、ここでは主にmapのデータ構造を利用します。マップのキーは任意のタイプにすることができ、そのストレージは順序付けされているため、マップの性質を使用して問題を解決するための考え方を明確にすることができます。
一連の考え
- マップデータ構造とストレージ容量の変数を定義します。
- マップのsize属性を使用すると、ストレージのしきい値に達したかどうかを簡単に知ることができます。しきい値に達すると、最も最近使用されていない要素が削除され ( delete )、新しい値が追加されます ( ) をマップに設定します。
- このメソッドのプロトタイプには、マップ内の要素へのアクセス ( get ) と追加 ( set ) の2 つのメソッドが定義されています。
コード
var LRUCache = function (capacity) {
this.catch = new Map() //初始化map数据结构
this.capacity = capacity //容量
};
LRUCache.prototype.get = function (key) {
if (this.catch.has(key)) { //map中有这个元素
let value = this.catch.get(key); //调用map的get方法获取元素
//更新key=>value
this.catch.delete(key); //删除之前的元素
this.catch.set(key, value); //将新获取的相同的元素以键值对推入map中
return value //返回关键字的值
}
return -1 //map中没有这个元素返回-1
};
LRUCache.prototype.put = function (key, value) {
if (this.catch.has(key)) { //有这个元素
this.catch.delete(key); //删除
}
//判断有没有达到存储的阈值
if (this.catch.size >= this.capacity) {
//移除谁 再放新值 //m.keys().next()拿到首位的键值对
this.catch.delete(this.catch.keys().next().value)
}
this.catch.set(key, value);
};
//验证
let lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}