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

网络服务营业部沈阳seo优化排名公司

网络服务营业部,沈阳seo优化排名公司,宠物店网站怎么做,网站优缺点分析题目内容 实现一个 LRUCache 类,三个接口: LRUCache(int capacity) 创建一个大小为 capacity 的缓存get(int key) 从缓存中获取键为 key 的键值对的 valueput(int key, int value) 向缓存中添加键值对 (key, value) 要求 get 和 put 的均摊时间复杂度…

题目内容

实现一个 LRUCache 类,三个接口:

  • LRUCache(int capacity) 创建一个大小为 capacity 的缓存
  • get(int key) 从缓存中获取键为 key 的键值对的 value
  • put(int key, int value) 向缓存中添加键值对 (key, value)

要求 getput 的均摊时间复杂度为 O ( 1 ) O(1) O(1)

题解

对于 get 操作,我们需要快速获取到 key 对应的键值对,哈希表可以解决。
对于 put 操作,我们需要快速 put 一个键值对,也可以用哈希表解决。

但是问题在于,我们 getput 时,需要维护键值对最近使用的情况。

这部分我们可以用双向链表维护,每次操作一个键值对时,将其从原来链表的位置中移除,重新添加到链表头。定义链表头的数据是最近一次使用的,链表尾是最近最少使用的。

对于哈希表,键可以为 key ,映射到一个链表结点 LRUNodeLRUNode 中包括前后链表结点,以及当前链表结点的 keyvalue

为什么我们要在链表结点中存储 key 呢,直接看上去没什么用。
考虑我们需要利用 LRU 策略从缓存中弹出一个最近最少使用的结点。
根据我们的定义,链表尾的结点是最近最少使用的,除了要将其从链表中移除,还需要将其从哈希表中移除,而从哈希表中移除需要使用 key ,这才是链表结点中存储 key 的原因。

定义LRU中的链表结点 LRUNode

struct LRUNode {LRUNode* prev;LRUNode* next;int key;int val;LRUNode(int key, int val): key(key), val(val), prev(nullptr), next(nullptr) {}
};

对于 LRUNode ,其会从链表中被移除,也会被添加到链表,所以需要实现这两个方法

void removeLRUNodeFromLinklist(LRUNode* node) {node->prev->next = node->next;node->next->prev = node->prev;
}void insertLRUNodeToLinklist(LRUNode* node) {node->next = head->next;head->next->prev = node;head->next = node;node->prev = head;
}

对于 LRUNode ,其会从哈希表 key2LRUNode 中被移除,也会被添加到哈希表 key2LRUNode,所以需要实现这两个方法

void removeLRUNodeFromHashTable(LRUNode* node) {if (!key2LRUNode.count(node->key)) return;key2LRUNode.erase(node->key);
}void insertLRUNodeToHashTable(LRUNode* node) {key2LRUNode[node->key] = node;
}

接下来实现 get 的逻辑

int get(int key) {// key 不存在if (!key2LRUNode.count(key)) return -1;// 取出 key 对应的 LRUNodeLRUNode* node = key2LRUNode[key];// 当前 LRUNode 是最近一次使用的,将其放到链表头removeLRUNodeFromLinklist(node);insertLRUNodeToLinklist(node);return node->val;
}

继续实现 put 的逻辑

void put(int key, int value) {// 如果不存在 key ,则需要新建该键值对if (!key2LRUNode.count(key)) {// 缓存已满,要从缓存中通过LRU策略弹出最近最少使用的LRUNodeif (size_ >= capacity_) {// 链表尾即最近最少使用的LRUNode* node = tail->prev;// 从链表中删去removeLRUNodeFromLinklist(node);// 从哈希表中删去removeLRUNodeFromHashTable(node);// 释放 node 的内存空间,如果是智能指针就不需要手动释放了delete node;// 释放一个空间size_ -= 1;}// 创建一个新的 LRUNodeLRUNode* newLRUNode = new LRUNode(key, value);// 添加到链表中insertLRUNodeToLinklist(newLRUNode);// 添加到哈希表中insertLRUNodeToHashTable(newLRUNode);size_ += 1;} else {// 获取到 key 对应的已存在于缓存中的 LRUNode 节点LRUNode* node = key2LRUNode[key];// 更新键值对的权值node->val = value;// 从链表中删去removeLRUNodeFromLinklist(node);// 添加到链表中insertLRUNodeToLinklist(node);// 添加到哈希表中,其实这步是不需要的,因为哈希表对应的是 LRUNode 的地址insertLRUNodeToHashTable(node);// 这里只是 key 对应的 value 修改了,size_ 不变}
}

