LRU Cache

LRU Cache_第1张图片

今天在看System Design的时候,发现cache是一个非常重要需要考虑的话题,于是准备温习一下。

一般做cache,我们都希望能够达到get, put in O(1) time, (如果缓存速度还慢干嘛还用它)。 

能够实现O(1) time get 的很明显就是HashMap, HashTable.

而能够实现Put O(1) time的,很容易就会想到List. 因为我们还要把不怎么用的东西给删掉,所以List更是一个好的选择。

但是最大的问题是,当我们使用完了一个东西以后, 这个东西就会变成most recent one, 所以, 我们需要设计一个有一点复杂的移动东西到Head 的功能。

定义一下: head 的话就是 比较常用的, tail比较不常用。

Also, 这个list似乎我们需要自己定义一个, 因为需要包含key, val的信息。



花了一个多小时 终于过了所有的test case。。。。。。

整个东西idea不是很难,但是总是会犯一些linklist上链接上的错误。面试时候写出一个完全bug free的感觉也不太可能。。。


一开始我写的HashMap只是包含key, val : HashMap

但是后来发现这么做的话,当要update一个已经存在的key的node 成为另一个val的时候,需要遍历整个List,然后再往前移动。 这样做的话这个cache基本就废了,于是我把node的reference存在HashMap里面。


LRU Cache_第2张图片


LRU Cache_第3张图片

move_to_head这里有太多的细节。。。

如果这个Node本事就在第一个的话,我们应该什么都不做的。不然的话,

本来 Head-A-B

会变成:

Head --A--A--B

因为我是先让head.next.next = target.next. 然后再插入target...

这个bug花了很久才找到,在不用编辑器的话要更久。

LRU Cache_第4张图片
LRU Cache_第5张图片

你可能感兴趣的:(LRU Cache)