LRU快取 基礎演算法

2021-10-08 23:35:12 字數 2479 閱讀 1733

設計和構建乙個「最近最少使用」快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值(允許你插入和檢索特定鍵對應的值),並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。

它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。

獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。

寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。

示例:lrucache cache = new lrucache( 2 /* 快取容量 */ );

cache.put(1, 1);

cache.put(2, 2);

cache.get(1);       // 返回  1

cache.put(3, 3);    // 該操作會使得金鑰 2 作廢

cache.get(2);       // 返回 -1 (未找到)

cache.put(4, 4);    // 該操作會使得金鑰 1 作廢

cache.get(1);       // 返回 -1 (未找到)

cache.get(3);       // 返回  3

cache.get(4);       // 返回  4

**:

# -*- coding: utf-8 -*-

"""created on tue aug 4 11:29:38 2020

@author: wowlnan

@github:

@csdn:

"""import time

class lrucache:

def __init__(self, capacity: int):

self.capacity=capacity

self.cache={}

self.access={}

def get(self, key: int) -> int:

if self.cache==none or self.cache=={}:

return -1

try:

value=self.cache.get(key, -1)

if value!=-1:

self.access[key]=time.time()

return value

except:

return -1

def put(self, key: int, value: int) -> none:

if len(self.cache)>=self.capacity:

if self.get(key)!=-1:

self.cache[key]=value

self.access[key]=time.time()

else:

acs=self.access.items()

last_access=none

last_key=none

for o in acs:

if last_key==none and last_access==none:

last_access=o[1]

last_key=o[0]

elif last_access>o[1]:

last_access=o[1]

last_key=o[0]

del self.cache[last_key]

del self.access[last_key]

self.cache[key]=value

self.access[key]=time.time()

else:

self.cache[key]=value

self.access[key]=time.time()

# your lrucache object will be instantiated and called as such:

# obj = lrucache(capacity)

# param_1 = obj.get(key)

# obj.put(key,value)

s=lrucache(2)

s.put(1,1)

s.put(2,2)

print(s.get(1))

s.put(3,3)

print(s.get(2))

s.put(4,4)

print(s.get(1))

print(s.get(3))

print(s.get(4))

print(s.cache)

lru快取遵循「最近最少使用」的基本準則。「使用」的概念包含訪問和修改等。這裡直接使用時間戳來描述規則。這樣的做法比較簡單基礎。複雜點的應該加入使用次數。進行put操作超出指定的元素長度時,時間複雜度理論是o(n)。

LRU快取演算法

為什麼要有lru快取演算法 我們用快取來存放以前讀取的資料,而不是直接丟掉,這樣,再次讀取的時候,可以直接在快取裡面取,而不用再重新查詢一遍,這樣系統的反應能力會有很大提高。但是,當我們讀取的個數特別大的時候,我們不可能把所有已經讀取的資料都放在快取裡,畢竟記憶體大小是一定的,我們一般把最近常讀取的...

LRU演算法 快取演算法

lru演算法主要用於快取演算法,在節省資源的情況下提高資料訪問效率 篩選熱點資料 對不斷訪問的資料進行篩選淘汰,剩下的資料就為熱點資料 相對而言,釋放最近未被訪問資料占用的空間也是採用lru演算法。1 lru的實現 鍊錶 使用乙個鍊錶儲存快取資料 1 新資料插入到鍊錶頭部 2 每當快取命中 即快取資...

快取淘汰演算法 LRU

1.lru 1.1.原理 lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 1.2.實現 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 1.新資料插入到鍊錶頭部 2....