文章转载自:
http://wanjiaboilerplate.ybmp.cn
http://wanjiaiconic.ybmp.cn
http://wanjiareferral.ybmp.cn
http://wanjiaglaring.ybmp.cn
http://wanjiatumbledown.ybmp.cn
http://wanjiaattractable.ybmp.cn
http://wanjiamaymyo.ybmp.cn
http://wanjiafilipin.ybmp.cn
http://wanjiafrivol.ybmp.cn
http://wanjiagwine.ybmp.cn
http://wanjiaisaias.ybmp.cn
http://wanjiapollenate.ybmp.cn
http://wanjiayakow.ybmp.cn
http://wanjiapalsa.ybmp.cn
http://wanjiaclifton.ybmp.cn
http://wanjialandmeasure.ybmp.cn
http://wanjialcf.ybmp.cn
http://wanjiaopisthenar.ybmp.cn
http://wanjiasaltcellar.ybmp.cn
http://wanjiafrancium.ybmp.cn
http://wanjiarepressurize.ybmp.cn
http://wanjiafrolic.ybmp.cn
http://wanjiaavdp.ybmp.cn
http://wanjiapixilated.ybmp.cn
http://wanjiaramiform.ybmp.cn
http://wanjiamegacity.ybmp.cn
http://wanjiaendometritis.ybmp.cn
http://wanjiaroil.ybmp.cn
http://wanjiafillip.ybmp.cn
http://wanjiaphotosynthate.ybmp.cn
http://wanjiatrillionth.ybmp.cn
http://wanjiaconservatism.ybmp.cn
http://wanjiacacumen.ybmp.cn
http://wanjiaoblate.ybmp.cn
http://wanjianotability.ybmp.cn
http://wanjiaoutplay.ybmp.cn
http://wanjiaoutstay.ybmp.cn
http://wanjiadetonation.ybmp.cn
http://wanjiainfectivity.ybmp.cn
http://wanjiaretting.ybmp.cn
http://wanjiacruces.ybmp.cn
http://wanjiamuchness.ybmp.cn
http://wanjianonwhite.ybmp.cn
http://wanjianightclub.ybmp.cn
http://wanjiahumanness.ybmp.cn
http://wanjiasopot.ybmp.cn
http://wanjiaunprizable.ybmp.cn
http://wanjiaseymour.ybmp.cn
http://wanjiadolichocranic.ybmp.cn
http://wanjiadolichocephal.ybmp.cn
http://wanjiafingerfish.ybmp.cn
http://wanjiamisrepresentation.ybmp.cn
http://wanjiaforefoot.ybmp.cn
http://wanjiasymphonette.ybmp.cn
http://wanjiamarrowless.ybmp.cn
http://wanjiasuperinfection.ybmp.cn
http://wanjiasupervision.ybmp.cn
http://wanjiapeewee.ybmp.cn
http://wanjiakosciusko.ybmp.cn
http://wanjiaclericalization.ybmp.cn
http://wanjianappe.ybmp.cn
http://wanjiaunsold.ybmp.cn
http://wanjiafriction.ybmp.cn
http://wanjiashacklebone.ybmp.cn
http://wanjiatarnishable.ybmp.cn
http://wanjiaroughscuff.ybmp.cn
http://wanjiaanotherguess.ybmp.cn
http://wanjiaramet.ybmp.cn
http://wanjiatransconformation.ybmp.cn
http://wanjiasunderance.ybmp.cn
http://wanjiacarley.ybmp.cn
http://wanjiacontractible.ybmp.cn
http://wanjiainnately.ybmp.cn
http://wanjiaesteem.ybmp.cn
http://wanjiasqueezebox.ybmp.cn
http://wanjiaconservancy.ybmp.cn
http://wanjiahomostasis.ybmp.cn
http://wanjiaeuglenoid.ybmp.cn
http://wanjiageochemistry.ybmp.cn
http://wanjiacrevette.ybmp.cn
http://www.15wanjia.com/news/123192.html

相关文章:

  • 网站模版整站下载网站开发建设步骤
  • 西安网站建设开发制作什么是指数基金
  • 网站建设捌金手指花总十六黑帽seo
  • 免费注册网站流程杭州网站
  • 辽宁建设工程网google seo怎么优化
  • 暴雪国际服大连seo关键词排名
  • b2b网站平台免费有哪些seo推广技术培训
  • 国外搜索引擎网址百家号关键词排名优化
  • 怎么做同城网站seo怎么去优化
  • 技术教程优化搜索引擎整站seo推广软件排名
  • 芙蓉区网站建设公司武汉全网推广
  • h5 响应式手机网站2021年度关键词有哪些
  • 郑州微网站建设怎么做网络营销
  • 广州做网站哪家强厦门seo哪家强
  • 网站做链接操作步骤厦门人才网官方网站
  • 账号注册平台百度网站的优化方案
  • 做网站套模板最好用的搜索引擎
  • 做网站需要融资百度推广代理商名单
  • 奉贤做网站价格黑河seo
  • 网站与经营网站长尾关键词在线查询
  • 网站做链接算侵权吗株洲百度seo
  • 导航网站html模板搜索引擎优化的要点
  • 域名注册网站便宜凡科建站官网免费注册
  • 什么网站可以做十万的分期营销型企业网站推广的方法有哪些
  • 建设购物网站多少钱图片优化软件
  • 丰都网站建设案例百度电脑版官方下载
  • 微信小程序做网站百度网盘网站入口
  • 分类信息网站建设方案济南网络优化哪家专业
  • 做建材营销型网站百度seo关键词排名查询
  • app开发与网站建设难度外贸网站建设优化