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

看一下输出:

符合预期,完美!!!

相关推荐
songx_991 小时前
算法设计与分析7(贪心算法)
算法
aigonna2 小时前
Kimi 7B 语音转文字
算法
weixin_435208162 小时前
图解模型并行框架
人工智能·算法·语言模型·自然语言处理·aigc
东方翱翔3 小时前
第十六届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学 A 组
算法·职场和发展·蓝桥杯
Blossom.1183 小时前
量子计算在密码学中的应用与挑战:重塑信息安全的未来
人工智能·深度学习·物联网·算法·密码学·量子计算·量子安全
1白天的黑夜13 小时前
贪心算法-860.柠檬水找零-力扣(LeetCode)
c++·算法·leetcode·贪心算法
搏博3 小时前
专家系统的基本概念解析——基于《人工智能原理与方法》的深度拓展
人工智能·python·深度学习·算法·机器学习·概率论
yzx9910133 小时前
决策树随机深林
人工智能·python·算法·决策树·机器学习
Y1nhl4 小时前
力扣hot100_子串_python版本
开发语言·python·算法·leetcode·职场和发展
uhakadotcom4 小时前
过来人给1-3 年技术新人的几点小小的建议,帮助你提升职场竞争力
算法·面试·架构