LRU Cache
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
对LRU不了解的可以戳这里(感谢大神),这里需要自己手动建立一个双向链表,然后加上HashMap的协助从而达到O(1)时间的定位,双向链表能帮助我们达到删除节点,插入节点O(1)时间复杂度。具体的实现并不是很复杂。算法大家不明白的戳这里,java代码如下:
首先自己定义一个双向链表:
class Node{ private int key; private int value; private Node pre; private Node next; { pre = null; next = null; } public Node(){ this.key = Integer.MIN_VALUE; this.value = Integer.MIN_VALUE; } public Node(int key,int value){ this.key = key; this.value = value; } public int getKey(){ return key; } public int getValue(){ return value; } public void setKey(int key){ this.key = key; } public void setValue(int value){ this.value = value; } public Node getPre(){ return pre; } public void setPre(Node pre){ this.pre = pre; } public Node getNext(){ return next; } public void setNext(Node next){ this.next = next; } }
程序代码如下:
public class LRUCache { Map<Integer, Node> map = new HashMap<Integer, Node>(); int capacity = 0; Node head = new Node(); Node tail = new Node(); public LRUCache(int capacity) { this.capacity = capacity ; head.next = tail; tail.pre = head; } public int get(int key) { if(map.containsKey(key)){ Node e = map.get(key); delete(e); insert(tail, e); return e.getValue(); } return -1; } public void set(int key, int value) { Node e = new Node(key,value); if(!map.containsKey(key)){ if(map.size() < capacity){ map.put(key, e); insert(tail, e); }else if(map.size() == capacity){ map.remove(head.next.getKey()); delete(head.next); insert(tail,e); map.put(key, e); } }else{ Node exist = map.get(key); //remove node delete(exist); insert(tail,e); map.remove(key); map.put(key, e); } } private void delete(Node e){ Node pre = e.pre; Node post = e.next; pre.next = post; post.pre = pre; } private void insert(Node tail,Node e){ e.pre = tail.pre; e.next = tail; tail.pre.next = e; tail.pre = e; } }
相关推荐
Cache in Java 我很喜欢这个问题。 我在康奈尔大学的第一个 CS 课程涉及队列和其他数据结构。 对于其中一个课堂项目,我们必须开发基于队列的模拟。 在工作中,我开发了广泛的队列库。 我能说什么; 我喜欢队列和...
leetcode LRU Cache Algorithm (LRU缓存算法) C++版本,适用于 ##LRU算法介绍 引自: Discards the least recently used items first. This algorithm requires keeping track of what was used when, which is ...
LeetCode上的"LRU Cache"问题就是一个典型的例子,它要求实现一个固定容量的缓存,能快速获取最近访问的数据,并在容量满时遵循LRU策略。 理解LRU Cache的工作机制对于提升系统性能和优化资源分配至关重要。在面试...
lru缓存leetcode 问题描述 设计一个遵循最近最少使用 (LRU) 缓存约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity)使用正大小容量初始化 LRU 缓存。 int get(int key)如果键存在则返回键的值,否则返回-1...
LRU_cache (Leetcode 146) 设计和实现最近最少使用 (LRU) 缓存的数据结构。 它应该支持以下操作:get 和 set。 get(key) – 如果键存在于缓存中,则获取键的值(将始终为正),否则返回 -1。 set(key, value) – ...
python python_leetcode题解之146_LRU_Cache
lru缓存leetcode LRU缓存 受启发的简单 LRU 缓存实现 发展 建造 ./gradlew build 测试 ./gradlew test 使用示例 LRUCache< String , String > cache = new LRUCache<> ( 2 /* capacity */ ); cache . put( " ...
javascript js_leetcode题解之146-lru-cache.js
Leetcode-LRU-cache LRU缓存 设计和实现最近最少使用 (LRU) 缓存的数据结构。 它应该支持以下操作:get 和 put。 get(key) - 如果键存在于缓存中,则获取键的值(将始终为正),否则返回 -1。 put(key, value) - ...
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put. get(key) – Get the value (will always be positive) of the key if ...
LeetCode_LRU_Cache 问题: 最近最少使用的缓存 目标是设计一种称为最近最少使用 (LRU) 缓存的数据结构。 LRU 缓存是一种缓存类型,当缓存内存达到其限制时,我们会删除最近最少使用的条目。 对于当前问题,将 get ...
在LeetCode这个在线编程挑战平台上,有一道关于实现LRU缓存的题目,而“js_leetcode题解之LRU缓存_题解.zip”文件正是针对这道题目的JavaScript解法。 LRU缓存的主要思想是:当缓存满时,优先淘汰最近最少使用的...
lru leetcode LRU缓存的实现 LRU - 最近最少使用。 完成清单: C C++ 去 JAVA(进行中) C 实现是完整的,并通过 Leetcode 上的 LRU 缓存问题进行了检查。 (C 实现是为了重新熟悉 C 并“回归基础”) C++ 中的实现...
LRU_Cache是LeetCode的一个经典问题,旨在考察开发者对数据结构和算法的理解,特别是对LRU缓存机制的实现。 在这个问题中,你需要设计一个LRU缓存,它支持以下操作: 1. `get(key)`:如果键`key`存在于缓存中,则...
lru缓存leetcode lru_cache_example 在 Python 中使用 lru_cache 的非常简单的代码片段(供我参考)。 如何使用Python中提供的。 它允许将递归函数“转换”为 DP 方法(使用记忆化)。 示例代码解决了 Leetcode 中题...
lru缓存leetcode LRU缓存 看问题- 设计和实现最近最少使用 (LRU) 缓存的数据结构。 它应该支持以下操作:get 和 put。 get(key) - 如果键存在于缓存中,则获取键的值(将始终为正),否则返回 -1。 put(key, value) ...
当你在LeetCode上遇到“LRU Cache”这个题目时,通常会要求实现一个数据结构,它具有以下特性: 1. **添加和获取元素**:LRU Cache 允许你在O(1)的时间复杂度内添加或获取元素。这意味着无论缓存的大小如何,这些...
在LeetCode上,"LRU Cache" 是一个经典的面试题,它要求设计一个数据结构,模拟LRU缓存的行为。这个问题主要考察的是数据结构和算法的设计能力,尤其是如何利用哈希表和双向链表来实现LRU缓存。 题目描述通常如下:...
LRU-Cache 键值对的 LRU 缓存实现。 Leetcode #146。 使用简单的 int32 数据类型的 LRU 缓存实现。 复杂度 O(1)。 空间 O(N)。 数据结构:双链表头尾节点,加上哈希查找表。 对双链表使用抽象。
缓存的英文是cache,最早其实指的是用于CPU和主存数据交互的。早年这块存储被称为高速缓存,最近已经听不到这个词了,不知道是不是淘汰了。因为缓存的读写速度要高于CPU低于主存,所以是用来过渡数据用的。CPU从缓存...