码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode_146.LRU 缓存机制

时间:2021-01-08 11:17:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:完成   origin   count   new   http   amp   缓存   ons   限时   

运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制

实现 LRUCache 类:

  • LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
  • void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

 

进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?

 

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4

 

提示:

  • 1 <= capacity <= 3000
  • 0 <= key <= 3000
  • 0 <= value <= 104
  • 最多调用 3 * 104getput

C#代码

public class LRUCache
{
    System.Collections.Concurrent.ConcurrentDictionary<int, LinkedListNode<Tuple<int, int>>> dic;
    LinkedList<Tuple<int, int>> linkedList;
    int cap;

    public LRUCache(int cap)
    {
        dic = new System.Collections.Concurrent.ConcurrentDictionary<int, LinkedListNode<Tuple<int, int>>>();
        this.linkedList = new LinkedList<Tuple<int, int>>();
        this.cap = cap;
    }

    public int Get(int key)
    {
        dic.TryGetValue(key, out LinkedListNode<Tuple<int, int>> val);
        if (val == null) return -1;

        int value = val.Value.Item2;
        Put(key, value);
        return value;
    }

    public void Put(int key, int value)
    {
        dic.TryGetValue(key, out LinkedListNode<Tuple<int, int>> val);
        if (val == null && dic.Count == cap) val = linkedList.Last;

        if (val != null)
        {
            dic.TryRemove(val.Value.Item1,out val);
            linkedList.Remove(val);
        }

        val = new LinkedListNode<Tuple<int, int>>(Tuple.Create(key, value));
        dic.TryAdd(key, val);
        linkedList.AddFirst(val);
    }
}

LeetCode_146.LRU 缓存机制

标签:完成   origin   count   new   http   amp   缓存   ons   限时   

原文地址:https://www.cnblogs.com/fuxuyang/p/14242735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!