理解和實現 LRU 緩存置換算法

引言

在計算機科學中,緩存是一種用于提高數據訪問速度的技術。然而,緩存空間是有限的,當緩存被填滿時,就需要一種策略來決定哪些數據應該保留,哪些應該被淘汰。LRU(最近最少使用)算法是一種廣泛使用的緩存淘汰策略,它基于一個簡單的假設:如果數據最近被訪問過,那么它在未來也更有可能被訪問。

LRU算法簡介

LRU算法的核心思想是:在緩存空間不足時,淘汰最長時間未被訪問的數據項。這種策略適用于多種場景,包括Web緩存、數據庫查詢緩存、操作系統的頁面置換等。

LRU算法的工作原理

LRU算法通常需要兩種數據結構來實現:

哈希表:提供O(1)時間復雜度的數據訪問和插入。
雙向鏈表:維護數據項的使用順序,最近使用的在頭部,最久未使用的在尾部。

數據訪問和插入的流程如下:

獲取數據(Get):從緩存中獲取數據,如果數據存在(緩存命中),則將該數據移到鏈表頭部;如果數據不存在(緩存未命中),返回 -1。
放入數據(Put):將數據放入緩存,如果數據已經存在,則更新數據值并將該節點移到鏈表頭部;如果數據不存在,則在鏈表頭部插入新的節點,如果緩存已滿,還需要移除鏈表尾部的節點。

LRU算法的實現

