力扣 146LRU快取機制(雙向鍊錶)

2021-10-08 11:13:39 字數 2315 閱讀 3460

題目描述

運用你所掌握的資料結構,設計和實現乙個  lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。

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

寫入資料 put(key, value) - 如果關鍵字已經存在,則變更其資料值;如果關鍵字不存在,則插入該組「關鍵字/值」。當快取容量達到上限時,它應該在寫入新資料之前刪除最久未使用的資料值,從而為新的資料值留出空間。

高階:你是否可以在 o(1) 時間複雜度內完成這兩種操作?

解題思路

首先看到這道題想到使用字典來儲存插入的元素,然後維護乙個visit列表來表示訪問元素的優先順序,當put乙個元素時,可以往visit列表insert(0,key),即在0處插入元素,但是呼叫get方法後,得先在visit列表種把這個元素刪除後再insert到位置0處,這就比較麻煩了,而且還要對列表實行長度限制來滿足最大容量。

看了別人得方法後,這題最佳方法是使用雙向鍊錶,並用乙個雜湊來儲存鍵和值,這裡值為鍊錶的乙個節點,put乙個元素時,首先判斷最大容量,如果超了,就先刪除鍊錶尾部的節點,再把待put的節點插入到雙向鍊錶的頭部。呼叫get也是,首先產出鍊錶種的節點,再把節點在頭部插入,這裡可以維護乙個head和tail方便操作,**和官方題解差不多

class dnode:

def __init__(self, key = 0, value = 0):

self.key = key

self.value = value

self.pre = none

self.next = none

class lrucache(object):

def __init__(self, capacity):

self.cache = dict()

self.head = dnode()

self.tail = dnode()

self.head.next = self.tail

self.tail.pre = self.head

self.capacity = capacity

self.size = 0

def get(self, key):

if key not in self.cache:

return -1

node = self.cache[key]

self.movetohead(node)

return node.value

def put(self, key, value):

if key not in self.cache:

node = dnode(key, value)

self.cache[key] = node

self.addtohead(node)

self.size += 1

if self.size > self.capacity:

removed = self.removetail()

self.cache.pop(removed.key)

self.size -= 1

else:

node = self.cache[key]

node.value = value

self.movetohead(node)

def movetohead(self, node):

self.removenode(node)

self.addtohead(node)

def addtohead(self, node):

node.pre = self.head

node.next = self.head.next

self.head.next.pre = node

self.head.next = node

def removenode(self, node):

node.pre.next = node.next

node.next.pre = node.pre

def removetail(self):

node = self.tail.pre

self.removenode(node)

return node

cache = lrucache(2)

cache.put(1, 1)

cache.put(2, 2)

cache.get(1)

cache.put(3, 3)

cache.put(4, 4)

146 LRU快取機制 力扣

題意理解 設計乙個最近最少使用的lru緩衝機制的類 問題分析 使用stl hash表unordered map,雙鏈表list。list用於緩衝區 map用於查詢元素位置 list中存放key,value 對,map存放key和list的迭代器。雙鏈表可以插入頭push front,刪除頭pop f...

146 LRU快取機制

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

146 LRU快取機制

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