zoukankan      html  css  js  c++  java
  • leetcode146 LRU 缓存机制

    思路:

    双向链表+哈希表。

    实现:

     1 class node
     2 {
     3 public:
     4     int key, val;
     5     node* prev, *next;
     6     node(int k, int v): key(k), val(v) { prev = NULL; next = NULL; }
     7 };
     8 class LRUCache
     9 {
    10     int _capacity = 0;
    11     unordered_map<int, node*> mp;
    12     node* dummy_head = NULL, *dummy_tail = NULL;
    13     int cnt = 0;
    14 public:
    15     LRUCache(int capacity): _capacity(capacity)
    16     {
    17         dummy_head = new node(-1, -1);
    18         dummy_head->next = new node(-1, -1);
    19         dummy_tail = dummy_head->next;
    20         dummy_tail->prev = dummy_head;
    21     }
    22             
    23     void move_back(node* tmp)
    24     {
    25         node* p = tmp->prev, *n = tmp->next;
    26         p->next = tmp->next; n->prev = tmp->prev;
    27         node* fuck = dummy_tail->prev;
    28         fuck->next = tmp;
    29         tmp->prev = fuck;
    30         dummy_tail->prev = tmp;
    31         tmp->next = dummy_tail;
    32     }
    33 
    34     void erase()
    35     {
    36         node* tmp = dummy_head->next, *n = tmp->next;
    37         dummy_head->next = n;
    38         n->prev = dummy_head;
    39         tmp->next = tmp->prev = NULL;
    40         mp.erase(tmp->key);
    41         delete(tmp); tmp = NULL;
    42     }
    43 
    44     int get(int key)
    45     {
    46         if (mp.count(key))
    47         {
    48             node* tmp = mp[key];
    49             move_back(tmp);
    50             return mp[key]->val;
    51         }
    52         return -1;
    53     }
    54                         
    55     void put(int key, int value)
    56     {
    57         if (mp.count(key))
    58         {
    59             node* tmp = mp[key];
    60             tmp->val = value;
    61             move_back(tmp);
    62         }
    63         else
    64         {
    65             if (cnt == _capacity) { erase(); cnt--; }
    66             node* p = dummy_tail->prev;
    67             node* tmp = new node(key, value);
    68             p->next = tmp; tmp->next = dummy_tail;
    69             dummy_tail->prev = tmp; tmp->prev = p;
    70             mp[key] = tmp;
    71             cnt++;
    72         }
    73     }
    74 };
    75 
    76 /**
    77  * Your LRUCache object will be instantiated and called as such:
    78  * LRUCache* obj = new LRUCache(capacity);
    79  * int param_1 = obj->get(key);
    80  * obj->put(key,value);
    81  */
  • 相关阅读:
    angular 项目 error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'
    chrome 总崩溃的正确解决方法
    angular 学习日志
    mongodb 3.4 学习 (二)命令
    mongodb 3.4 学习 (一) 安装
    python中文入库
    [转贴] 流量统计脚本
    监控系统开发的一些参考
    nagios centos7 rpm打包
    collectd配置
  • 原文地址:https://www.cnblogs.com/wangyiming/p/15239380.html
Copyright © 2011-2022 走看看