class LRUCache {/**整體思路:定義雙向循環鏈表和Map,其中Map的key存儲key,value存儲鏈表節點.為什么定義雙向循環鏈表,因為這樣定義就不需要定義額外的頭尾節點*/static class Node{Node prev, next;int key, val;public Node(int key, int val){this.key = key;this.val = val;}}private Node dummy = new Node(-1,-1);Map<Integer, Node> mp = new HashMap<>();private int capacity;public LRUCache(int capacity) {this.capacity = capacity;dummy.prev = dummy;dummy.next = dummy;}public int get(int key) {// 判斷是否在緩存Node node = mp.get(key);// 不在,直接返回-1if(node == null) return -1;// 在,就把當前節點移動到前面moveToHead(node);// 返回節點值return node.val;}public void put(int key, int value) {// 判斷是否在緩存Node node = mp.get(key);// 在,就把當前節點移動到前面if(node != null){// 更新node.valnode.val = value;moveToHead(node);}else{// 不在,就加入node = new Node(key, value);mp.put(key, node);// 將新節點加入到頭部insert(node);// 如果當前容量大于LRU容量,就移出if(mp.size() > capacity){// 找到尾節點node = dummy.prev;// 刪除尾節點del(node);// 從緩存移出對應的keymp.remove(node.key);}}}// 移動當前節點到頭節點public void moveToHead(Node node){del(node);insert(node);}// 插入頭部public void insert(Node node){node.prev = dummy;node.next = dummy.next;dummy.next.prev = node;dummy.next = node;}// 刪除節點public void del(Node node){node.prev.next = node.next;node.next.prev = node.prev;}
}

LRU算法的優勢與局限

LRU算法的優勢在于其簡單性和效率。它能夠快速地識別并淘汰最久未使用的數據項。然而,LRU也有局限性,它可能不適用于所有類型的訪問模式,特別是那些具有周期性或隨機性訪問模式的場景。另外,在某些情況下,LRU 緩存可能會頻繁地移除和加載數據,導致緩存抖動。這種現象在緩存大小接近于工作集大小時尤為明顯。

結論

LRU算法是一種高效且廣泛使用的緩存淘汰策略,適用于多種需要緩存的場景。通過理解其工作原理和實現方式,我們可以更好地利用緩存來提高系統性能。隨著技術的發展,對LRU算法的優化和變種也在不斷涌現,為不同的應用場景提供了更多的選擇。

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

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

相關文章

UML實現圖-部署圖

概述 部署圖(Deployent Diagram)描述了運行軟件的系統中硬件和軟件的物理結構。部署圖中通常包含兩種元素:節點和關聯關系&#xff0c;部署圖中每個配置必須存在于某些節點上。部署圖也可以包含包或子系統。 節點是在運行時代表計算機資源的物理元素。節點名稱有兩種:簡單名和…

android studio開發時提示 TLS 握手錯誤解決辦法

我用的是windows&#xff0c;遇到了這錯誤&#xff0c; The server may not support the clients requested TLS protocol versions: (TLSv1.2, TLSv1.3). You may need to configure the client to allow other protocols to be used. For more on this, please refer to http…

蒼穹外賣筆記-08-套餐管理-增加,刪除,修改,查詢和起售停售套餐

套餐管理 1 任務2 新增套餐2.1 需求分析和設計接口設計setmeal和setmeal_dish表設計 2.2 代碼開發2.2.1 根據分類id查詢菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

c++替換字符或字符串函數

在C中&#xff0c;有多種方法可以替換字符串或字符。下面是一些常用的方法&#xff1a; 使用replace函數&#xff1a; replace函數可以替換字符串中的指定字符或子字符串。它的用法如下&#xff1a; string str "Hello World"; str.replace(str.find("World&qu…

Nginx03-動態資源和LNMP介紹與實驗、自動索引模塊、基礎認證模塊、狀態模塊

目錄 寫在前面Nginx03案例1 模擬視頻下載網站自動索引autoindex基礎認證auth_basic模塊狀態stub_status模塊模塊小結 案例2 動態網站&#xff08;部署php代碼&#xff09;概述常見的動態網站的架構LNMP架構流程數據庫Mariadb安裝安全配置基本操作 PHP安裝php修改配置文件 Nginx…

AI做的2024年高考數學試卷,答案對嗎?

2024年高考數學考試已經結束&#xff0c;現在呈上數學真題及AI給出的解答。供各位看官欣賞。 總的來說&#xff0c;人工做題兩小時&#xff0c;AI解答兩分鐘。 但是&#xff0c;AI做的答案是否正確&#xff0c;那就要各位看官來評判了&#xff01; 注&#xff1a;試卷來源于…

【Linux】另一種基于rpm安裝yum的方式

之前的163的鏡像源504網關異常了&#xff0c;網上找到的方法基本都是基于apt&#xff0c;或是基于apt-get。找到了大佬幫忙裝了一下&#xff0c;記錄如下&#xff1a; wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm…

2024年5大制作AI電子手冊工具推薦

AI電子手冊作為一種結合了人工智能技術和傳統電子手冊功能的新型工具&#xff0c;逐漸成為了企業進行知識管理和信息傳遞的重要工具&#xff0c;為企業提高效率、優化用戶體驗。在本文中&#xff0c;LookLook同學將簡單介紹一下什么是AI電子手冊、對企業有什么好處&#xff0c;…

JAVA面試中,面試官最愛問的問題。

Optional類是什么&#xff1f;它在Java中的用途是什么&#xff1f; Java中的Optional類是一個容器類&#xff0c;它用于封裝可能為空的對象。在Java 8之前&#xff0c;空值檢查是Java編程中一個常見的問題&#xff0c;尤其是在處理返回單個值的方法時。Optional類提供了一種更…

電源變壓器的作用和性能

電源變壓器的主要作用是改變輸入電壓的大小&#xff0c;通常用于降低電壓或升高電壓&#xff0c;以便適應不同設備的需求。它們還可以提供隔離&#xff0c;使得輸出電路與輸入電路之間電氣隔離&#xff0c;從而提高安全性。性能方面&#xff0c;電源變壓器需要具有高效率、低溫…

Unity3D測量距離實現方法(一)

系列文章目錄 unity工具 文章目錄 系列文章目錄&#x1f449;前言&#x1f449;一、Unity距離測量1-1 制作預制體1-2 編寫測量的腳本 &#x1f449;二、鼠標點擊模型進行測量&#x1f449;二、字體面向攝像機的方法&#x1f449;二、最短距離測量方法&#x1f449;三、壁紙分享…

Python中的裝飾器鏈(decorator chain)是什么

在Python中&#xff0c;裝飾器是一種高級功能&#xff0c;它允許你在不修改函數或類代碼的情況下&#xff0c;為它們添加額外的功能。裝飾器通常用于日志記錄、性能測量、權限檢查等場景。當多個裝飾器應用于同一個函數或類時&#xff0c;它們會形成一個裝飾器鏈&#xff08;de…

Go語言中,公司gitlab私有倉庫依賴拉取配置

為什么要考慮私有倉庫 Go語言目前都已經采用了官方統一的 go modules 來管理依賴&#xff0c;后續也不太可能出現比較亂的生態&#xff0c; 因此了解下如何讓這個依賴管理正常工作是非常必要的。 對于Github或者其他公有倉庫&#xff0c;依賴管理是非常直接和方便的,設置好GO…

C++ 依賴的C庫查看和下載

依賴庫查詢&#xff1a;ldd 指令 # ldd libcyber.solinux-vdso.so.1 (0x0000ffff86b52000)libopt_proto.so > /home/caros/cyberrt/lib/libopt_proto.so (0x0000ffff84c4a000)libboost_filesystem.so.1.73.0 > /opt/orin/usr/local/lib/libboost_filesystem.so.1.73.0 (…

Java版工程項目管理平臺:以源碼驅動,引領工程企業數字化轉型

在當今數字化時代&#xff0c;隨著企業的擴張和業務的增長&#xff0c;傳統的工程項目管理方法已顯不足。為了提升管理效率、減輕工作負擔、增強信息處理的快速性和精確度&#xff0c;工程企業亟需借助數字化技術進行轉型升級。本文將向您展示一款基于Spring Cloud、Spring Boo…

SS2D反向傳播問題記錄【未解決】

使用SS2D寫了一個簡單的神經網絡進行訓練&#xff0c;但是訓練報錯&#xff1a; NotImplementedError: You must implement either the backward or vjp method for your custom autograd.Function to use it with backward mode AD. 環境&#xff1a; CUDA11.8 torch2.0.0 mam…

AI大模型日報#0607:10家國產大模型、GPT-4o挑戰高考作文 | OpenAI公開破解GPT-4新方法

導讀&#xff1a;AI大模型日報&#xff0c;爬蟲LLM自動生成&#xff0c;一文覽盡每日AI大模型要點資訊&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一萬物”&#xff08;Yi-Large&#xff09;生成了今日要點以及每條資訊的摘要。歡迎閱讀&#xf…

TS 系列:使用元祖生成聯合類型

需求&#xff1a;有這么個需求&#xff0c;我們有兩個數組&#xff0c;一個記錄撲克牌花色&#xff0c;一個記錄撲克牌點數&#xff0c;需要有一個函數&#xff0c;傳遞兩個值&#xff0c;根據傳遞的值生成撲克牌&#xff0c;需要我們定義參數的類型檢查。 思路&#xff1a;肯…

2024速通python之python高階技巧

文章目錄 一、閉包1.什么是閉包2.優缺點3.nonlocal關鍵字 二、裝飾器1.什么是裝飾器2.舉例3.傳統方式4.裝飾器方式5.語法糖寫法 三、多線程1.線程參數2.多線程編程 四、網絡編程1.Socket服務端編程2.Socket客戶端編程 「章節總覽」 ??????【2024速通python之python基礎…

超過20W個高質量組件的開源PCB庫

項目介紹 Celestial Altium Library是由Altium行業專家Mark Harris創建的一個龐大的免費開源數據庫庫&#xff0c;專為Altium Designer而設計&#xff0c;庫中包含超過20萬個優質組件 . 特點 高質量數據&#xff1a;Celestial Altium Library注重數據的質量&#xff0c;用戶可…