146. LRU Cache
題目網址:https://leetcode.cn/problems/lru-cache/
題意:設計並實現一個滿足 LRU(Least Recently Used)的資料結構。
實現
LRUCache
class:
LRUCache(int capacity)
:以capacity
初始化 LRU cache 的大小。int get(int key)
:若key
存在於 cache 中, 則返回其對應的val
, 否則返回1
。void put(int key, int value)
:
- 若
key
已經存在, 則變更其value
- 若不存在, 則將該組
key-value
insert 到 cache 中- 若 insert 操作導致 pair 數量超過
capacity
, 則移除最久未使用的key-value
pair注意:
get()
和put()
必須是 $O(1)$ time
Solution:
想法:利用 hash table + list, 其中
cache
用來存放所有的key
, 用來記錄哪個key
最近被使用、最久沒被使用。用 list 而非 forward_list 的原因是:「當get()
訪問的是處於中間位置的節點時, 可以直接獲取其前一個節點和後一個節點, 從而省去了遍歷整個 linked list的時間」。若用 forward_list, 要獲取前一個節點和後一個節點必須從 linked list 的 head 開始遍歷
cache.begin()
: 最久未用的 key--cache.end()
: 最近使用的 key而
key2val
和key2iter
分別存放key
所對應到的val
和iterator
get(key)
:
- 若
key
已在cache
中, 則將其放到cache
尾部- 若
key
不在cache
中, 則返回1
put(key, value)
:
- 若
key
已在cache
中, 則更新其對應的 val- 若
key
不在cache
中, 則要新增該 key。若capacity
已滿, 則要移除cache.begin()
class LRUCache { |
- time:$O(1)$
- space:$O(capacity)$ ➔
cache
,key2val
,key2iter
的元素個數不超過capacity
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論