实现LRU算法

一、概述

LRU ,全称 Least Recently Used . 最近最少使用算法(最久未使用),一般来说是维护一个缓存(可以用map,甚至链表都行。重点是思想)。

可以直接维护一个map, js中的map 是有序的,每次set() 调用的时候都会把新的set 加入到末尾。如图:

LRU 算法的思想是:

  1. 维护一种空间有限的数据结构。
  2. 每次存取某个数据以后,将这个数据放到该数据结构的头部。(因为往往现在使用的数据,接下来继续使用的概率会很大)
  3. 如果空间被用完,淘汰最久没有使用的数据。

二、实现

编写一个类LRU,实现两个主要的方法:get、set。构造函数(constructor)初始化的时候接受一个参数capacity,用于限制当前实例的容量。

  • constructor(capacity):实例化一个对象,限制容量。
  • get(key): 获取指定的数据。
  • set(key,value):读取指定的数据。
js 复制代码
class LRU {
	#cache; // 私有变量(缓存,一个map 结构)
	#capacity;// 私有变量(缓存的容量)
	constructor(capacity) { // 构造函数
		this.#capacity = capacity;
		this.#cache = new Map();
	}
  //判断缓存中是否存在某个值
	has(key) { 
		return this.#cache.has(key);
	}
  // 核心函数(读)
	get(key) {
		if (!this.has(key)) return null;
		// 更新#cache
		const value = this.#cache.get(key);
		this.#cache.delete(key);
		this.#cache.set(key, value);
		return value;
	}
	// 核心函数(存或者更改)
	set(key, value) {
		// 存在就删掉
		if (this.has(key)) this.#cache.delete(key);
		// 不管有没有超过,都要往末尾加一个
		this.#cache.set(key, value);
		// 已经满容量了, 淘汰第一个
		if (this.#cache.size > this.#capacity) {
			this.#cache.delete(this.#cache.keys().next().value);// 这里使用了迭代器。
		}
	}
	getEntire() {
		return this.#cache.entries();
	}
}

// 测试
const lru = new LRU(5);

for (let i = 0; i < 10; i++) {
	lru.set(i, i);
}
lru.get(7);
lru.get(5);
console.log(lru.getEntire());

看一下输出:

符合预期,完美!!!

相关推荐
2601_9622974810 分钟前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye26 分钟前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展
辰烨chenye39 分钟前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
手写码匠42 分钟前
华为云Flexus+DeepSeek征文|DeepSeek 应用监控告警体系实战:从“用户投诉才知道“到“故障前就发现“
人工智能·深度学习·算法·aigc
shehuiyuelaiyuehao1 小时前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
智购科技自动售货机厂家1 小时前
2026自动售货机设备清洁效果自动验证:从图像比对到评分算法的工程实践~YH
人工智能·算法·计算机视觉
姜穆澜2 小时前
机器学习实战指南:从算法原理到工程落地
人工智能·算法·机器学习
Q一件事3 小时前
RWEQ——保留与消去P的soil_loss联合推导
算法
HugoStudio_SWAN3 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