您的位置:首页 > 科技 > 能源 > 池州网站建设公司_保定网站报价_google关键词搜索工具_互联网公司

池州网站建设公司_保定网站报价_google关键词搜索工具_互联网公司

2024/12/26 18:11:59 来源:https://blog.csdn.net/m0_38098373/article/details/143255706  浏览:    关键词:池州网站建设公司_保定网站报价_google关键词搜索工具_互联网公司
池州网站建设公司_保定网站报价_google关键词搜索工具_互联网公司

题目描述

请你设计并实现一个满足  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

思路

使用双向链表来完成,参考:. - 力扣(LeetCode)

1)需要创建一个链表结构【key,value,prev,next】

2)初始化:容器的容量,hash字典,双向链表的构建

3)定义一个将节点移动到末尾的函数【最新被访问的节点都放在队尾】

    3.1)从hash字典里读取这个节点

    3.2)缝合这个节点的前后

    3.3)这个节点插入到尾部节点之前

4)get操作:如果key值在hash字典里,就先移动到队尾;从hash字典里获取key的值,如果不等于-1就返回其value

5)put操作:如果key在hash字典里,就更新该key在hash字典里的value,并将其移动到队尾;如果没在过,就先看是否当前的hash字典已经满足容量里,如果满足:则移除头节点后面的节点,之后进行缝合;

    5.1)新建一个节点,放入hash字典中;将新节点插入到尾部节点之前

ps:一般插入操作都是4步,node.next,node.prev;之后插入的位置前节点指向该节点,后面的节点指向该节点

class ListNode:def __init__(self, key=None, value=None):self.key = keyself.value = valueself.prev = Noneself.next = Noneclass LRUCache(object):def __init__(self, capacity):""":type capacity: int"""self.capacity = capacityself.hashmap = {}self.head = ListNode()self.tail = ListNode()self.head.next = self.tailself.tail.prev = self.headdef move_node_to_tail(self, key):node = self.hashmap[key]node.prev.next = node.nextnode.next.prev = node.prevnode.next = self.tailnode.prev = self.tail.prevself.tail.prev.next = nodeself.tail.prev = node def get(self, key):""":type key: int:rtype: int"""if key in self.hashmap:self.move_node_to_tail(key)res = self.hashmap.get(key,-1)if res == -1:return res else:return res.valuedef put(self, key, value):""":type key: int:type value: int:rtype: None"""if key in self.hashmap:self.hashmap[key].value = valueself.move_node_to_tail(key)else:if len(self.hashmap) == self.capacity:self.hashmap.pop(self.head.next.key)self.head.next = self.head.next.nextself.head.next.prev = self.headnew = ListNode(key, value)self.hashmap[key] = new new.next = self.tailnew.prev = self.tail.prevself.tail.prev.next = newself.tail.prev = new# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com