缓存的大小有限。当缓存已满时,应清理哪些数据以及应保留哪些数据?这需要消除缓存策略才能决定。
有三种共同的策略:
这实际上是一个经典的算法面积问题。
描述:使用您拥有的数据结构,设计和实现LRU(最近使用的)缓存机制。
实施Lrucache类:
lrucache(int容量)使用正整数用作LRU CACHEN INT(INT键)的容量容量初始化如果密钥密钥在缓存中存在,则返回关键字的值,否则返回-1.void put(int键,键,键,int值)如果关键字已经存在,请更改其数据值;如果不存在关键字,请在组中插入“关键字值”。当缓存容量达到上限时,它应在编写新数据之前删除最长未使用的数据值,从而为新数据值留出空间。
高级:您可以在复杂的时间内完成这两个操作吗?
例子:
上述主题要求的时间复杂性需要插入和删除,需要o(1),以便必须快速搜索,快速插入,快速删除和序列。
该顺序是因为我们必须区分最近使用和未使用的数据,因此我们必须在缓存中找到搜索键。如果容量已满,则将删除最后一个数据;每个时间段都将数据插入团队的头部
因此,哪些数据结构同时符合上述条件?哈希表很快找到,但是数据不是固定的。链接列表分为顺序,插入和快速删除,但是搜索速度很慢,因此结合起来形成新的数据结构:哈希链接列表。
LRU缓存算法的核心数据结构是哈希链接列表,双向链接列表和哈希表。我们可以轻松地考虑linkedhashmap。
LRU缓存消除算法的实施原理具有链接列表的原则实际上非常简单。如前所述,为什么要使用linkedhashmap,即,一个两条链接列表+哈希表,以确保插入和查找时间的复杂性为o(1)。插入链接列表的时间复杂性也为o(1)。缓存要求当不满足容量时,最新使用的密钥将首先消除,因此我们需要确保队列有序有序,然后
根据上面的描述,我们可以实现LinkedHashMap来实现LRU缓存。
测试验证结果正常
作者:伯伦的版权属于作者。
原始链接:https://juejin.cn/post/7001901390024933384