整理 LRU快取機制

2021-10-06 12:10:53 字數 3103 閱讀 7942

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 通過快取資料的鍵對映到其在雙向鍊錶中的位置。首先使用雜湊表進行定...