面试高频题: LRU缓存机制实现
题目
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。
获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
进阶:
你是否可以在 O(1) 时间复杂度内完成这两种操作?
示例:
LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 该操作会使得密钥 2 作废
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 该操作会使得密钥 1 作废
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
思路:hash+双链表
//get和put操作需要在0(1)复杂度完成type LRUCache struct {size int //大小capacity int //容量cache map[int]*DLinkedNode //哈希表head, tail *DLinkedNode //双链表
}type DLinkedNode struct {key, value int //key和value 是put传过来,就相当于缓存key-valueprev, next *DLinkedNode
}//初始化一个节点
func initDLinkedNode(key, value int) *DLinkedNode {return &DLinkedNode{key: key,value: value,}
}//初始化一个双向链表
func Constructor(capacity int) LRUCache {l := LRUCache{cache: map[int]*DLinkedNode{},head: initDLinkedNode(0, 0),tail: initDLinkedNode(0, 0),capacity: capacity,}l.head.next = l.taill.tail.prev = l.headreturn l
}//获取数据
func (this *LRUCache) Get(key int) int {if _, ok := this.cache[key]; !ok {return -1}//cache是哈希表node := this.cache[key]//链表记录顺序 this.moveToHead(node)return node.value
}//写入数据
func (this *LRUCache) Put(key int, value int) {if _, ok := this.cache[key]; !ok {//不存在node := initDLinkedNode(key, value)this.cache[key] = nodethis.addToHead(node)this.size++if this.size > this.capacity {removed := this.removeTail()delete(this.cache, removed.key)this.size--}} else {//存在 node := this.cache[key]node.value = valuethis.moveToHead(node)}
}//头部增加节点
func (this *LRUCache) addToHead(node *DLinkedNode) {node.prev = this.headnode.next = this.head.nextthis.head.next.prev = nodethis.head.next = node
}//删除节点
func (this *LRUCache) removeNode(node *DLinkedNode) {node.prev.next = node.nextnode.next.prev = node.prev
}//将该节点移到头部
func (this *LRUCache) moveToHead(node *DLinkedNode) {this.removeNode(node)this.addToHead(node)
}//移除尾部节点
func (this *LRUCache) removeTail() *DLinkedNode {node := this.tail.prevthis.removeNode(node)return node
}
hash访问key,value快,链表保存顺序。每次新增节点,将节点放到链表首部,还要判断LRU的容量确定是否删除队尾节点。
参考地址:https://leetcode-cn.com/problems/lru-cache/solution/lruhuan-cun-ji-zhi-by-
面试高频题: LRU缓存机制实现相关推荐
- leetcode算法题--LRU缓存机制
原题链接:https://leetcode-cn.com/problems/lru-cache/ 题目要求O(1),于是采用哈希表方法,又由于要满足LRU机制,故采用链表保存 class LRUCac ...
- 力扣146题 LRU 缓存机制
问题url https://leetcode-cn.com/problems/lru-cache/ 答案 # -*- coding: utf-8 -*- cg = "cgnb" c ...
- 牛客网面试高频题top100(1~10)
*牛客网面试高频题top100(1~10 java实现) 1.反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表 ...
- LRU缓存机制,你想知道的这里都有
概述 LRU是Least Recently Used的缩写,译为最近最少使用.它的理论基础为 "最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然 ...
- 面试高频题:Spring和SpringMvc父子容器你能说清楚吗
引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...
- 面试题:460道Java后端面试高频题答案版「模块九:Spring」
Spring 写在前面 相信对于 Spring 这个模块,只要是做过 Java 开发的同学都是不陌生的,或多或少都使用过 Spring 体系的框架.对于平时自己做点小项目会写配置文件可能就行了,但是对 ...
- 2022(招聘季)linux面试高频题
大家好,今天给大家分享一下2022最新最全的linux面试高频题,希望你们喜欢. linux运维工程师在面试的时候经常会被问到各种问题,接下来我也会根据自己的经验将面试题整理下来供大家参考.有不同见解 ...
- 实现 LRU 缓存机制
实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...
- 146. LRU 缓存机制
146. LRU 缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 . 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 ...
- 牛客网面试高频题top100(11~20)
** 牛客网面试高频题top100(11~20 java实现) ** 11.跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结 ...
最新文章
- 如何在搜索结果出来之前,让页面显示“等待中。。。”
- cs go linux 参数,CSGO 命令大全 给新手的福利 使用设置参数
- 些许注意事项(初学)
- 1003. [ZJOI2006]物流运输【区间DP+最短路】
- 关于大数据的那些事儿
- [WEKA]如何将英文文本数据集转换为ARFF格式
- 锋利的jQuery--关于$(document).ready()函数及jQuery代码风格
- Git 下载很慢问题解决方案
- 网易易盾李雨珂:服务性能+算法确定性优化,迎接5G时代内容安全爆发式流量增长...
- 您的MyFitnessPal帐户几乎肯定已被黑客入侵,请立即更改密码
- Python练习-迭代器-模拟cat|grep文件
- Session 另一种用法,其实是一样的
- 深度学习:卷积神经网络CNN
- 怎么把框架栏变颜色 html,如何修改easyui框架颜色,求指点_html/css_WEB-ITnose
- 最不可思议的职场语录
- 单片机语音播报怎么做?语音模块原理及程序编写思路
- 泛泰 A850 TWRP Recovery En英/Cn简/Tw繁[2013.05.19]
- 【C语言刷题】汉诺塔问题
- matlab 相位校正,科学网—全相位比值校正法 - 王兆华的博文
- 推荐7款非常棒的将代码片段转换成图片的工具
热门文章
- 【设计模式】享元模式 实现 ( 实现流程 | 抽象享元类 | 具体享元类 | 享元工厂 | 用户调用 | 代码模板 )
- springboot 常用的异常处理方式
- 008 python接口 unittest
- 01.Python基础-3.集合容器
- hdu1247 Hat’s Words
- 局部和匿名类型作模板实参
- !!!光线对视频识别技术的影响
- “当前上下文中不存在名称”解决
- 图数据库Neo4j全栈Web技术解密
- android AsyncTask 的分析与运用