146. LRU 緩存機制

146. LRU 緩存機制

運用你所掌握的數據結構,設計和實現一個 LRU (最近最少使用) 緩存機制 。
實現 LRUCache 類:

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

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

示例:

輸入
[“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); // 該操作會使得關鍵字 2 作廢,緩存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 該操作會使得關鍵字 1 作廢,緩存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

解題思路

基于鏈表和hashmap實現LRU

  1. 每次新增key的時候,如果key已經存在了,就將key移到鏈表頭,并且修改value。如果key不存在,直接將key插入隊頭。如果已經超出LRU的大小,就刪除鏈表尾部的key
  2. 每次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//插入頭節點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);*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[SQL] 請教一下 count里面有case when 一般情況下啥時候用

http://www.itpub.net/forum.php?modviewthread&tid1810967 問題: 比如 count(case when pday_id${deal_date} then 1 end) 我有點想不明白具體什么情況下count() 這個小括號里面還要用case when 大家做BI統計的時候一般什么情況用啊 還有個…

路由器架設虛擬服務器讓外網訪問到本地網站

確定電腦與路由器正確連接,并且已連至互聯網。在地址欄中輸入192.168.0.1回車,輸入用戶名密碼,進入路由器主界面。 然后點擊左側菜單中的“虛擬服務器”,——“端口段映射”打開“端口段映射”界面。 由于網站用的是80端口&#x…

vue項目示例代碼git_您應該了解的5個Git命令以及代碼示例

vue項目示例代碼gitIve used Git for some years now, and I still find myself googling how to do some basic tasks. So this article is my attempt to learn how to do some of these things by writing about them. And even if I still forget, at least Ill have a ref…

413. 等差數列劃分

413. 等差數列劃分 如果一個數列 至少有三個元素 ,并且任意兩個相鄰元素之差相同,則稱該數列為等差數列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差數列。 給你一個整數數組 nums ,返回數組 nums 中所有為等差數組…

山羊與汽車游戲的實驗算法

