LRU(Least Recently Used)最新最少使用,缓存机制之一。

    1. class LRUCache {
    2. public:
    3. struct node {
    4. int val;
    5. node *prev;
    6. node *next;
    7. node(int value):val(value),prev(NULL),next(NULL){}
    8. };
    9. int cap;
    10. int cur;
    11. map<int, node*>cachetable;
    12. node *head;
    13. node *tail;
    14. void moveNodeIntoHead(int key)
    15. {
    16. node* tmp = head->next;
    17. if(tmp == cachetable[key])
    18. return;
    19. node* prevnode = cachetable[key]->prev;
    20. node* nextnode = cachetable[key]->next;
    21. prevnode->next = nextnode;
    22. nextnode->prev = prevnode;
    23. head->next = cachetable[key];
    24. cachetable[key]->prev = head;
    25. cachetable[key]->next = tmp;
    26. tmp->prev = cachetable[key];
    27. return;
    28. }
    29. void appendNodeIntoFront(int key, int value)
    30. {
    31. cachetable[key] = new node(value);
    32. node* tmp = head->next;
    33. head->next = cachetable[key];
    34. cachetable[key]->next = tmp;
    35. tmp->prev = cachetable[key];
    36. cachetable[key]->prev = head;
    37. }
    38. void removeNodeFromTail()
    39. {
    40. node* lastnode = tail->prev;
    41. node* prevnode = lastnode->prev;
    42. lastnode->val = INT_MAX;
    43. prevnode->next = tail;
    44. tail->prev = prevnode;
    45. }
    46. LRUCache(int capacity) {
    47. cachetable.clear();
    48. cap = capacity;
    49. cur = 0;
    50. head = new node(0);
    51. tail = new node(0);
    52. head->next = tail;
    53. tail->prev = head;
    54. }
    55. int get(int key) {
    56. if(cachetable.find(key) != cachetable.end() && cachetable[key]->val != INT_MAX)
    57. {
    58. moveNodeIntoHead(key);
    59. return head->next->val;
    60. }
    61. return -1;
    62. }
    63. void put(int key, int value) {
    64. if(cachetable.find(key) != cachetable.end() && cachetable[key]->val != INT_MAX)
    65. {
    66. moveNodeIntoHead(key);
    67. head->next->val = value;
    68. }
    69. else
    70. {
    71. if (cur < cap)
    72. {
    73. appendNodeIntoFront(key, value);
    74. cur++;
    75. }
    76. else
    77. {
    78. removeNodeFromTail();
    79. appendNodeIntoFront(key, value);
    80. }
    81. }
    82. }
    83. };

    LFU(Least Frequently Used)最不经常使用,缓存算法之一。

    class LFUCache {
        int cap;
        int size;
        int minFreq;
        unordered_map<int, pair<int, int>> m; //key to {value,freq};
        unordered_map<int, list<int>::iterator> mIter; //key to list iterator;
        unordered_map<int, list<int>>  fm;  //freq to key list;
    public:
        LFUCache(int capacity) {
            cap=capacity;
            size=0;
        }
    
        int get(int key) {
            if(m.count(key)==0) return -1;
    
            fm[m[key].second].erase(mIter[key]);
            m[key].second++;
            fm[m[key].second].push_back(key);
            mIter[key]=--fm[m[key].second].end();
    
            if(fm[minFreq].size()==0 ) 
                  minFreq++;
    
            return m[key].first;
        }
    
       void set(int key, int value) {
            if(cap<=0) return;
    
            int storedValue=get(key);
            if(storedValue!=-1)
            {
                m[key].first=value;
                return;
            }
    
            if(size>=cap )
            {
                m.erase( fm[minFreq].front() );
                mIter.erase( fm[minFreq].front() );
                fm[minFreq].pop_front();
                size--;
            }
    
            m[key]={value, 1};
            fm[1].push_back(key);
            mIter[key]=--fm[1].end();
            minFreq=1;
            size++;
        }
    };