leetcode刷題之LRU快取

2022-09-10 16:33:28 字數 2295 閱讀 1635

關於此快取機制的介紹,參考國外大佬的文章

lru cache(least recently used cache)是最流行的快取驅逐策略之一。同時也是乙個非常常見的面試問題。

lru cache會跟蹤快取中的專案的被訪問順序。按照請求順序儲存專案。因此,最近使用的專案將位於快取的頂部,而最近最少用的專案將位於快取的尾部。在lru的策略之中,當快取已滿時,最長時間未使用的專案將被淘汰逐出快取。

依照上述。lru快取的原理、思路其實很簡單,如果快取的容量是n,意味著最近使用的n個或n個以內的專案儲存於該快取中。當快取佔滿,每次新增新專案,都會把最末尾的專案刪去,再往頂部放入最新專案。

為了更加方便的看出對快取的資料的儲存以及淘汰等操作,舉例說明

首先給定容量為3的乙個lru快取空間,然後依次請求訪問也即壓入資料a、b、c。我們可以看到快取的變化。快取從頂至底放入資料,由於c最後放入,所以位於快取最頂部。

接著,請求訪問b,b便會被至於快取的頂部,表示最近訪問

接著是請求訪問d,於是快取就放入了資料d,在放入之前要把最底端的資料移除,即a移除,以此保證lru容量的恆定。

lru的工作原理上面例子就清楚了,接下來看如何實現

對於lru快取的實現,就是leetcode上的這道題。

說一下思路:

題目談到key-value(關鍵字和值)的存在,讓我們想起了j**a的hashmap和python的dict

都是以鍵值對的形式儲存

先說hashmap,由於hashmap無法記錄訪問資料專案訪問的前後順序,這裡考慮使用雙鏈表來記錄順序。

用鍊錶不用陣列是因為對資料修改的時間複雜度為o(n)

使用hashmap和雙鏈表結合就避免了這個問題。

**如下:

class node 

}class lrucache

public void put(int key,int value) else

}public int get(int key) else

} private void deletlastnode()

private void movenodetotop(node node)

}

python就不需要像這樣用雜湊表和煉表結合,python有字典而且是有序字典

用ordereddict()作為lru緩衝區

利用ordereddict()的特殊方法popitem()可以實現對最前或者最後資料的操作

popitem()的選項last為ture時表示的是棧狀態,把剛放入的pop出去;last為false表示的是佇列的狀態,把最早放入的pop出去

from collections import ordereddict

class lrucache:

def __init__(self, capacity:int):

self.capacity = capacity

self.cache = ordereddict()

self.size = 0

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

if key in self.cache:

value = self.cache[key]

del self.cache[key]

self.cache[key] = value

return value

else:

return -1

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

if key in self.cache:

del self.cache[key]

self.cache[key] = value

elif self.size >= self.capacity:

self.cache.popitem(last=false)

else:

self.size +=1

self.cache[key] = value

學渣帶你刷Leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰已經存在,則變更其資料值...

LeetCode刷題之T146LRU快取機制

這次講解的題目是leetcode刷題之t146lru快取機制 首先我們先看下題目 這道題的思路是使用linkedhashmap進行k v鍵值對,首先我們知道linkedhashmap是乙個有序的hashmap,利用其有序性,將最近操作的key取出,放到linkedhashmap的最後邊。接下來上 c...

Leetcode刷題之括號

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...