您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

一道头条面试题:如何实现 LRU 原理?

时间:2020-12-01 10:45:51  来源:  作者:

LRU 原理作为操作系统课程中的一个重要部分在很多地方会被考到(比如操作系统课的考试或者一些公司的面试题)。

LRU 算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。

这个算法的出发点在于:如果某个页面被访问了,则它可能马上还要访问。反之,如果很长时间未被访问,则它在最近一段时间也不会被访问。

该算法的性能接近于最佳算法,但实现起来较困难。因为要找出最近最久未使用的页面,必须为每一页设置相关记录项,用于记录页面的访问情况,并且每访问一次页面都须更新该信息。这将使系统的开销加大,所以在实际系统中往往使用该算法的近似算法。

对于考试题目而言,由于一般是卷面考试,所以我们通常需要完成的是在纸上描绘出 LRU 的置换原理,一般题目如下:

一道头条面试题:如何实现 LRU 原理?

 

最近最久未使用算法例

假定系统为某进程分配了 3 个物理块,进程运行时的页面走向为 1,2,3,4,1,2,5,1,2,3,4,5,开始时 3 个物理块均为空,计算采用 最近最久未使用页面淘汰算法时的缺页率 ?(10/12)

一道头条面试题:如何实现 LRU 原理?

 

对于面试而言,可能就不仅仅是「明白概念」+「画出示例」那么简单了,可能还需要自己动手去实现一个 LRU 算法的小 Demo。

一道头条面试题:如何实现 LRU 原理?

 

146.LRU缓存机制 力扣

在力扣上有这么一道题:

一道头条面试题:如何实现 LRU 原理?

 

并且给出了提示——在 O(1) 时间复杂度内完成 get 和 put 操作。

一个比较通用的做法是通过 Hashmap + Double Linked List 来完成,图示如下:

一道头条面试题:如何实现 LRU 原理?

 

这样,整个数据的操作过程如下:

一道头条面试题:如何实现 LRU 原理?

 

实现算法代码如下:

一道头条面试题:如何实现 LRU 原理?

 


一道头条面试题:如何实现 LRU 原理?

 

redis

Redis LRU algorithm is not an exact implementation. This means that Redis is not able to pick the best candidate for eviction, that is, the access that was accessed the most in the past. Instead it will try to run an Approximation of the LRU algorithm, by sampling a small number of keys, and evicting the one that is the best (with the oldest access time) among the sampled keys.

Redis 是一个著名的键值对数据库,在 Using Redis as an LRU cache 中我们知道 Redis 可以用来做为 LRU 缓存(虽然不是一个非常标准的实现,因为 Redis 可能无法选出最佳换出项),Redis 的方法是随机取出若干个 key,然后按照访问时间排序后,淘汰掉最不经常使用的页面,一个较为详尽的分析在参考资料中已经有所提及,建议有兴趣的读者参考。

 

参考资料

1.LRU 原理和 Redis 实现——一个今日头条的面试题

2.LeetCode 算法题解——LRU 缓存机制

 

本文作者:Nova Kwok

编辑&版式:霍霍

声明:本文归 “力扣” 版权所有,如需转载请联系。



Tags: LRU   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
LRU 原理作为操作系统课程中的一个重要部分在很多地方会被考到(比如操作系统课的考试或者一些公司的面试题)。LRU 算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那...【详细内容】
2020-12-01  Tags: LRU  点击:(107)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条