链表:LRU缓存

鼠扑  金牌会员 | 2024-11-7 10:43:16 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 926|帖子 926|积分 2778

LeetCode146 LRU缓存



  1. class Node{
  2. public:
  3.     int key;
  4.     int value;
  5.     Node* pre;
  6.     Node* next;
  7.     Node(int k=0,int v=0):key(k),value(v){}
  8. };
  9. class LRUCache {
  10. private:
  11.     int capacity;
  12.     Node* dummy; //哨兵节点
  13.     unordered_map<int,Node*> key_node;
  14.     //删除一个节点(抽出一本书)
  15.     void remove(Node* x){
  16.         x->next->pre=x->pre;
  17.         x->pre->next=x->next;
  18.     }
  19.     //在链表头添加一个节点(把一本书放在最上面)
  20.     void push_front(Node* x){
  21.         x->pre=dummy;
  22.         x->next=dummy->next;
  23.         dummy->next=x;
  24.         x->next->pre=x;   
  25.     }
  26.     //获取key对应的节点, 同时把节点移到链表头部
  27.     Node* get_node(int key){
  28.         auto it=key_node.find(key);
  29.         if(it==key_node.end()){//没有这个关键值(这本书)
  30.             return nullptr;
  31.         }
  32.         Node* node=it->second;
  33.         remove(node); //将这本书抽出来
  34.         push_front(node); //放在最上面
  35.         return node;
  36.     }
  37. public:
  38.     LRUCache(int capacity):capacity(capacity),dummy(new Node()) {
  39.         dummy->next=dummy;
  40.         dummy->pre=dummy;
  41.     }
  42.    
  43.     int get(int key) { //如果关键字key存在于缓存中,则返回关键字的值,否则返回-1
  44.         Node* node=get_node(key);
  45.         if(node==nullptr) return -1;
  46.         return node->value;
  47.     }
  48.    
  49.     void put(int key, int value)
  50.         Node* node=get_node(key);
  51.         if(node!=nullptr){//关键字key已存在,变更其数据值value
  52.             node->value=value;
  53.             return;
  54.         }
  55.         else{ //如果不存在,则向缓存中插入该组 key-value。如果插入操作导致关键字数量超过 capacity ,则应该逐出最久未使用的关键字。
  56.             Node* new_node=new Node(key,value); //新书
  57.             key_node[key]=new_node;
  58.             push_front(new_node); //放在最上面
  59.             if(key_node.size()>capacity){ //书太多了
  60.                 Node* back_node=dummy->pre; //找到最后一本书
  61.                 key_node.erase(back_node->key);
  62.                 remove(dummy->pre); //去掉最后一本书
  63.                 delete back_node; //释放内存
  64.             }
  65.         }
  66.     }
  67. };
  68. /**
  69. * Your LRUCache object will be instantiated and called as such:
  70. * LRUCache* obj = new LRUCache(capacity);
  71. * int param_1 = obj->get(key);
  72. * obj->put(key,value);
  73. */
复制代码
时间复杂度:全部操作的时间复杂度均为O(1)
空间复杂度:O(min(p, capacity)),p为put的调用次数

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表