面试题---------简述 LRU 算法及其实现方式

news/2025/2/26 7:07:04

简述 LRU 算法

 一种比较常见的缓存算法,也是内存管理使用的一种算法。在内存满的时候,选择内存中最近最久未使用的页面予以淘汰。

实现方式

哈希表 + 双向链表

双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。

哈希表即为普通的哈希映射(ES6 Map),通过缓存数据的键映射到其在双向链表中的位置。

我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或者 put 操作。具体的方法如下:

对于 get 操作,首先判断 key 是否存在:

  • 如果 key 不存在,则返回 -1−1;
  • 如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。

对于 put 操作,首先判断 key 是否存在:

  • 如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;
  • 如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。
var LRUCache = function (capacity) {
  this.cache = new Map();
  this.capacity = capacity;
};

LRUCache.prototype.get = function (key) {
  if (this.cache.has(key)) {
    // 存在即更新
    let temp = this.cache.get(key);
    this.cache.delete(key);
    this.cache.set(key, temp);
    return temp;
  }
  return -1;
};

LRUCache.prototype.put = function (key, value) {
  if (this.cache.has(key)) {
    // 存在即更新(删除后加入)
    this.cache.delete(key);
  } else if (this.cache.size >= this.capacity) {
    // 不存在即加入
    // 缓存超过最大值,则移除最近没有使用的
    this.cache.delete(this.cache.keys().next().value);
  }
  this.cache.set(key, value);
};

 


http://www.niftyadmin.cn/n/3655816.html

相关文章

简述图片的懒加载原理

懒加载原理 一张图片就是一个<img>标签&#xff0c;浏览器是否发起请求图片是根据<img>的src属性&#xff0c;所以实现懒加载的关键就是&#xff0c;在图片没有进入可视区域时&#xff0c;先不给<img>的src赋值&#xff0c;这样浏览器就不会发送请求了&…

ActiveSync用红外接口PC与掌上电脑同步

用了三年多的IBM老本终于退居二线了&#xff0c;别说还真有些舍不得。幸好新买的HP Compaq nc4400的小本接口比较齐全 &#xff0c;算是一种心理上的补偿&#xff0c;唯感到遗憾的是自带Vista home版&#xff0c;用起来实在别扭&#xff0c;买后的第二天就把盘格了&#xff0c;…

const, let, var 关键字有什么区别?

1.let 块级作用域 定义变量 不允许重复定义 2.var 全局作用域或函数作用域定义变量允许重复定义如果不初始化会输出undefined&#xff0c;不会报错 3.const 块级作用域定义常量不允许重复定义

共享内存操作类(C#源码)

VC的共享内存操作代码实现起来相对比较容易&#xff0c;但是用C#语言来实现&#xff0c;就有一定难度&#xff0c;由于工作需要&#xff0c;把以前VC开发的共享内存代码要用C#实现&#xff0c;别说&#xff0c;还费了不少周折&#xff0c;毕竟C#操作API函数和地址指针不是那么直…

ini文件纯C++读写代码

前一段时间&#xff0c;一直有朋友在向我索要EVC版本的ini读取函数&#xff0c;由于是公司其他人完成的代码&#xff0c;我不便于公布&#xff0c;正好这段时间重新拾起了成都英创公司的NetBox / NetBoxII相关开发工作&#xff0c;它的系统平台为DOS&#xff0c;开发平台BC3.0。…

JavaScript 中的严格模式是什么,有什么作用?

严格模式是为JavaScript 定义了一种不同的解析与执行模型。在严格模式下&#xff0c;ECMAScript 3 中的一些不确定的行为将得到处理&#xff0c;而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式&#xff0c;可以在顶部添加如下代码&#xff1a; "use st…

SQL2005安装之sql.cab没找到释疑

最近安装SQL2005可把我折腾坏了&#xff0c;安装了无数次&#xff0c;不是性能计数器问题&#xff0c;就是sql.cab找不到&#xff0c;不过最后还是功夫不负有心人&#xff0c;终于安装成功。性能计数器问题&#xff0c;主要是卸载SQL2005&#xff0c;再重新安装的错误&#xff…

Vue 组件传值、通信 整理

1.父组件 > 子组件 属性 props // child 子组件 接收 props: { msg: String }// parent 父组件 传值 <HelloWorld msg"Welcome to Your Vue.js App"/>引用refs //parent 父组件 <HelloWorld ref"hw"> this.$refs.hw.xx "xxxx…