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

网站开发项目建设经验少儿培训

网站开发项目建设经验,少儿培训,网站建设思维,wordpress feed 修改相关题目 146. LRU 缓存 要让 put 和 get ⽅法的时间复杂度为 O(1),我们可以总结出 cache 这个数据结构必要的条件: 1、显然 cache 中的元素必须有时序,以区分最近使⽤的和久未使⽤的数据,当容量满了之后要删除最久未使⽤的那个元…

相关题目
146. LRU 缓存

要让 put 和 get ⽅法的时间复杂度为 O(1),我们可以总结出 cache 这个数据结构必要的条件:
1、显然 cache 中的元素必须有时序,以区分最近使⽤的和久未使⽤的数据,当容量满了之后要删除最久未使⽤的那个元素腾位置。
2、我们要在 cache 中快速找某个 key 是否已存在并得到对应的 val。
3、每次访问 cache 中的某个 key,需要将这个元素变为最近使⽤的,也就是说 cache 要⽀持在任意位置快速插⼊和删除元素。

哈希表查找快,但是数据⽆固定顺序;链表有顺序之分,插⼊删除快,但是查找慢,所以结合⼆者的⻓处,可以形成⼀种新的数据结构:哈希链表 LinkedHashMap

在Python中,可以使用collections模块中的OrderedDict类来实现类似于Java中LinkedHashMap的功能。

本文最后还提供了一种 结合双向链表和哈希表的 从零开始的实现,供参考。

// 使用 LinkedHashMap 实现
class LRUCache {int cap;LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();public LRUCache(int capacity) {this.cap = capacity;}public int get(int key) {if (!cache.containsKey(key)) {return -1;}// 将 key 变为最近使⽤makeRecently(key);return cache.get(key);}public void put(int key, int val) {if (cache.containsKey(key)) {// 修改 key 的值cache.put(key, val);// 将 key 变为最近使⽤makeRecently(key);return;}if (cache.size() >= this.cap) {// 链表头部就是最久未使⽤的 keyint oldestKey = cache.keySet().iterator().next();cache.remove(oldestKey);}// 将新的 key 添加链表尾部cache.put(key, val);}private void makeRecently(int key) {int val = cache.get(key);// 删除 key,重新插⼊到队尾cache.remove(key);cache.put(key, val);}
}
# 使用 OrderedDict 实现
from collections import OrderedDictclass LRUCache:def __init__(self, capacity: int):self.cc = capacityself.d = OrderedDict()def get(self, key: int) -> int:if key in self.d:self.d.move_to_end(key)return self.d[key]return -1def put(self, key: int, value: int) -> None:if key in self.d:del self.d[key]self.d[key] = valueif len(self.d) > self.cc:self.d.popitem(last=False)
# 手撸LRU算法,结合双向链表和哈希表,LinkedHashMap
# 先定义双向链表节点
class DoubleListNodeLRU:next, last = None, Nonedef __init__(self, k, v):self.k = kself.v = vclass NodeLRU:head, tail = None, Nonesize = Nonedef __init__(self):# head tail 为 头尾虚拟节点self.head = DoubleListNodeLRU(0, 0)self.tail = DoubleListNodeLRU(0, 0)self.head.next = self.tailself.tail.last = self.headself.size = 0# 链表尾部添加节点 时间 O(1)def addLast(self, x: DoubleListNodeLRU):x.last = self.tail.lastx.next = self.tailself.tail.last.next = xself.tail.last = xself.size += 1# 删除链表中的 x 节点(x ⼀定存在)# 由于是双链表且给的是⽬标Node节点,时间O(1)def remove(self, x: DoubleListNodeLRU):x.last.next = x.nextx.next.last = x.lastself.size -= 1# 删除链表中第⼀个节点,并返回该节点,时间 O(1)def removeFirst(self):if self.head.next == self.tail:return Nonefirst = self.head.nextself.remove(first)return firstclass LRUCache:def __init__(self, capacity: int):self.cap = capacity# key -> node(key, val)self.map = dict()self.cache = NodeLRU()# 将某个 key 提升为最近使⽤的def makeRecently(self, k):node = self.map.get(k)self.cache.remove(node)self.cache.addLast(node)# 添加最近使⽤的元素def addRecently(self, k, v):node = DoubleListNodeLRU(k, v)self.cache.addLast(node)self.map[k] = node# 删除某⼀个 keydef deletekey(self, k):node = self.map[k]self.map.pop(k)self.cache.remove(node)def removeLeastRecently(self):deleteNode = self.cache.removeFirst()deletekey = deleteNode.kself.map.pop(deletekey)def get(self, k):if k not in self.map:return -1self.makeRecently(k)return self.map.get(k).vdef put(self, k, v):if k in self.map:self.deletekey(k)self.addRecently(k, v)returnif self.cache.size == self.cap:self.removeLeastRecently()self.addRecently(k, v)
http://www.hkea.cn/news/636640/

相关文章:

  • 如何编写网站电脑清理软件十大排名
  • 怎么给企业制作网站seo关键词排名优化哪好
  • 高仿服装网站建设西安百度关键词推广
  • 网站单页面怎么做的百度seo站长工具
  • 网站建设谢辞企业营销型网站有哪些
  • 免费网站制作申请行业关键词一览表
  • 网站建设费关键词排名提高方法
  • 搭建淘宝客网站源码最近发生的新闻事件
  • 网站模版网网站关键词排名优化价格
  • 做网站去哪里全国免费发布广告信息平台
  • 靖江做网站湖南seo服务电话
  • 工程建设科学技术奖申报网站友情链接交换标准
  • 做网站后期为什么续费链交换
  • 网站开发与设计专业西安seo顾问培训
  • 企业网站建设话术优化营商环境指什么
  • 傻瓜式网站制作微信运营技巧
  • 甘肃网络推广软件seo方案
  • 建筑公司网站首页图片网站推广引流
  • 购物网站 后台模板今日头条站长平台
  • 营销导向企业网站策划站长工具无内鬼放心开车禁止收费
  • WordPress不能支付宝交易吗如何优化
  • 南昌seo网站设计站长工具是做什么的
  • 做IP授权的一般看什么网站一级消防工程师考试
  • 项目建设备案网站爱站网站长百度查询权重
  • 铜陵专业网站制作公司软文免费发布平台
  • 鹿泉市建设局网站短视频seo关键词
  • 手机网站开发标准网络营销服务工具
  • 施工企业分包工程会计与税务处理网站推广优化是什么意思
  • 网站建设开发的目的智能建站网站模板
  • 深圳市做网站的有那些公司沈阳百度推广哪家好