LRU算法实现

LRU算法实现

介绍

LRU算法(最近最少使用)是最常用的缓存回收算法。主要的实现方式就是带哈希表的双向链表。

  • 哈希能够帮我们快速定位我们需要的缓存页面
  • 双向链表提供的顺序性能够让我们选择回收最少使用的页面。
  • 双向链表可以在任意节点插入,便于移动缓存页面的顺序。

代码

/**
 * @file LRU.cpp
 * @author qingfu
 * @brief a implement of LRUcache 
 * @version 0.1
 * @date 2021-04-05
 * 
 * @copyright Copyright (c) 2021
 * 
 */
#include <unordered_map>
#include <iostream>

using namespace std;

struct Node {
    int key,val;
    Node *prev,*next;
    Node():key(-1),val(-1),prev(nullptr),next(nullptr){}
    Node(int k,int v):key(k),val(v),prev(nullptr),next(nullptr) {}
};

class LRUCache{
public:
    LRUCache()=delete;
    LRUCache(const int capacity):_capacity(capacity),_size(0),_head(new Node()),_tail(new Node()){
        _head->next=_tail;
        _tail->prev=_head;
    }
    int get(int key){
        if(!_cache.count(key)){
            return -1;
        }
        Node *node=_cache[key];
        moveTohead(node);
        return node->val;

    }
    void put(int key,int value){

        if(_cache.count(key)){
            Node *node=_cache[key];
            node->val=value;
            moveTohead(node);
        }
        else{
            Node *node=new Node(key,value);
            addToHead(node);
            _cache[key]=node;
            _size++;
            if(_size>_capacity){
                Node *removed=removeFromTail();
                _cache.erase(removed->key);
                delete removed;
                _size--;
            }
        }
    }

private:
    void addToHead(Node *node){
        _head->next->prev=node;
        node->next=_head->next;
        _head->next=node;
        node->prev=_head;
    }
    Node* removeFromTail(){
        Node *pre=_tail->prev;
        remove(pre);

        return pre;
    }
    void remove(Node *node){
        node->prev->next=node->next;
        node->next->prev=node->prev;
        node->prev=nullptr;
        node->next=nullptr;
    }
    void moveTohead(Node *node){
        remove(node);
        addToHead(node);
    }

private:
    Node *_head;
    Node *_tail;
    int _size;
    const int _capacity;
    unordered_map<int,Node*> _cache;
};

int main(){
    LRUCache *cache=new LRUCache(4);
    cache->put(1,2);
    cache->put(3,4);
    cache->put(5,6);
    cache->put(7,8);
    cout<<cache->get(1)<<endl;
    cout<<cache->get(3)<<endl;
    cout<<cache->get(5)<<endl;
    cout<<cache->get(7)<<endl;
    cout<<cache->get(9)<<endl;
    cache->put(1,0);
    cout<<cache->get(1)<<endl;
    cache->put(9,10);
    cout<<cache->get(3)<<endl;
    cout<<cache->get(9)<<endl;

    return 0;



}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务