LRU是什么?

首先考虑这样的一个业务场景,小王在A公司上班,有一天产品提出了一个需求:“咱们系统的用户啊,每天活跃的就那么多,有太多的僵尸用户,根本不登录,你能不能考虑做一个筛选机制把这些用户刨出去,并且给活跃的用户做一个排名,我们可以设计出一些奖励活动,提升咱们的用户粘性,咱们只需要关注那些活跃的用户就行了“”。小王连忙点头,说可以啊,然而心里犯起嘀咕来了:这简单,按照常规思路,给用户添加一个最近活跃时间长度和登录次数,然后按照这两个数据计算他们的活跃度,最后直接排序就行了。嘿嘿,简直完美!不过!用户表字段已经很多了,又要加两个字段,然后还得遍历所有的数据排序?这样查询效率是不是会受影响啊?并且公司的服务器上次就蹦过一次,差点没忙出命来才调好。有没有更优雅的一种方式呢?小王面朝天空45°,陷入了无限的思考中…

按照英文的直接原义就是Least Recently Used, 最近最少使用,它是按照一个非常著名的计算机操作系统基础理论得来的:最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。基于这个思想,会存在一种缓存淘汰机制,每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据!它的主要衡量指标是使用的时间,附加指标是使用的次数。在计算机中大量使用了这个机制,它的合理性在于优先筛选热点数据,所谓热点数据,就是最近最多使用的数据!因为,利用LRU我们可以解决很多实际开发中的问题,并且很符合业务场景。

当小王看到LRU的时候,瞬间感觉抓住了救命稻草,这个算法不是就完全契合产品的需求吗?只要把用户数据按照LRU去筛选,利用数据结构完成的事情,完全减少了自己存储、添加字段判断、排序的过程,这样对于提高服务器性能肯定有很大的帮助,岂不美哉!小王考虑好之后,就决定先写一个demo来实现LRU,那么在java中是如何实现LRU呢?考虑了许久,小王写下了这些代码。

HashMap和LinkedList实现LRU

  1. 题目描述:

题目描述
设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
set(key, value):将记录(key, value)插入该结构
get(key):返回key对应的value值
[要求]
set和get方法的时间复杂度为O(1)
某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。
当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。
若opt=1,接下来两个整数x, y,表示set(x, y)
若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1
对于每个操作2,输出一个答案

  1. 输入:
