实现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());

看一下输出:

符合预期,完美!!!

相关推荐
SilentSamsara5 分钟前
自定义上下文管理器实战:数据库连接池、文件锁与超时控制
开发语言·python·算法·青少年编程
吃着火锅x唱着歌13 分钟前
LeetCode 503.下一个更大元素II
算法·leetcode·职场和发展
_深海凉_17 分钟前
LeetCode热题100-将有序数组转换为二叉搜索树
数据结构·算法·leetcode
KaMeidebaby26 分钟前
卡梅德生物技术快报|单克隆抗体人源化 PEG 修饰质控方法体系构建与验证
服务器·前端·数据库·人工智能·算法·百度·新浪微博
不知名的老吴42 分钟前
二叉树的遍历算法之先序遍历
算法
liu****43 分钟前
第16届国赛蓝桥杯大赛C/C++大学B组
c语言·数据结构·c++·算法·蓝桥杯
SimpleLearingAI1 小时前
大模型推理框架总结解析
算法
Σίσυφος19001 小时前
正则化数据并校准数据
人工智能·算法·机器学习
HZ·湘怡1 小时前
基于动态数组的栈(顺序栈)01
数据结构·算法
Chen_harmony1 小时前
十八、C语言内存函数
c语言·算法