当前位置: 首页 > news >正文

攀枝花建设网站常宁网站制作

攀枝花建设网站,常宁网站制作,广州企业建站模板,江苏建科建筑培训网LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否…

LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity)正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 getput 必须以 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

题解:

​ 常做常新的一道题,其实有点偏向于模板题目了,没有做过上来直接写会很抓瞎,有一些常见的问题

  • 为什么用双向链表而不是单向链表? 将某个节点移动到链表头部或者将链表尾部节点删去,都要用到删除链表中某个节点这个操作。你想要删除链表中的某个节点,需要找到该节点的前驱节点和后继节点。对于寻找后继节点,单向链表和双向链表都能通过 next 指针在O(1)时间内完成;对于寻找前驱节点,单向链表需要从头开始找,也就是要O(n)时间,双向链表可以通过前向指针直接找到,需要O(1)时间。综上,要想在O(1)时间内完成该操作,当然需要双向链表,实际上就是用双向链表空间换时间了。
  • 为什么链表节点需要同时存储 key 和 value,而不是仅仅只存储 value? 因为删去最近最少使用的键值对时,要删除链表的尾节点,如果节点中没有存储 key,那么怎么知道是哪个 key 被删除,进而在 map 中删去该 key 对应的 key-value 呢?

一定要多做几遍!!

type LRUCache struct {size, capacity intcache          map[int]*Nodehead, tail     *Node
}type Node struct {value, key intprev, next *Node
}func Constructor(capacity int) LRUCache {head := &Node{}tail := &Node{}head.next = tailtail.prev = headreturn LRUCache{capacity: capacity,cache:    make(map[int]*Node),head:     head,tail:     tail,}
}func (this *LRUCache) Get(key int) int {// 查询关键字 key 存在于缓存中,返回关键字的值,不存在则返回 -1if node, exist := this.cache[key]; exist {this.moveToHead(node)return node.value}return -1
}func (this *LRUCache) Put(key int, value int) {// 如果关键字 key 已经存在,则变更其数据值 value ;// 如果不存在,则向缓存中插入该组 key-value 。// 如果插入操作导致关键字数量超过 capacity ,则逐出最久未使用的关键字if node, exist := this.cache[key]; exist {node.value = valuethis.moveToHead(node)} else {newNode := &Node{key: key, value: value}this.cache[key] = newNodethis.addToHead(newNode)this.size++if this.size > this.capacity {tail := this.removeTail()delete(this.cache, tail.key)this.size--}}
}// Put 操作元素,如果不存在向缓存中添加
func (this *LRUCache) addToHead(node *Node) {node.prev = this.headnode.next = this.head.nextthis.head.next.prev = nodethis.head.next = node
}// 本来在队列中的元素,最近访问(Get, Put)后移动到队首
func (this *LRUCache) moveToHead(node *Node) {this.removeNode(node)this.addToHead(node)
}// Put 操作插入,超出容量则移除节点
func (this *LRUCache) removeNode(node *Node) {node.prev.next = node.nextnode.next.prev = node.prev
}// 移除最近最久未使用的节点
func (this *LRUCache) removeTail() *Node {node := this.tail.prevthis.removeNode(node)return node
}/*** Your LRUCache object will be instantiated and called as such:* obj := Constructor(capacity);* param_1 := obj.Get(key);* obj.Put(key,value);*/
http://www.yayakq.cn/news/581209/

相关文章:

  • 手机网站开发培训响应式外贸网站价格
  • 企业为什么要建立自己的网站吉林企业网站模板建站哪个好
  • php网站源码怎么在本地电脑调式网站做子页面怎么做
  • 装修队伍做网站天津网上商城网站建设
  • 中国娱乐设计网站官网松江做网站费用
  • 番禺网站建设公司高品质外贸网站建设
  • 网站seo网络优化全球最大的磁力搜索引擎
  • 咸阳网站推广微信开放平台创建移动应用
  • 公司网站怎么注册西安流调信息
  • 网页设计公司网站制作php网站开发速成
  • 淄博网站建设网宽青岛网站建设好不好
  • 如何建设网络营销网站室内设计风格都有哪些
  • wordpress公告知乎seo
  • 哪些网站推广公司成都网站开发团队
  • 网站提示页面设计手机软件公司
  • 网站建设的相关问题2023年网络推广方法
  • 专业教育网站建设网站建设有几大板块
  • 网站建设专项检查何鹏seo
  • 安吉网站设计企业网站建设方法
  • 做网站单页郑州网络
  • 网站 seowordpress自媒体博客模板
  • 免费网站重生做军嫂市政工程建设规范免费下载网站
  • 网站设计是不是会要用代码做营销型网站建设 深圳信科
  • 网站开发范本如何手机网站建立
  • 网站开发时间进度表手机微网站怎么制作
  • 泰安网站建设xtempire网站 网页区别是什么
  • 网站排名优化外包发稿什么意思
  • 酒泉网站建设服务企业网站建设有哪些好处
  • 林壑地板北京网站建设网站屏蔽国内ip
  • 四川建设机械网站百度网首页