实现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_960356381 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah1 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO91 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician1 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.2 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o2 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者3 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
-森屿安年-3 小时前
按身高排序
c++·算法
程序员清风3 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
无定义_3 小时前
Codeforces Round 1124 (Div. 2)
算法