第 146 题「LRU缓存机制」(手撸LRU算法)

首选用比较通俗的语言来讲一讲LRU算法,那手机内存来举例子,就是当内存超出了手机设置的内存后,就要删除了内存,那删除那部分内存呢,LRU算法就是提供一个策略来选择那些需要缓存需要被删除掉,就是谁隔得最远就删除掉谁。

LRU算法的描述

怎么描述呢,其实上述描述的就是LRU算法要实现的逻辑只不多是人能理解的活,那么如何从写代码的角度来说一下实现LRU算法的逻辑呢,这个时候就要通过基础的数据结构结合来讲LRU再程序当中是如何实现上述所说的功能的;就是一个队列加上一个Hash链表就完事了

因为要删除掉很久的数据,那不就是队列中的对尾元素嘛。
所以LRU的代码实现就变成了用代码如何去操作队列的中的元素,只要操作逻辑结果符合我们想要的结果,那就没问题。
而哈希链表就是存储键值对的,因为元素也会更新,哈希链表的作用就是再这里。

// 缓存容量为 2
LRUCache cache = new LRUCache(2);
// 你可以把 cache 理解成一个队列
// 假设左边是队头,右边是队尾
// 最近使用的排在队头,久未使用的排在队尾
// 圆括号表示键值对 (key, val)

cache.put(1, 1);
// cache = [(1, 1)]

cache.put(2, 2);
// cache = [(2, 2), (1, 1)]

// 返回 1
cache.get(1);
// cache = [(1, 1), (2, 2)]
// 解释:因为最近访问了键 1,所以提前至队头
// 返回键 1 对应的值 1

cache.put(3, 3);
// cache = [(3, 3), (1, 1)]
// 解释:缓存容量已满,需要删除内容空出位置
// 优先删除久未使用的数据,也就是队尾的数据
// 然后把新的数据插入队头

// 返回 -1 (未找到)
cache.get(2);
// cache = [(3, 3), (1, 1)]
// 解释:cache 中不存在键为 2 的数据

cache.put(1, 4);    
// cache = [(1, 4), (3, 3)]
// 解释:键 1 已存在,把原始值 1 覆盖为 4
// 不要忘了也要将键值对提前到队头

OK了,随这个算法我就了解到这里了,要是面试问到我,我就回答到这里了,接下我就说我不会了。等以后我时间充裕了,在回来继续,有时候没办法,时间紧张,就得抓大放小。

LRU算法设计

LRU代码实现

你可能感兴趣的:(力扣,缓存,数据结构,算法)