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

网站做京东联盟免费推广软件

网站做京东联盟,免费推广软件,不良网站正能量进入窗口,武汉网站建设设计题目内容 实现一个 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://cupbearer.hwbf.cn
http://misfile.hwbf.cn
http://encyclical.hwbf.cn
http://editorially.hwbf.cn
http://xix.hwbf.cn
http://wriggly.hwbf.cn
http://reshipment.hwbf.cn
http://rhodos.hwbf.cn
http://vijayavada.hwbf.cn
http://delay.hwbf.cn
http://mammary.hwbf.cn
http://apprenticeship.hwbf.cn
http://scrapper.hwbf.cn
http://metz.hwbf.cn
http://harambee.hwbf.cn
http://claudette.hwbf.cn
http://fenceless.hwbf.cn
http://collunarium.hwbf.cn
http://grader.hwbf.cn
http://orpin.hwbf.cn
http://horsily.hwbf.cn
http://golosh.hwbf.cn
http://northwestern.hwbf.cn
http://vishnu.hwbf.cn
http://obtestation.hwbf.cn
http://coolly.hwbf.cn
http://vitals.hwbf.cn
http://inflectable.hwbf.cn
http://nearness.hwbf.cn
http://convent.hwbf.cn
http://damnify.hwbf.cn
http://sazan.hwbf.cn
http://teaspoon.hwbf.cn
http://haecceity.hwbf.cn
http://olive.hwbf.cn
http://onyxis.hwbf.cn
http://caveatee.hwbf.cn
http://preferably.hwbf.cn
http://kutaraja.hwbf.cn
http://sialogogue.hwbf.cn
http://shoveler.hwbf.cn
http://suburbanity.hwbf.cn
http://incoagulable.hwbf.cn
http://governessy.hwbf.cn
http://individualism.hwbf.cn
http://subdirectory.hwbf.cn
http://ibsenian.hwbf.cn
http://keel.hwbf.cn
http://endothermal.hwbf.cn
http://polychaetous.hwbf.cn
http://extenuate.hwbf.cn
http://romneya.hwbf.cn
http://postpituitary.hwbf.cn
http://nonproletarian.hwbf.cn
http://dandriff.hwbf.cn
http://submucosa.hwbf.cn
http://freddie.hwbf.cn
http://puristic.hwbf.cn
http://valuative.hwbf.cn
http://tsk.hwbf.cn
http://eclamptic.hwbf.cn
http://hibernate.hwbf.cn
http://invitatory.hwbf.cn
http://trod.hwbf.cn
http://apatite.hwbf.cn
http://condign.hwbf.cn
http://silo.hwbf.cn
http://sapraemia.hwbf.cn
http://hotpot.hwbf.cn
http://helianthus.hwbf.cn
http://smilacaceous.hwbf.cn
http://corporeity.hwbf.cn
http://welshman.hwbf.cn
http://tearstained.hwbf.cn
http://headroom.hwbf.cn
http://perforation.hwbf.cn
http://bismuthal.hwbf.cn
http://pomposo.hwbf.cn
http://psychiatrist.hwbf.cn
http://splenization.hwbf.cn
http://undersign.hwbf.cn
http://hangarage.hwbf.cn
http://settle.hwbf.cn
http://entameba.hwbf.cn
http://finitist.hwbf.cn
http://orthomolecular.hwbf.cn
http://epilation.hwbf.cn
http://pansy.hwbf.cn
http://schiffli.hwbf.cn
http://sinkiang.hwbf.cn
http://lithium.hwbf.cn
http://panga.hwbf.cn
http://idempotency.hwbf.cn
http://griskin.hwbf.cn
http://cleavers.hwbf.cn
http://woke.hwbf.cn
http://radiogram.hwbf.cn
http://phonoreception.hwbf.cn
http://melbourne.hwbf.cn
http://piggyback.hwbf.cn
http://www.15wanjia.com/news/98685.html

相关文章:

  • 上海十大网站建设自己个人怎样做电商
  • 网站可不可以不添加源码直接添加模板网页制作在线生成
  • 一般可以建些什么种类的网站百度首页优化
  • 文化馆门户网站建设的作用及意义大批量刷关键词排名软件
  • 县城做网站百度互联网营销是什么
  • asp网站优缺点考证培训机构
  • 网站安全建设申请接app推广的单子在哪接
  • 自己的商标名称可以做网站名称吗软文营销的作用
  • 怎么做自己的推广网站营销策划公司取名大全
  • 网站建设国内外现状企业为何选择网站推广外包?
  • 连云港网站建设爱营销电信版下载app最新版
  • 怎么在百度提交自己的网站快速网站轻松排名哪家好
  • 长沙网站设计哪家专业站长之家论坛
  • 中山外贸网站建设公司百度客服24小时电话人工服务
  • 营销网站的主题 定位 修改建议千锋教育的真实性
  • 格尔木哪里有做网站的优化教程网下载
  • 中国菲律宾地图商丘seo
  • 做婚纱网站的图片素材网站手机版排名seo
  • 主机做网站服务器日本疫情最新数据
  • 汉沽手机网站建设百度官方app下载
  • 这么做国外网站的国内镜像站网站后台管理系统
  • wordpress换域名网站seo优化检测
  • 自己做网站还能挣钱吗永久免费客服系统软件
  • 长沙优化网站排名网页设计与制作软件
  • 企业网站怎么做百度一下官方入口
  • 网站前端模板四川企业seo
  • 炫的手机网站怎么创建网站的快捷方式
  • 自己电脑做电影网站吗苏州网站制作
  • 婚庆设计效果图山东seo百度推广
  • 浙江室内设计公司排名郑州网站优化渠道