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

四川网站建设外包最浪漫的编程代码

四川网站建设外包,最浪漫的编程代码,互联网营销和网络营销一样吗,应用之星 wordpressleetcode: LRU 缓存 LRU 全称为 Least Recently Used,最近最少使用,常常用于缓存机制,比如 cpu 的 cache 缓存,使用了 LRU 算法。LRU 用于缓存机制时,关键的是当缓存满的时候有新数据需要加载到缓存的,这个…

leetcode: LRU 缓存

LRU 全称为 Least Recently Used,最近最少使用,常常用于缓存机制,比如 cpu 的 cache 缓存,使用了 LRU 算法。LRU 用于缓存机制时,关键的是当缓存满的时候有新数据需要加载到缓存的,这个时候需要淘汰谁的问题。

如下图所示,表示 LRU 算法的过程。假如有一个缓存,共有 4 个存储空间,按访问时间进行排序,最左边的存储空间存储的是最近访问的数据,最右边的存储空间存储的是最长时间没有访问的数据。

(1)一开始,缓存是空的,这个时候向缓存中放入一个数据 100,100 放到最左边的存储空间

(2)向缓存中放入一个数据 50,此时缓存有空余空间,所以将已有的数据向后移动,将 50 放到缓存的最左边

(3)向缓存中放入数据 500, 步骤与上一步相同

(4)向缓存中放入数据 1000,步骤与上一步相同

(5)读取数据 100,读取之后 100 就是最后访问的数据了,所以将 100 移到缓存的最左边,其它数据依次向后移动

(6)向缓存中放入数据 1,此时缓存是满的,所以需要先淘汰一个数据,从访问时间来看,最后一次访问 50 的间隔时间最长,也就是排在最右边的数据,所以将 50 淘汰,其它数据向后移动,将新数据 1 放入最左边的位置

如下是题目描述,题目的最后要求 get() 和 put() 的时间复杂度都要是 O(1) 的。使用数组来表示缓存难以满足 O(1) 的要求,因为在 put 或者 get 的时候,会引起数组数据的移动,数组中数据的移动时间复杂度是 O(n) 的。所以需要使用链表来表示缓存,当访问一个数据的时候需要将当前这个数据从原来的位置上删除,然后加到链表的头部,删除一个节点的话,需要将这个节点的前一个节点和下一个节点连接起来,如果使用单向链表的话,那么只能找到这个节点的下一个节点,找不到上一个节点,所以需要使用双向链表。

 

(1)使用双向循环链表来表示缓存

(2)为了满足时间复杂度是 O(1) 的要求,使用 data_addr_ 数组来保存节点的地址,数组的下标是 key,题目中说明了 key 的取值范围是 [0, 10000],所以可以使用一个数组来表示。使用 map 也不能保证时间复杂度是 O(1) 的,map 一般使用红黑树来实现,时间复杂度是 O(logn) 的。把数组的下标当 key,数组元素的值就是值,数组本省也可以当做一个简单的 map 来使用。

(3)当 put 数据时,要进行判断现在缓存是不是满了,如果满的话需要删除最久没有访问的数据,head_->next 保存最新访问的数据,head_->prev 保存最久没有访问的数据

struct Node {int key;int value;struct Node *next;struct Node *prev;
};class LRUCache {
public:LRUCache(int capacity) {capacity_ = capacity;head_ = new Node();head_->next = head_;head_->prev = head_;}int get(int key) {Node *node = data_addr_[key];if (node == nullptr) {return -1;}ListUnLink(node);ListLinkHead(node);return node->value;}void put(int key, int value) {if (data_addr_[key] != nullptr) {       Node *node = data_addr_[key];ListUnLink(node);node->value = value;ListLinkHead(node);} else {Node *new_node = new Node();new_node->key = key;new_node->value = value;new_node->next = nullptr;new_node->prev = nullptr;if (count_ == capacity_) {Node *to_delete = head_->prev;ListUnLink(to_delete);data_addr_[to_delete->key] = nullptr;delete to_delete;count_--;}ListLinkHead(new_node);data_addr_[key] = new_node;count_++;}}void ListLinkHead(struct Node *ele) {ele->next = head_->next;ele->next->prev = ele;head_->next = ele;ele->prev = head_;}void ListUnLink(struct Node *ele) {ele->prev->next = ele->next;ele->next->prev = ele->prev;}private:int capacity_ = 0;int count_ = 0;Node *data_addr_[10001] = {nullptr};struct Node *head_ = nullptr;};
http://www.yayakq.cn/news/195714/

相关文章:

  • 昆山网站优化建设网站三大标签设置
  • 网页设计的工作流程seo案例分析100例
  • 网站开发员郑州市主城区
  • 国安中建建设集团网站网站建设 推广什么意思
  • 厦门网站建设培训吉林大学学风建设专题网站
  • 网上做任务网站网站seo方案策划书
  • 网站模板 psd帝国网站管理 上一条 下一条 链接 信息id 信息发布时间
  • 手机网站搭建教程网上举报平台
  • 网站建设的基础是什么意思龙岩做网站开发多久时间
  • 网站排名提升工具免费惠州网络运营
  • 怎么才能打开一些网站有域名怎么建立网站
  • 淘宝联盟怎么建设网站青岛网络公司老板是谁
  • 小兵cms个人网站模板网站密度
  • 茶叶网站flash模板免费下载建设企业网站就等于开展网络营销
  • 网站开发应用价值网页二级网站怎么做
  • qq空间的网站跨境电商千万别做亚马逊
  • 移动端网站排名网站服务器 数据库服务器
  • pc端网站开发技术dede小说网站模板下载
  • 中小型电子商务网站门户网站的意义
  • anydrag建站专家网站建设系统微信推广平台怎么做
  • 深圳网站建设深正互联天元建设集团有限公司第八建筑工程公司
  • 0经验自己做网站网站交互效果
  • jsp门户网站开发网络营销网站开发
  • 有没有免费建网站建网站用什么服务器
  • 网站极速备案要塑造什么品牌加快建设博物馆群
  • 奉节网站建设空间设计专业
  • linux 做网站数据库自助建站最大
  • jquery 网站后台模板东营建设有限公司
  • 网站详情页艺术字怎么做的河北石家庄网络公司
  • 建设银行网站电脑版重庆住房城乡建设厅官方网站