lru演算法就是快取淘汰演算法,例如計算機中的快取記憶體有限,在快取記憶體滿了的時候,需要清理不必要的資訊,為新資料留位置。這個時候就要判斷哪些資訊「有用」,哪些資訊可以被刪除。
lru 的全稱是 least recently used,它將最近使用的資訊當作「有用」,很久沒使用的資訊當作「無用」,當記憶體滿了時,優先刪除「無用」資訊。
運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果關鍵字 (key) 存在於快取中,則獲取關鍵字的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果關鍵字已經存在,則變更其資料值;如果關鍵字不存在,則插入該組「關鍵字/值」。當快取容量達到上限時,它應該在寫入新資料之前刪除最久未使用的資料值,從而為新的資料值留出空間。
就是使用雜湊表與雙向鍊錶的結合:
情況一:資料key存在於鍊錶中
1、當資料key被使用後,根據雜湊表查詢key在雙向鍊錶中的位置,將key提取到鍊錶的頭部(刪除並在鍊錶頭部新增node)
情況二:key不在鍊錶中,即key是新資料
1、將key新增到煉表表頭,key值加入雜湊表中
2、若記憶體已滿,也就是鍊錶空間已滿。刪除鍊錶最尾端node,將node.key從雜湊表中刪除。重複步驟1。
具體python**如下:
class
linknode
:#設定乙個空的雙向鍊錶
def__init__
(self, key=
0, value=0)
: self.key = key
self.value = value
self.
next
=none
self.prev =
none
class
lrucache
:def
__init__
(self, capacity:
int)
:#設定雜湊表與雙向鍊錶初始值
self.head = linknode(
)#設定鏈表偽頭部
self.tail = linknode(
)#設定鏈表偽尾部
self.head.
next
= self.tail
self.tail.prev = self.head
self.cache =
dict()
#建立雜湊表(字典)
self.capacity = capacity #設定快取容量
self.size =
0#鍊錶初始長度為0
defmovenode
(self, node)
:#定義刪除node的函式
node.prev.
next
= node.
next
node.
next
.prev = node.prev
deftohead
(self, node)
:#在表頭新增node的函式
node.
next
= self.head.
next
node.prev = self.head
self.head.
next
.prev = node
self.head.
next
= node
defdeletetail
(self)
:#在尾部刪除node
node = self.tail.prev
self.movenode(node)
return node
defmovetohead
(self, node)
:#將node移動到表頭(刪除node,並在表頭新增)
self.movenode(node)
self.tohead(node)
defget
(self, key:
int)
->
int:
#獲取資料value值
if key not
in self.cache:
#若不存在,則輸出-1
return-1
else
: node = self.cache[key]
#根據雜湊表查詢key
value = node.value #獲得value
self.movetohead(node)
#將最近使用的資料移動到表頭
return value
defput(self, key:
int, value:
int)
->
none
:#寫入資料
if key in self.cache:
#若資料存在
node = self.cache[key]
#通過雜湊表查詢key(位置)
node.value = value #更新node的值
self.movetohead(node)
#將該資料移到表頭(最近使用的位置)
else
: node = linknode(key,value)
#若資料不存在,建立新節點
self.cache[key]
= node #將key賦予雜湊表
self.tohead(node)
#將節點新增到表頭
self.size+=
1if self.size>self.capacity:
#若鍊錶大小超過規定記憶體
removed = self.deletetail(
)#刪除鍊錶尾部的節點
self.cache.pop(removed.key)
#刪除雜湊表中的該節點
self.size-=
1
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...
LRU快取機制
lru快取機制 最近最少使用 雙向鍊錶 雜湊表 不使用自帶 linkedhashmap 雙向鍊錶按照被使用的順序儲存了這些鍵值對,靠近頭部的鍵值對是最近使用的,而靠近尾部的鍵值對是最久未使用的。雜湊錶即為普通的雜湊對映 hashmap 通過快取資料的鍵對映到其在雙向鍊錶中的位置。首先使用雜湊表進行定...