[Unity学习教程] 146. LRU 缓存

[复制链接]
查看1157 | 回复0 | 2023-8-23 12:08:31 | 显示全部楼层 |阅读模式 来自 中国北京
标题-中等难度

请你计划并实现一个满意 LRU (近来最少使用) 缓存 束缚的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 假如关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 假如关键字 key 已经存在,则变更其数据值 value ;假如不存在,则向缓存中插入该组 key-value 。假如插入使用导致关键字数目凌驾 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 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 <= 10000
  • 0 <= value <= 105
  • 最多调用 2 * 105 次 get 和 put
  泉源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络全部。商业转载请接洽官方授权,非商业转载请注明出处。

1. 链表

时间
2428ms
击败 96.49%使用 Python 的用户
内存
75.66mb
击败 44.44%使用 Python 的用户
  1. class DoubleLinkedNode:
  2.     def __init__(self, key=0,value=0):
  3.         self.key = key
  4.         self.value = value
  5.         self.prev = None
  6.         self.next = None
  7. class LRUCache(object):
  8.     def __init__(self, capacity):
  9.         """
  10.         :type capacity: int
  11.         """
  12.         self.capacity = capacity
  13.         self.dic = {}
  14.         # 创建节点作为列表头
  15.         self.head = DoubleLinkedNode()
  16.         # 创建节点作为列表尾
  17.         self.tail = DoubleLinkedNode()
  18.         # 新建链表只有表头和表尾,让表头下一项为表尾
  19.         self.head.next = self.tail
  20.         # 让表尾前一项为表头,完成链表连接
  21.         self.tail.prev = self.head
  22.         self.l = 0
  23.     def get(self, key):
  24.         """
  25.         :type key: int
  26.         :rtype: int
  27.         """
  28.         # 如果key不存在于字典,返回-1
  29.         if key not in self.dic:
  30.             return -1
  31.         # 如果存在,获取节点
  32.         node = self.dic[key]
  33.         # 把节点移至头
  34.         self.moveToHead(node)
  35.         # 返回节点值
  36.         return node.value
  37.     def put(self, key, value):
  38.         """
  39.         :type key: int
  40.         :type value: int
  41.         :rtype: None
  42.         """
  43.         # 如果未在字典中
  44.         if key not in self.dic:
  45.             # 创建新节点
  46.             node = DoubleLinkedNode(key,value)
  47.             # 将节点添加至字典
  48.             self.dic[key] = node
  49.             # 将节点添加至头部
  50.             self.addToHead(node)
  51.             # 计数字典中节点个数
  52.             self.l += 1
  53.             # 如果数量超出容量
  54.             if self.l > self.capacity:
  55.                 # 获取尾部节点
  56.                 exNode = self.tail.prev
  57.                 # 移除尾部节点
  58.                 self.removeNode(exNode)
  59.                 # 移除字典中的尾部节点
  60.                 self.dic.pop(exNode.key)
  61.                 # 字典节点数-1
  62.                 self.l -= 1
  63.         # 如果存在于字典
  64.         else:
  65.             # 获取原先存在的节点
  66.             node = self.dic[key]
  67.             # 更新节点值
  68.             node.value = value
  69.             # 更新过后移到链表头
  70.             self.moveToHead(node)
  71.     def addToHead(self, node):
  72.         # node在self.head后面
  73.         node.prev = self.head
  74.         # node在self.head下一个节点的前面
  75.         node.next = self.head.next
  76.         # self.head和它下一个节点中间插入node节点
  77.         self.head.next.prev = node
  78.         # 让node成为self.head下一个节点
  79.         self.head.next = node
  80.     def removeNode(self, node):
  81.         # 让节点前一项的next存储节点下一项的地址
  82.         node.prev.next = node.next
  83.         # 节点的下一项的prev存储节点前一项的地址,删除了节点并重新连接链表结构
  84.         node.next.prev = node.prev
  85.     def moveToHead(self, node):
  86.         # 移除原先的node
  87.         self.removeNode(node)
  88.         # 将node添加到链表头
  89.         self.addToHead(node)
  90. # Your LRUCache object will be instantiated and called as such:
  91. # obj = LRUCache(capacity)
  92. # param_1 = obj.get(key)
  93. # obj.put(key,value)
复制代码
来源:https://blog.csdn.net/Ashiu/article/details/132287967
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则