LRU Cache

今天在看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<Integer, Integer>

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



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

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

本来 Head-A-B

会变成:

Head --A--A--B

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容