LRU Cache

LRU Cache

定义

缓存算法(Least Recently Used)

核心思想

最近最少使用或最久未使用。当缓存空间不足时,它会优先淘汰最长时间没有访问的数据项

类比:图书馆的书架管理,经常被借阅的书放在最前面方便取用,而长期无人问津的书会被移到后面或下架

数据结构选择与设计

1)双向链表

1.用于维护元素的访问顺序,最近访问的元素放在链表头部,最久未被访问的放在尾部

2.支持O(1)时间复杂度的任意位置插入和删除

2)哈希表

1.用于快速查找键值对,实现O(1)的查找时间复杂度

2.键是用户提供的key,值是链表节点提供的迭代器

这种组合实现O(1)时间复杂度的get和put操作

类成员变量

private:
 	list>_list;//存储键值对的双向链表
	size_t _capacity;//缓存的最大容量
	unordered_map::iterator> _hashmap;//哈希表

get方法

int get(int key)
{
    auto hashit=_hashmap.find(key);
    if(hashit!=_hashmap.end())
    {
        auto hashit=hashit->second;
        pair kv=*listit;
        _list.erase(listit);
        _list.push_front(kv);
        _hashmap[key]=_list.begin();
        return kv.second;
    }
    else
    {
        return -1;
    }
}

put方法

void put(int key,int value)
{
    auto hashit=_hashmap.find(key);
    if(hashit==_hashmap.end())
    {
		if(_list.size()>=_capacity)
        {
			_hashmap.erase(_list.back().first);
            _list.pop_back();
        }
        _list.push_front(make_pair(key,value));
        _hashmap[key]=_list.begin();
    }
    else
    {
        auto listit=hash->second;
        pair kv=*listit;
        kv.second=value;
        _list.erase(listit);
        _list.push_front(kv);
        _hashmap[key]=_list.begin();
    }
}

你可能感兴趣的:(c++,c语言,算法,开发语言,python)