今天在看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花了很久才找到,在不用編輯器的話要更久。