• LeetCode_146.LRU 缓存机制


    运用你所掌握的数据结构,设计和实现一个  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);
        }
    }
    
  • 相关阅读:
    Mysql优化之6年工作经验总结
    mysql_innodb存储引擎的优化
    十六、MySQL授权命令grant的使用方法
    十五、Mysql字符集的那些事
    十四、索引
    十三、视图
    十二、存储过程
    十一、触发器
    十、存储引擎
    九、备份与恢复
  • 原文地址:https://www.cnblogs.com/fuxuyang/p/14242735.html
Copyright © 2020-2023  润新知