日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

146. LRU 缓存机制

發(fā)布時間:2023/11/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 146. LRU 缓存机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

146. LRU 緩存機(jī)制

運(yùn)用你所掌握的數(shù)據(jù)結(jié)構(gòu),設(shè)計和實現(xiàn)一個 LRU (最近最少使用) 緩存機(jī)制 。
實現(xiàn) LRUCache 類:

LRUCache(int capacity) 以正整數(shù)作為容量 capacity 初始化 LRU 緩存
int get(int key) 如果關(guān)鍵字 key 存在于緩存中,則返回關(guān)鍵字的值,否則返回 -1 。
void put(int key, int value) 如果關(guān)鍵字已經(jīng)存在,則變更其數(shù)據(jù)值;如果關(guān)鍵字不存在,則插入該組「關(guān)鍵字-值」。當(dāng)緩存容量達(dá)到上限時,它應(yīng)該在寫入新數(shù)據(jù)之前刪除最久未使用的數(shù)據(jù)值,從而為新的數(shù)據(jù)值留出空間。

進(jìn)階:你是否可以在 O(1) 時間復(fù)雜度內(nèi)完成這兩種操作?

示例:

輸入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
輸出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解釋
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 緩存是 {1=1}
lRUCache.put(2, 2); // 緩存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 該操作會使得關(guān)鍵字 2 作廢,緩存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 該操作會使得關(guān)鍵字 1 作廢,緩存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

解題思路

基于鏈表和hashmap實現(xiàn)LRU

  • 每次新增key的時候,如果key已經(jīng)存在了,就將key移到鏈表頭,并且修改value。如果key不存在,直接將key插入隊頭。如果已經(jīng)超出LRU的大小,就刪除鏈表尾部的key
  • 每次get的時候,如果key存在,就將這個key移到鏈表頭,并且返回
  • 代碼

    type LRUCache struct {capacity inthead *Nodetail *Nodecache map[int]*Node } type Node struct {pre *Nodenext *Nodekey intval int }var c LRUCache func Constructor(capacity int) LRUCache {c.cache= map[int]*Node{}c.capacity=capacityc.head=&Node{val: -1}c.tail=&Node{val: -1}c.head.next=c.tailc.tail.pre=c.headreturn c }func (lru *LRUCache) Get(key int) int {node,ok := c.cache[key]if ok {p,n := node.pre,node.nextp.next=nn.pre=pth:=lru.head.next//插入頭節(jié)點(diǎn)lru.head.next=nodenode.pre=lru.headnode.next=thth.pre=nodereturn node.val}return -1 }func (lru *LRUCache) Put(key int, value int) {if lru.Get(key)!=-1 {lru.head.next.val=valuereturn}if lru.capacity==0 {delete(lru.cache,lru.tail.pre.key)tl := lru.tail.pre.pretl.next=lru.taillru.tail.pre=tllru.capacity++}node := &Node{key: key,val: value,next: lru.head.next,pre: lru.head,}lru.head.next.pre=nodelru.head.next=nodelru.cache[key]=nodelru.capacity-- }/*** Your LRUCache object will be instantiated and called as such:* obj := Constructor(capacity);* param_1 := obj.Get(key);* obj.Put(key,value);*/

    總結(jié)

    以上是生活随笔為你收集整理的146. LRU 缓存机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。