zoukankan      html  css  js  c++  java
  • LRU Cache

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

    get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
    set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

      1 struct node{
      2     int key;
      3     int value;
      4     node* pre;
      5     node* next;
      6 };
      7 class LRUCache{
      8 private:
      9      int count;
     10      int size;
     11      map<int,node*> mp;
     12      node* cachehead;
     13      node* cachetail;
     14 public:
     15     LRUCache(int capacity) {
     16         count=0;
     17         size=capacity;
     18        
     19         cachehead=NULL;
     20         cachetail=NULL;
     21     }
     22     
     23     int get(int key) {
     24         if(cachehead==NULL) return -1;
     25         map<int,node*>::iterator it=mp.find(key);
     26         if(it==mp.end())
     27             return -1;
     28         else
     29         {
     30             node* p=it->second;
     31             pushfront(p);
     32                 //p->pre->next=p->next;
     33                 /*if(p->next!=NULL)
     34                     p->next->pre=p->pre;
     35                 mp.erase(p->key);
     36                 p->next=cachehead;
     37                 p->pre=cachehead->pre;
     38                 cachehead->pre=p;
     39                 cachehead=cachehead->pre;
     40                 mp[cachehead->key]=cachehead;*/
     41             
     42         }
     43         return cachehead->value;
     44     }
     45     
     46     void set(int key, int value) {
     47         if(cachehead==NULL)
     48         {
     49             cachehead=(node*)malloc(sizeof(node));
     50             cachehead->key=key;
     51             cachehead->value=value;
     52             cachehead->pre=NULL;
     53             cachehead->next=NULL;
     54             mp[key]=cachehead;
     55             cachetail=cachehead;
     56             count++;
     57         }
     58         else
     59         {
     60             map<int,node*>::iterator it=mp.find(key);
     61             if(it==mp.end())
     62             {
     63                 if(count==size)
     64                 {
     65                     if(cachehead==cachetail&&cachehead!=NULL)
     66                     {
     67                         mp.erase(cachehead->key);
     68                         cachehead->key=key;
     69                         cachehead->value=value;
     70                         mp[key]=cachehead;
     71                     }
     72                     else
     73                     {
     74                         node* p=cachetail;
     75                         cachetail->pre->next=cachetail->next;
     76                         cachetail=cachetail->pre;
     77                         
     78                         mp.erase(p->key);
     79                         
     80                         p->key=key;
     81                         p->value=value;
     82                         
     83                         p->next=cachehead;
     84                         p->pre=cachehead->pre;
     85                         cachehead->pre=p;
     86                         cachehead=p;
     87                         mp[cachehead->key]=cachehead;
     88                     }
     89                     
     90                 }
     91                 else
     92                 {
     93                     node* p=(node*)malloc(sizeof(node));
     94                     p->key=key;
     95                     p->value=value;
     96                     p->next=cachehead;
     97                     p->pre=cachehead->pre;
     98                     cachehead->pre=p;
     99                     cachehead=p;
    100                     mp.erase(p->key);
    101                     mp[cachehead->key]=cachehead;
    102                     count++;
    103                 }
    104             }
    105             else
    106             {
    107                 
    108                 node* p=it->second;
    109                 p->value=value;
    110                 pushfront(p);
    111              /*   mp.erase(p->key);
    112                 
    113                 p->pre->next=p->next;
    114                 if(p->next!=NULL)
    115                     p->next->pre=p->pre;
    116                 p->value=value;
    117                 p->next=cachehead;
    118                 p->pre=cachehead->pre;
    119                 cachehead->pre=p;
    120                 cachehead=cachehead->pre;
    121                 mp[cachehead->key]=cachehead;*/
    122             }
    123         }
    124         
    125             
    126     }
    127     void pushfront(node* cur)
    128     {
    129         if(count==1)
    130             return;
    131         if(cur==cachehead) return;
    132         if(cur==cachetail)
    133             cachetail=cur->pre;
    134         cur->pre->next=cur->next;
    135         if(cur->next!=NULL)
    136           cur->next->pre=cur->pre;
    137         cur->next=cachehead;
    138         cur->pre=cachehead->pre;
    139         cachehead->pre=cur;
    140         cachehead=cur;
    141     }
    142 
    143 };
  • 相关阅读:
    Bounded Context
    Unity3D研究院之IOS本地消息通知LocalNotification的使用(六十七)
    SVN服务器搭建和使用
    进度条
    XQuery获取节点的属性名与值
    AnimatorStateInfo
    Unity3D 中脚本执行的先后顺序
    Unity里面的自动寻路(二)
    Unity里面的自动寻路(一)
    java遍历文件夹两种方式
  • 原文地址:https://www.cnblogs.com/zl1991/p/4673936.html
Copyright © 2011-2022 走看看