题目

运用你所掌握的数据结构,设计和实现一个  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缓存机制实现相关推荐

  1. leetcode算法题--LRU缓存机制

    原题链接:https://leetcode-cn.com/problems/lru-cache/ 题目要求O(1),于是采用哈希表方法,又由于要满足LRU机制,故采用链表保存 class LRUCac ...

  2. 力扣146题 LRU 缓存机制

    问题url https://leetcode-cn.com/problems/lru-cache/ 答案 # -*- coding: utf-8 -*- cg = "cgnb" c ...

  3. 牛客网面试高频题top100(1~10)

    *牛客网面试高频题top100(1~10 java实现) 1.反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表 ...

  4. LRU缓存机制,你想知道的这里都有

    概述 LRU是Least Recently Used的缩写,译为最近最少使用.它的理论基础为 "最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然 ...

  5. 面试高频题:Spring和SpringMvc父子容器你能说清楚吗

    引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...

  6. 面试题:460道Java后端面试高频题答案版「模块九:Spring」

    Spring 写在前面 相信对于 Spring 这个模块,只要是做过 Java 开发的同学都是不陌生的,或多或少都使用过 Spring 体系的框架.对于平时自己做点小项目会写配置文件可能就行了,但是对 ...

  7. 2022(招聘季)linux面试高频题

    大家好,今天给大家分享一下2022最新最全的linux面试高频题,希望你们喜欢. linux运维工程师在面试的时候经常会被问到各种问题,接下来我也会根据自己的经验将面试题整理下来供大家参考.有不同见解 ...

  8. 实现 LRU 缓存机制

    实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...

  9. 146. LRU 缓存机制

    146. LRU 缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 . 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 ...

  10. 牛客网面试高频题top100(11~20)

    ** 牛客网面试高频题top100(11~20 java实现) ** 11.跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结 ...

最新文章

  1. 如何在搜索结果出来之前,让页面显示“等待中。。。”
  2. cs go linux 参数,CSGO 命令大全 给新手的福利 使用设置参数
  3. 些许注意事项(初学)
  4. 1003. [ZJOI2006]物流运输【区间DP+最短路】
  5. 关于大数据的那些事儿
  6. [WEKA]如何将英文文本数据集转换为ARFF格式
  7. 锋利的jQuery--关于$(document).ready()函数及jQuery代码风格
  8. Git 下载很慢问题解决方案
  9. 网易易盾李雨珂:服务性能+算法确定性优化,迎接5G时代内容安全爆发式流量增长...
  10. 您的MyFitnessPal帐户几乎肯定已被黑客入侵,请立即更改密码
  11. Python练习-迭代器-模拟cat|grep文件
  12. Session 另一种用法,其实是一样的
  13. 深度学习:卷积神经网络CNN
  14. 怎么把框架栏变颜色 html,如何修改easyui框架颜色,求指点_html/css_WEB-ITnose
  15. 最不可思议的职场语录
  16. 单片机语音播报怎么做?语音模块原理及程序编写思路
  17. 泛泰 A850 TWRP Recovery En英/Cn简/Tw繁[2013.05.19]
  18. 【C语言刷题】汉诺塔问题
  19. matlab 相位校正,科学网—全相位比值校正法 - 王兆华的博文
  20. 推荐7款非常棒的将代码片段转换成图片的工具

热门文章

  1. 【设计模式】享元模式 实现 ( 实现流程 | 抽象享元类 | 具体享元类 | 享元工厂 | 用户调用 | 代码模板 )
  2. springboot 常用的异常处理方式
  3. 008 python接口 unittest
  4. 01.Python基础-3.集合容器
  5. hdu1247 Hat’s Words
  6. 局部和匿名类型作模板实参
  7. !!!光线对视频识别技术的影响
  8. “当前上下文中不存在名称”解决
  9. 图数据库Neo4j全栈Web技术解密
  10. android AsyncTask 的分析与运用