[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3
  1. 输出:
[1,-1]
  1. 代码实现:
import java.util.*;public class Solution {private int capacity;private HashMap<Integer, Integer> map;private List<Integer> list;/*** lru design* @param operators int整型二维数组 the ops* @param k int整型 the k* @return int整型一维数组*/public int[] LRU (int[][] operators, int k) {capacity = k;map = new HashMap<>(k);list = new LinkedList<>();List<Integer> output = new ArrayList<>();int temp;// write code herefor(int i = 0, j = operators.length;i < j;i ++){if(operators[i][0] == 1){set(operators[i][1], operators[i][2]);}else {output.add(get(operators[i][1]));}}int [] out = new int[output.size()];for(int i = 0;i < out.length;i ++){out[i] = output.get(i);}return out;}public void set(int key, int value){if(map.containsKey(key)){list.remove(key);list.add(0, key);}else {if(map.size() == capacity){map.remove(list.remove(capacity - 1));}list.add(0, key);map.put(key, value);}}public int get(int key){if(map.get(key) != null){list.remove(new Integer(key));list.add(0, key);return map.get(key);}return -1;}
}

https://www.cnblogs.com/wyq178/p/9976815.html

面试:算法LRU(Least Recently Used),字节跳动Java研发算法题相关推荐

  1. 字节跳动Java研发面试总结:2个星期,4轮面试,我终于拿到offer

    个人背景: 坐标背景,某211本科毕业生,计算机专业,前公司是某B站,辞职之后就重新规划了一下自己的职业方向,最终目标定在了字节跳动,比较年轻化的一家互联网公司,近几年的发展速度也比较快. 综合方面来 ...

  2. 字节跳动mysql面试题_刚面完的字节跳动java研发面试题整理(含答案):线程+MySQL+Spring+JVM...

    点关注,不迷路:持续更新Java相关技术及资讯!!! 为什么要用线程池那先要明白什么是线程池 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建 ...

  3. spring多线程获取不到bean_刚面完的字节跳动java研发面试题整理(含答案):线程+MySQL+Spring+JVM...

    作者:花名提莫 出自:CSDN 原文:blog.csdn.net/qq_41770757/article/details/108502292?utm_medium=distribute.pc_feed ...

  4. 字节跳动java后端一面面经(头条/西瓜视频)

    字节跳动java后端一面面经 面试时间:4月25日 时长:1小时 面试官人挺不错的,感觉挺有经验的,但是感觉技术栈应该不是java tcp连接如何保证高可用 回答:三次握手四次挥手.校验和.滑动窗口. ...

  5. 字节跳动Java开发4面攻略:项目经验+“拍马屁”+扎实的技术

    字节跳动Java开发4面攻略:项目经验+"拍马屁"+扎实的技术 如标题所见,老陈现在已经顺利入职字节跳动. 老陈在编程事业上摸爬滚打8年之久,有在58待过,有在腾讯地方事业部待过. ...

  6. 网易游戏回应裁员 10%;字节跳动秘密研发手机;iOS 13 beta 5 发布 | 极客头条

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  7. 7月30日科技资讯|网易游戏回应裁员 10%;字节跳动秘密研发手机;iOS 13 beta 5 发布

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...

  8. 【名企面试经验-快手-校招提前批】【Java研发工程师】

    快手提前批Java Offer 一面(50min): 1.自我介绍 2.项目介绍 3.为什么项目中又有KVM虚拟机,又有Docker? 4.为什么项目中要用虚拟机,为什么不用物理机? 5.(手撕算法) ...

  9. JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计

    JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计 看到了这样的一道题目,还挺有意思,可以通过不同的算法设计来求解. 话说大诗人李白,一生好饮.一日,他提着酒壶,从家里出来,酒壶中有酒2斗.他边 ...

最新文章

  1. Linux下使用ssh动态验证码登陆机器
  2. sql 跟踪工具sql profiler使用
  3. 消息幂等(去重)通用解决方案,RocketMQ
  4. 幼儿园视频监控系统设计方案
  5. 技术类别特点_苏州鑫辉仓储货架的常用类别及特点
  6. big sur darwin6.iso下载_苹果macOS Big Sur 11.0 正式版系统适配机型 附升级教程和系统镜像下载...
  7. 机器学习(二)——xgboost(实战篇)Pima印第安人数据集上的机器学习-分类算法(根据诊断措施预测糖尿病的发病)
  8. Oracle函数--合并,替换,拼接,截取,查找
  9. pta冒泡排序c语言_PTA 冒泡排序
  10. 服务器系统建立安全连接失败,尝试与系统“ServerName”建立安全连接时,MSDTC遇到错误(HR = 0x80000171)...
  11. java编译的类包含美元符号 $
  12. word2010里脚注横线如何顶格
  13. Java程序员两年校招笔记总结分析——菜鸡求职
  14. 吴军老师-《阅读与写作50讲》摘要
  15. H323协议和polycom,华为视频会议终端调试出现的问题
  16. ORB_SLAM系列总结
  17. 王道书 P41 T19(循环单链表实现)
  18. Code bloat has become astronomical
  19. 如何免费生成一套超级签名系统?
  20. OGNL表达式的使用方法

热门文章

  1. (九:2020.08.27)CVPR 2019 追踪之论文纲要(译)
  2. 项目管理证书 PMP 的含金量高吗?
  3. c语言typedef结构体_typedef在C中具有结构的示例
  4. vue中使用Cesium
  5. PHP网站配置(系统设置)数据库表结构及实现
  6. P6专题:Oracle P6 数据库管理(SQLite/单机版数据库)
  7. win7滑动关机代码bat_写一行代码实现滑动关机电脑
  8. 单片机固件自更新,可靠实用的一个方法
  9. android音量图标不见了,系统音量图标不见了
  10. python编程的工作-会Python的人工作不会太差?编程课真的有必要学吗?