實驗1: function shuffle(target) {var j, x, i target.length;for (; i > 0; j parseInt(Math.random() * i), x target[--i], target[i] target[j], target[j] x) {}return target }function removeAt(target, index) {return !!target.splice(index, 1).…

selenium模塊

selenium模塊 閱讀目錄 一 介紹二 安裝三 基本使用四 選擇器五 等待元素被加載六 元素交互操作七 其他八 項目練習一 介紹 selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript代碼的問題selenium本質是通過驅動瀏覽器,完…

關閉iphone來電mac_如何在Mac和iPhone上關閉通用剪貼板切換(以及為什么要禁用此功能)

關閉iphone來電macIm about to tell you something that will shock you, and probably make you very angry. I hope you wont hate me for it. Here goes.我正要告訴您一些令您震驚的事情,并可能使您非常生氣。 我希望你不會為此而恨我。 開始。 If you are an i…

關于tomcat Post 數據參數的問題

2019獨角獸企業重金招聘Python工程師標準>>> POST請求本身并未限制傳入參數大小&#xff0c;是tomcat 容器設置了接收參數大小的限制。修改server.xml <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"2000" red…

iOS:通信錄(完成)(18-01-18更)

1、讀取通信錄 1&#xff09;、9.0以前&#xff1a;AddressBook 2&#xff09;、9.0以后&#xff1a;Contacts 2、調用通信錄UI&#xff08;不弄&#xff09; 1&#xff09;、9.0以前&#xff1a;AddressBookUI 2&#xff09;、9.0以后&#xff1a;ContactsUI 3、參考 0、寫在前…

如何在React Native和Firebase中設置Google登錄

Google sign-in is a great login feature to offer to your apps users. It makes it easier for them to create an account and sign in. Google登錄是一項出色的登錄功能&#xff0c;可為您的應用程序用戶提供。 這使他們更容易創建帳戶并登錄。 And whats even better, F…

設計模式-發布訂閱模式

這段時間在看vue的雙向綁定原理&#xff0c;知道了vue的核心三大件&#xff1a;Observer, Complie, Watcher。 Observer用于監聽屬性的變化&#xff0c;如有變動就通知 Watcher。 Compile負責解析元素節點的指令&#xff0c;如v-if&#xff0c;v-bind之類, 進行數據和回調函數的…

杜教篩--51nod1239 歐拉函數之和

求$\sum_{i1}^{n}\varphi (i)$&#xff0c;$n\leqslant 1e10$。 這里先把杜教篩的一般套路貼一下&#xff1a; 要求$S(n)\sum_{i1}^{n}f(i)$&#xff0c;而現在有一數論函數$g(i)$&#xff0c;$g(i)$的前綴和很無腦&#xff0c;且$f$和$g$的狄利克雷卷積的前綴和很無腦&#xf…

【Android Studio安裝部署系列】目錄

概述 從剛開始使用Android Studio到現在&#xff0c;下面所有目錄下的操作&#xff0c;當時習慣性的把每一個整理成一個文檔&#xff08;其實就是簡單文字描述截圖&#xff09;&#xff1b;有些地方當時是一知半解&#xff0c;現在會稍微明白一些。正好趕上現在有時間。所以就想…

修改npm全局安裝模式的路徑

修改npm全局安裝模式的路徑 在正式寫此文章之前&#xff0c;我得說一點血淚史。 剛學nodeJS不久&#xff0c;很納悶為什么全局安裝的模塊在 node安裝目錄/node_modules‘ 中沒找到&#xff01;后來仔細看了下安裝成功后的信息&#xff0c;才發現原來是自動安裝在C盤了&#xff…

javascript創建類_如何使用JavaScript創建吹氣效果

javascript創建類Have you ever wondered how you can create a realistic air blowing effect with JavaScript? Like the one shown on the evening TV shows, where multiple balls are being mixed up in a sphere-like object by leveraging air pressure? If you want …

Bootstrap 4:如何使頂部固定的Navbar保持在容器中而不拉伸?

There are many ways to make a fixed navbar stay inside a parents div container. Well go over the most straightforward one here.有很多方法可以使固定的導航欄停留在父級的div容器中。 我們將在這里介紹最簡單的方法。 Imagine you have the following code, modified…

基于SpringBoot+Mybatis+Thymeleaf商品信息管理系統

github地址&#xff1a;github.com/zaiyunduan1…,如果對你有幫助&#xff0c;歡迎Star 主要用到的技術&#xff1a; 使用maven進行項目構建使用SpringbootMybatis搭建整個系統使用Thymeleaf模板技術實現頁面靜態化使用框架Bootstrap、JQuery開發前端界面使用MySQL和MongoDB分別…

在Mac上為自己手動編譯安裝一套PHP7的開發環境

首先你得去官網下載php7 beta1的版本 這里由于我是在mac上安裝&#xff0c;所以就去下載linux相關的版本&#xff0c;地址也直接附上了php7 beta1windows版的官方也有發布詳情猛戳&#xff1a;這里 解壓安裝包&#xff0c;進入源代碼目錄 tar -zxvf php-7.0.0beta1.tar.gz cd p…

卡特蘭數 HDU2067 HDU4165 HDU1134

題目鏈接&#xff1a;https://vjudge.net/problem/HDU-2067 小兔的棋盤 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11800 Accepted Submission(s): 5952 Problem Description小兔的叔叔從外面旅游回來給她…

Python的用途是什么? Python編程語言有10多種編碼用途。

&#x1f44b;歡迎 (&#x1f44b; Welcome) Hi! Please take a moment to think about this question: 嗨&#xff01; 請花一點時間考慮這個問題&#xff1a; How is Python applied in real-world scenarios? Python如何在實際場景中應用&#xff1f; If you are learnin…