Leetcode#146. LRU Cache
Problem
Design a data structure that follows the constraints of a Least Recently Used (LRU) cache.
Implement the LRUCache
class:
LRUCache(int capacity)
Initialize the LRU cache with positive sizecapacity
.int get(int key)
Return the value of thekey
if the key exists, otherwise return1
.void put(int key, int value)
Update the value of thekey
if thekey
exists. Otherwise, add thekey-value
pair to the cache. If the number of keys exceeds thecapacity
from this operation, evict the least recently used key.
The functions get
and put
must each run in O(1)
average time complexity.
Example 1:
1 | Input |
Constraints:
1 <= capacity <= 3000
0 <= key <= 10^4
0 <= value <= 10^5
- At most
2 * 10^5
calls will be made toget
andput
.
Solve
題目給的 LRU 是一個儲存器(緩存器)
有放入 拿出功能
放入時,如果超過容量,就要把最久沒有被使用的資料移除
我這邊表示 cache 前後 關係為 舊資料,後面為新資料
1 | ex: |
1 | # 初始化一個 LRU Cache 容量為 2 |
題目要求的 Hash Table Doubly-Linked List
1 | class Node: |
但python dict 可以變有序 !!!
可以像 list 這樣做
但list 搜尋是用 for
時間複雜為O(n),所以失敗
用list for迴圈,但效能上有問題 O(n) (失敗)
1 | class LRUCache: |
時間複雜度: O(n)
邏輯沒錯 但是 時間跑太久
利用iter(dict) 為有序的
(python 3.7~)
1 | class LRUCache: |
在 Python 3.7 之後,**dict
** 在保留插入順序方面是有序的。因此,**iter(self.dict)
** 返回的迭代器將按照鍵(key)插入的順序來迭代字典中的鍵。
時間複雜度:O(1)
- iterator : 迭代器是 Python 中一種特殊的物件,它允許遍歷(迭代)容器中的元素,而不需要事先知道容器的結構。字典、列表、元組等可迭代的容器都可以通過
iter()
函數轉換成迭代器。 iter()
函數:用於將可迭代的容器(如字典、列表、元組等)轉換成迭代器當使用迭代器時,我們可以使用next()
函數依次取得容器中的元素。
- **
iter(self.dict)
**:這一部分將字典self.dict
轉換為一個迭代器。這是因為字典本身並不是一個迭代器,但我們希望能夠逐一訪問其中的鍵。 - **
next(iter(self.dict))
**:這一部分使用next()
函數取得迭代器iter(self.dict)
中的下一個元素(這裡是字典中的第一個鍵)。換句話說,它返回字典中的第一個鍵。
偷吃步、直接載入有序的dict
1 | from collections import OrderedDict |
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Imisky!
評論