146 LRU 快取機制

2021-10-19 15:08:13 字數 2810 閱讀 5166

題目:146. lru 快取機制

運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制 。

實現 lrucache 類:

lrucache(int capacity) 以正整數作為容量 capacity 初始化 lru 快取

int get(int key) 如果關鍵字 key 存在於快取中,則返回關鍵字的值,否則返回 -1 。

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

解題思路

/*

lru快取淘汰演算法:最近最少使用

思路一:直接用linkedhashmap,容器內部就實現了lru演算法。

linkedhashmap的有序可以按兩種順序排列,一種是按照插入的順序,一種是按照讀取的順序(這個題目的示例就是告訴我們要按照讀取的順序進行排序)

思路二: 雜湊表 + 雙向鍊錶

1.雜湊表用於滿足題目時間複雜度o(1)的要求,雙向鍊錶用於儲存順序

2.雜湊表鍵值型別:,雜湊表的鍵用於儲存輸入的key,雜湊表的值用於儲存雙向鍊錶的節點

3.雙向鍊錶的節點中除了value外還需要包含key,因為在刪除最久未使用的資料時,需要通過鍊錶來定位hashmap中應當刪除的鍵值對

4.一些操作:雙向鍊錶中,在後面的節點表示被最近訪問

i. 新加入的節點放在鍊錶末尾,addnodetolast(node)

ii. 若容量達到上限,去除最久未使用的資料,removenode(head.next)

iii. 若資料新被訪問過,比如被get了或被put了新值,把該節點挪到鍊錶末尾,movenodetolast(node)

5.為了操作的方便,在雙向煉表頭和尾分別定義乙個head和tail節點。

複雜度分析:

時間複雜度:o(1)

空間複雜度:o(capacity)

*/

解題方法一:linkedhashmap

// 思路一:直接用linkedhashmap

class lrucache extends linkedhashmap

public int get(int key)

// 這個可不寫

public void put(int key, int value)

@override

protected boolean removeeldestentry(map.entryeldest)

}

解題方法二:雜湊表 + 雙向鍊錶

// 思路二:雜湊表 + 雙向鍊錶

class

lrucache

public

intget

(int key)

private

void

movetotail

(listnode node)

private

void

removefromlist

(listnode node)

private

void

addtotail

(listnode node)

public

void

put(

int key,

int value)

listnode newnode =

newlistnode

(key, value)

;// 建立新的節點

map.

put(key, newnode)

;// 存入雜湊表

this

.addtotail

(newnode)

;// 將節點新增到鍊錶尾部

this

.count++

;// 快取數目+1

}else

}// 刪除最遠一次使用的資料 ,頭部一直是最老的老傢伙

private

void

removelruitem()

}public

class

listnode

listnode

(int val, listnode next)

listnode

(int key,

int val)

public

intgetval()

public

void

setval

(int val)

public listnode getnext()

public

void

setnext

(listnode next)

public listnode getprev()

public

void

setprev

(listnode prev)

public

intgetkey()

public

void

setkey

(int key)

}/**

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

* lrucache obj = new lrucache(capacity);

* int param_1 = obj.get(key);

* obj.put(key,value);

*/

146 LRU快取機制

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

146 LRU快取機制

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

146 LRU快取機制

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