当前位置: 首页 > 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://www.tj-hxxt.cn/news/5202.html

相关文章:

  • 青岛如何做网站seo网站案例分析
  • 网站开发哪个城市发展好百度关键词推广怎么做
  • 站长工具seo综合查询网seo培训价格
  • 网站建设为什么不给源代码自助建站系统个人网站
  • 商丘网商丘网络第一媒体优化营商环境 提升服务效能
  • 品牌网站建设市场分析百度推广登录平台网址
  • 广告模板网站百度问答优化
  • 360做网站多少钱一年长春网站优化咨询
  • 建筑行业招聘网站推荐小网站
  • 福州建网站 做网页宁波搜索引擎优化seo
  • 动态表情包制作软件appseo收录查询
  • web网站开发实训河北百度推广seo
  • 中文网站建设seo推广优化多少钱
  • 上街区做网站广告发布平台app
  • 专业的营销型网站公司站长工具seo综合查询怎么关闭
  • 网站建设倒计时代码推广计划方案
  • 青岛建站合作百度联盟推广
  • 济南做网站的公司有哪些站长网站统计
  • 网站建设题目网站关键词排名手机优化软件
  • 沈阳网站模板产品推广策划书
  • 白城北京网站建设郑州企业网站seo
  • 网站建设费用计入哪个会计科目企业营销型网站策划
  • 没有公司可以做网站吗百度seo技术
  • 网站的查询系统怎么做专业网站优化
  • o2o网站设计方案山东济南seo整站优化公司
  • 东南亚做网站 什么语言技术培训学校机构
  • 家乡政府网站建设评价怎么写网站建设的步骤
  • 台州seo网站排名东莞关键词seo优化
  • 如何推销企业建设网站网站快速排名案例
  • 全flash网站欣赏关键词挖掘工具爱网