【數據結構與算法】LRU Cache 算法實現

文章目錄

  • Ⅰ. 什么是 LRU Cache
  • Ⅱ. LRU Cache 的實現
        • [146. LRU 緩存](https://leetcode.cn/problems/lru-cache/)

在這里插入圖片描述

Ⅰ. 什么是 LRU Cache

? LRULeast Recently Used) 是一種淘汰策略的縮寫,意思是 最近最少使用,它是一種 Cache 替換算法。

? 什么是 Cache ?狹義的 Cache 指的是位于 CPU 和主存間的快速 RAM, 通常它不像系統主存那樣使用 DRAM 技術,而使用昂貴但較快速的 SRAM 技術。 廣義上的 Cache 指的是位于速度相差較大的兩種硬件之間, 用于協調兩者數據傳輸速度差異的結構。除了 CPU 與主存之間有 Cache, 內存與硬盤之間也有 Cache,乃至在硬盤與網絡之間也有某種意義上的 Cache ── 稱為 Internet 臨時文件夾或網絡內容緩存等。

? Cache 的容量有限,因此當 Cache 的容量用完后,而又有新的內容需要添加進來時, 就需要挑選并舍棄原有的部分內容,從而騰出空間來放新內容。 LRU Cache 的替換原則就是將最近最少使用的內容替換掉。其實,LRU 譯成最久未使用會更形象, 因為該算法每次替換掉的就是一段時間內最久沒有使用過的內容。

Ⅱ. LRU Cache 的實現

? 實現 LRU Cache 的方法和思路很多,但是要保持高效實現 O(1)putget,那么使用雙向鏈表和哈希表的搭配是最高效和經典的。使用雙向鏈表是因為 雙向鏈表可以實現任意位置 O(1) 的插入和刪除,使用 哈希表可以實現 O(1) 的查找

? 這分別對應到 stl 中的 listunordered_map ,其中要注意的是,為了能達到 O(1) 的效果,我們在 unordered_map 中存放的 value 值是 list 的迭代器 list<int, int>::iterator ,這樣子就能快速找到鏈表中每個節點。

在這里插入圖片描述

146. LRU 緩存

請你設計并實現一個滿足 LRU (最近最少使用) 緩存約束的數據結構。實現 LRUCache 類:

  • LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存

  • int get(int key) 如果關鍵字 key 存在于緩存中,則返回關鍵字的值,否則返回 -1

  • void put(int key, int value) 如果關鍵字 key 已經存在,則變更其數據值 value ;如果不存在,則向緩存中插入該組 key-value 。如果插入操作導致關鍵字數量超過 capacity ,則應該 逐出 最久未使用的關鍵字。

  • 函數 getput 必須以 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

提示:

1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 105

代碼實現:

