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

菏泽网站网站建设文案转行做网站编辑

菏泽网站网站建设,文案转行做网站编辑,南昌做公司网站哪家好,推荐网站建设题目内容 实现一个 LRUCache 类#xff0c;三个接口#xff1a; 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 的键值对的 valueput(int key, int value) 向缓存中添加键值对 (key, value) 要求 get 和 put 的均摊时间复杂度为 O ( 1 ) O(1) O(1) 题解 对于 get 操作我们需要快速获取到 key 对应的键值对哈希表可以解决。 对于 put 操作我们需要快速 put 一个键值对也可以用哈希表解决。 但是问题在于我们 get 和 put 时需要维护键值对最近使用的情况。 这部分我们可以用双向链表维护每次操作一个键值对时将其从原来链表的位置中移除重新添加到链表头。定义链表头的数据是最近一次使用的链表尾是最近最少使用的。 对于哈希表键可以为 key 映射到一个链表结点 LRUNode LRUNode 中包括前后链表结点以及当前链表结点的 key 和 value 。 为什么我们要在链表结点中存储 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://www.hkea.cn/news/14509564/

相关文章:

  • 网站建设经费中山做网站建设联系电话
  • 深圳网站开发哪家服务专业品牌外贸网站建设
  • 一块钱涨1000粉网站硬件开发基础知识
  • 网站服务器如何选择北京物流网站建设
  • 博客网站开发环境wordpress页尾
  • 做经营网站怎么赚钱吗江苏州 网站制作
  • 承德网站建设广东省网站建设网站
  • 给前端做网站的图片叫什么软件网站建设 开票
  • 网站风格类型wordpress-5.6.20
  • 搭建网站有什么用赤峰做网站
  • 优化防疫措施南京seo按天计费
  • 建立一个自己的网站需要多少钱有什么网站是帮别人做设计的
  • 酷站海洛岳阳公司做网站
  • 制作网站用的域名常用网站名称大全
  • wordpress主题合并如何免费做网站优化
  • 河北省住房与建设厅网站网站查询seo
  • 合肥建设工程招聘信息网站仿站 做网站
  • 建站软件公司马鞍山做网站公司
  • 网站开发进度计划表WordPress发货
  • wordpress模板代码分析自己的网站什么做优化
  • 能看男女做那个的网站深圳品牌医疗网站建设
  • 营销型网站的建设规划建筑网址大全网站
  • 有没有专门做牛仔的网站商丘网站建设aliapp
  • 做练习题的网站wordpress菜单跳转到目录
  • 企业网站建设开发成本利润多少百度搜索网站
  • 网站建设中色无极php 家政网站
  • 企业网站托管排版设计商业网站建设案例
  • 怪兽网站模板服务器机柜
  • 黑龙江省建设会计协会网站建设网站需要展示什么区别
  • 地产公司网站建设方案怀化冰山涯IT网站建设公司