146 LRU快取機制

2022-08-17 09:24:18 字數 1842 閱讀 2579

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

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

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

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

示例:

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

//

lru快取淘汰機制,淘汰最久沒有被使用的

type lrucache struct

func constructor(capacity

int) lrucache

func (

this *lrucache) get(key int) int

n := this

.nodem[key]

this

.l.delete(n)

this

.l.add(n)

this.nodem[key] =n

return

this

.m[key]

}func (

this *lrucache) put(key int, value int

)

//淘汰最舊的key

if len(this.m) >= this

.size

//新增新node

newnode := &node

this

.l.add(newnode)

this.m[key] =value

this.nodem[key] =newnode

}type node struct

type linkedlist struct

func newlinkedlist() *linkedlist

}func (l *linkedlist) add(n *node)

l.rear.next =n

n.pre =l.rear

l.rear =n

}func (l *linkedlist) delete(n *node)

if n ==l.head

if n ==l.rear

n.pre.next =n.next

n.next.pre =n.pre

}func (l *linkedlist) pop() int

l.head =l.head.next

l.head.pre =nil

return

key}

func (c *lrucache) init(size int

)

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 如果金鑰不存在,則寫入其資料值。...