class LRUCache {
public:LRUCache(int capacity) :_capacity(capacity){}int get(int key) {auto it = _hashMap.find(key);if(it == _hashMap.end()){return -1;}else{// 存在的話,先要將其更新到鏈表的首位,有兩種方法// 1、使用 push_front + erase 但是容易迭代器失效問題// 2、使用 splice 函數進行轉移// 這里采用第二種方法_LRUList.splice(_LRUList.begin(), _LRUList, it->second);return it->second->second;}}void put(int key, int value) {auto it = _hashMap.find(key);if(it == _hashMap.end()){// 找不到說明要新增// 需要判斷一下是否需要逐出LRUif(_capacity == _hashMap.size()){// 刪掉LRU_hashMap.erase(_LRUList.back().first);_LRUList.pop_back();}// 插入新增元素,記得哈希表也要存_LRUList.push_front(make_pair(key, value));_hashMap.insert(make_pair(key, _LRUList.begin()));}else{// 找到的話則更新到鏈表頭并修改value即可it->second->second = value;_LRUList.splice(_LRUList.begin(), _LRUList, it->second);}}
private:// 容量是為了判斷是否已經滿了size_t _capacity;// 哈希表為查找、更新時提供O(1)的時間復雜度typedef list<pair<int, int>>::iterator LTiter;unordered_map<int, LTiter> _hashMap;// 雙向鏈表提供O(1)的插入list<pair<int, int>> _LRUList;
};

在這里插入圖片描述

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

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

相關文章

網頁布局匯總

1. 盒模型 容器大小 內容大小 內邊距(padding) 邊框大小 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

打造海外流量矩陣,TikTok云控工具讓獲客更簡單!

跨境獲客&#xff0c;始終是無數企業主心中的一道難題。今天&#xff0c;給大家帶來一款強大實用的工具——TikTok矩陣云控系統&#xff0c;幫你輕松突破流量瓶頸&#xff0c;實現高效跨境獲客&#xff01; 跨國遠程操控——蘋果手機矩陣云控系統 在正式開始之前&#xff0c;…

MyBatis-plus 快速入門

提示&#xff1a;MyBatis-Plus&#xff08;MP&#xff09;是一個 MyBatis的增強版 文章目錄 前言使用MybatisPlus的基本步驟1、引入MybatisPlus依賴代替Mybatis依賴2、定義Mapper接口并繼承BaseMapper他是怎么知道哪張表&#xff0c;哪些字段呢 3、實體類注解4、根據需要添加配…

找搭子系統 搭子經濟新風口 基于精準匹配的社交新生態探索

一、市場前景&#xff1a;為什么現在需要"找搭子"&#xff1f; 孤獨經濟爆發 超60%年輕人存在"精準陪伴"需求&#xff08;2024社交報告&#xff09; 傳統社交App無法滿足"非婚戀、非熟人"的中間態需求 線下活動復蘇 劇本殺/飛盤等興趣活動年增…

深入探析C#設計模式:訪問者模式(Visitor Pattern)的原理與應用

引言 在軟件開發中&#xff0c;設計模式為我們提供了高效、可維護的解決方案。而在眾多設計模式中&#xff0c;訪問者模式&#xff08;Visitor Pattern&#xff09;以其獨特的結構和應用場景&#xff0c;在復雜系統中發揮著重要作用。本文將深入講解訪問者模式的定義、原理、優…

Redis核心功能實現

前言 學習是個輸入的過程&#xff0c;在進行輸入之后再進行一些輸出&#xff0c;比如寫寫文章&#xff0c;筆記&#xff0c;或者做一些技術串講&#xff0c;雖然需要花費不少時間&#xff0c;但是好處很多&#xff0c;首先是能通過輸出給自己的輸入帶來一些動力&#xff0c;然…

RPA VS AI Agent

圖片來源網絡 RPA&#xff08;機器人流程自動化&#xff09;和AI Agent&#xff08;人工智能代理&#xff09;在自動化和智能化領域各自扮演著重要角色&#xff0c;但它們之間存在顯著的區別。以下是對兩者區別的詳細分析&#xff1a; 一、定義與核心功能 RPA&#xff08;機…

多模態大語言模型arxiv論文略讀(十五)

Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ?? 論文標題&#xff1a;Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ?? 論文作者&#xff1a;Yuanwei Wu, Xiang Li, Yixin Liu, Pan Zhou, Lichao Sun ?? 研究機構…

第1節:計算機視覺發展簡史

計算機視覺與圖像分類概述&#xff1a;計算機視覺發展簡史 計算機視覺&#xff08;Computer Vision&#xff09;作為人工智能領域的重要分支&#xff0c;是一門研究如何使機器"看"的科學&#xff0c;更具體地說&#xff0c;是指用攝影機和計算機代替人眼對目標進行識…

【工具】Fiddler抓包

本文主要講解如何使用Fiddler抓HTTP包&#xff0c;可通過所抓包內容分析HTTP請求/響應的細節 安裝與配置 1.下載與安裝 下載地址: https://www.telerik.com/fiddler/ 點擊了鏈接后&#xff0c;跳轉到以下頁面&#xff1a; 點擊Fiddler Classic(免費版)后&#xff0c;跳轉到以…

STM32F103復用JTAG/SWD引腳為GPIO

普中-精靈1開發板&#xff0c;主芯片為STM32F103C8T6&#xff0c;4個獨立按鍵K1~K4依次接PA15~PA12&#xff0c;按下為低電平&#xff0c;8個LED燈D1~D8&#xff0c;依次接PA0~PA7。查詢手冊得知&#xff1a;PA15主功能為JTDI&#xff0c;PA14為JTCK/SWCLK&#xff0c;PA13為JT…

難度偏低,25西電人工智能學院821、833、834考研錄取情況

1、人工智能學院各個方向 2、人工智能學院近三年復試分數線對比 學長、學姐分析 由表可看出&#xff1a; 1、智能院25年院線相對于24年院線 全部專業下降比較多&#xff0c;其中控制科學與工程下降20分&#xff0c;計算機科學與技術下降20分&#xff0c;計算機技術[專碩]下降…

達夢數據校驗系統(DMDVS):數據完整性保障的不二之選

產品概述 達夢數據校驗系統(DMDVS)是一款企業級數據一致性管理平臺,提供跨數據庫、跨平臺的數據比對與修復能力。系統采用模塊化架構設計,支持靜態校驗、動態校驗、單向校驗及分布式校驗四大核心模式,適用于數據遷移驗證、容災備份核查、實時同步監控等關鍵場景,??更多…

【3dSwap】3D-Aware Face Swapping

文章目錄 3D-Aware Face Swapping背景points貢獻方法從2D圖像推斷3D先驗通過潛在代碼操縱進行人臉交換聯合樞軸調整目標函數實驗與二維人臉交換方法比較進一步分析3D感知人臉交換消融實驗局限性3D-Aware Face Swapping 會議/期刊:CVPR 2023 作者: code:https://lyx0208.gi…

客戶案例 | 日事清×初心家居:多部門協作實現新品上架自動化

1、客戶背景 佛山市初心家居有限公司&#xff0c;主營家居類目&#xff0c;年營收額近億元。初心家居有自己的家居生產工廠&#xff08;可為第三方提供生產&#xff09;&#xff0c;店內產品均為自主研發設計&#xff0c;所以新品開發也是初心家居的核心。 2、客戶工作場景及需…

KWDB創作者計劃—KWDB多副本集群保姆級部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中國DBA聯盟(ACDU)成員&#xff0c;10余年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主&#xff0c;全網粉絲10萬 擅長主流Oracle、MySQL、PG、高斯…

micro ubuntu 安裝教程

micro ubuntu 安裝教程 官網地址 : https://micro-editor.github.io 以下是在 Ubuntu 系統中安裝 micro 編輯器 的詳細教程&#xff1a; 方法 1&#xff1a;通過 ?apt?? 直接安裝&#xff08;推薦&#xff09; 適用于 Ubuntu 20.04 及以上版本&#xff08;官方倉庫已收錄…

Docker 鏡像 的常用命令介紹

拉取鏡像 $ docker pull imageName[:tag][:tag] tag 不寫時&#xff0c;拉取的 是 latest 的鏡像查看鏡像 查看所有本地鏡像 docker images or docker images -a查看完整的鏡像的數字簽名 docker images --digests查看完整的鏡像ID docker images --no-trunc只查看所有的…

從零搭建微服務項目Pro(第0章——微服務項目腳手架搭建)

前言&#xff1a; 在本專欄Base第0章曾介紹一種入門級的微服務項目搭建&#xff0c;盡管后續基于此框架上實現了Nacos、Eureka服務注冊發現、配置管理、Feign調用、網關模塊、OSS文件存儲、JSR參數校驗、LogBack日志配置&#xff0c;鑒權模塊、定時任務模塊等&#xff0c;但由于…

VS Code下開發FPGA——FPGA開發體驗提升__下

上一篇&#xff1a;IntelliJ IDEA下開發FPGA-CSDN博客 Type&#xff1a;Quartus 一、安裝插件 在應用商店先安裝Digtal IDE插件 安裝后&#xff0c;把其他相關的Verilog插件禁用&#xff0c;避免可能的沖突。重啟后&#xff0c;可能會彈出下面提示 這是插件默認要求的工具鏈&a…