LRU最近最少使用的Java實現
1:LRU是LeastRecently Used的縮寫,即最近最少使用,常用於頁面置換演算法,是為虛擬頁式儲存管理服務的。
2:為了實現LRU,需要做到
查詢出最近最晚使用的項
給最近使用的項做一個標記
連結串列可以實現這個兩個操作,標記最近使用的項只需要將使用的項從當前位置刪除,並將該項放到頭部。那麼最近最少使用的項就在連結串列尾部。比較困難的是怎樣快速的在連結串列中找到該項。查詢的話可以藉助hash表,雜湊表可以在常量時間內索引某個物件。如果建立一個key到連結串列節點的雜湊表就可以在常量時間內找到最近使用的節點。也能在常量時間內判斷節點是否存在。這種形式的資料結構在java中是有的:LinkedHashMap
3:LinkedHashMap
LinkedHashMap自身已經實現了順序儲存,預設情況下是按照元素的新增順序儲存,也可以啟用按照訪問順序儲存,即最近讀取的資料放在最前面,最早讀取的資料放在最後面,然後它還有一個判斷是否刪除最老資料的方法,預設是返回false,即不刪除資料,我們使用LinkedHashMap實現LRU快取的方法就是對LinkedHashMap實現簡單的擴充套件,擴充套件方式有兩種,一種是inheritance,一種是delegation,具體使用什麼方式看個人喜好。
import java.util.LinkedHashMap; import java.util.Map; //參考:https://www.cnblogs.com/ProtectedDream/p/6932478.html //此實現為非執行緒安全,若在多執行緒環境下使用需要在相關方法上新增synchronized以實現執行緒安全操作 public class LruCache1<K, V> extends LinkedHashMap<K, V> { private final int MAX_CACHE_SIZE; // ceil 天花板 public LruCache1(int cacheSize) { super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true); MAX_CACHE_SIZE = cacheSize; } // 預設返回false, 在程式中效果就是不刪除最近最少使用的值 protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_SIZE; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (Map.Entry<K, V> entry : entrySet()) { sb.append(String.format("%s:%s ", entry.getKey(), entry.getValue())); } return sb.toString(); } // public static void main(String[] args) { // LruCache1<Integer, Integer> cache = new LruCache1<Integer, Integer>(3); // for (int i = 0; i < 3; i++) { // cache.put(i, i); // } // System.out.println(cache); // cache.put(4, 4); // System.out.println(cache); // cache.get(2); // System.out.println(cache); // // for (Map.Entry<Integer, Integer> entry : cache.entrySet()) { // System.out.println(entry.getValue()); // } // } }
自己寫了一個用連結串列實現的LRU,當然,其中的問題就是查詢的時間複雜度是O(n),具體見github
相關推薦
LRU最近最少使用的Java實現
1:LRU是LeastRecently Used的縮寫,即最近最少使用,常用於頁面置換演算法,是為虛擬頁式儲存管理服務的。2:為了實現LRU,需要做到 查詢出最近最晚使用的項 給最近使用的項做一個標記連結串列可以實現這個兩個操作,標記最近使用的項只需要將使用的項從
LRU(最近最少使用淘汰算法)基本實現
置換 lin ron sta recent 頁式 inf ext block LRU(Least Recently Used) 出發點:在頁式存儲管理中,如果一頁很長時間未被訪問,則它在最近一段時間內也不會被訪問,即時間局部性,那我們就把它調出(置換出)內存。 為了實
LRU (最近最少使用) 快取機制:時間複雜度O(1)
/** * Double Linked List * 用了一個特別的雙向的ListNode,有了head和tail,這樣就大大加快了速度。 * 主要加快的就是那個‘更新排位’的過程,找到item hashmap O(1), 做減法換位也都是O(1) * Overall O(1)
詳解leetcode146題【LRU (最近最少使用) 快取機制】(附js最優解法!)
leetcode 146. LRU (最近最少使用) 快取機制 題目描述 運用你所掌握的資料結構,設計和實現一個 LRU (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。 獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總
LRU最近最少淘汰演算法
LRU (Least recently used,最近最少使用) 最常的實現就是使用一個連結串列來儲存快取資料,最常用在例如: 最近閱讀:。。。。 。。。。  
【python學習筆記】3:LRU(最近最少使用頁面置換)演算法
題目描述:一程序剛獲得3個主存塊的使用權,若該程序訪問頁面的次序是1,2,3,4,1,2,5,1,2,3,4,5。當採用LRU演算法時發生的缺頁次數是多少? LRU是最近最少使用頁面置換演算法,該演算法用一個開放的棧來儲存當前正在使用的各個頁面號。當有一個新的頁面要被訪
Java實現LRU(最近最少使用)快取
前幾天去一個公司面試,面試官直接讓上機寫一個LRU快取,當時寫的很亂,現整理如下: package com.jd.test; import java.io.Serializable; import java.util.LinkedHashMap; import java.
Java實現緩存(LRU,FIFO)
tro 減少 需求 返回 city 存在 move sed 未使用 吹吹牛逼,曬曬太陽。不如來寫點東西,哈哈哈哈哈。。。。今天來說說,如何用java實現緩存,這個話題很多面試的也會被問到。今天就來說說。 1.為什麽要java實現緩存的? 由於目前軟件或網頁的並發量增加很大,
最近最少使用算法(LRU)——頁面置換
font logs max spa 地址 ont lag 頁面置換 之前 原創 上一篇博客寫了先進先出算法(FIFO)——頁面置換:http://www.cnblogs.com/chiweiming/p/9058438.html 此篇介紹最近最少使用算法(LRU)——頁面
LeetCode 146. LRU快取機制(java實現)
參考解答 總結:這道題主要要知道選取何種資料結構並且在 O(1) 時間複雜度內完成這兩種操作? O(1) 的get方法肯定要用到HashMap() LinkedList(雙向連結串列)可以以O(1)時間複雜度,很方便地實現資料的插入和刪除 所以,將兩個資料結構聯合使用,Ha
關於FIFO(頁面淘汰演算法)和LRU(最近最少使用演算法)詳細說明
舉例說明:例如在一個虛存系統中,程序的記憶體空間為3頁,已開始記憶體為空,有以下訪問序列:2,3,2,1,5,2,4,5,3,2,5,2。分別用以上兩種方法分別計算缺頁次數。 A:使用FIFO(頁面淘汰演算法) FIFO:先進先出,也就是, 先調2(缺) 記憶體為2.
快取淘汰演算法LRU及JAVA實現
一、基本概念 命中:訪問快取是通過key get到對應value 回源: miss了,未命中導致回讀源資料 淘汰:快取滿了,那麼就會按照某一種策略,把快取中的舊物件踢出,而把新的物件加入快取池。(只有5個儲存單元,來了第6個元素。則考慮誰出隊) 淘汰策略:即快取演算法
最近點對(Java實現)
最近點對問題: 在二維平面上的n個點中,快速的最近的一對點的距離。 java實現: package p2; import static java.lang.Math.*; import java.util.ArrayList; import java.util.Arr
作業系統頁面置換演算法之最近最少使用演算法(LRU)
import java.util.LinkedList; import java.util.List; public class LRU {public static void main(String[] args) {int framesize = 5;//幀數量int[] s = { 1, 2, 3, 4
LRU演算法,最近最少使用演算法
LRU是Least Recently Used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的,是根據頁面調入記憶體後的使用情況進行決策了。由於無法預測各頁面將來的使用情況,只能利用“最近的過去”作為“最近的將來”的近似,因此,LRU演算法就是將最近最久未
分治法-最近距離問題Java實現
分治演算法,有很多典型的問題,如最近點問題、線性選擇問題、整數劃分問題、大整數成績問題、棋盤覆蓋問題、迴圈賽日程表、二分搜尋、Strassen矩陣乘法、漢諾塔等。準備花些時間逐個解決這些問題,並用Java實現,從最近點問題開始。網上找到一些程式碼,標題如“ja
java實現分治法,求平面內最近點對
演算法分析: 方法一:窮舉 1)演算法描述:已知集合S中有n個點,一共可以組成n(n-1)/2對點對,蠻力法就是對這n(n-1)/2對點對逐對進行距離計算,通過迴圈求得點集中的最近點對 2)演算法時間複雜度:演算法一共要執行 n(n-1)/2次迴圈,因此演算法複雜度為O(
LRU快取介紹與實現 (Java)
引子: 我們平時總會有一個電話本記錄所有朋友的電話,但是,如果有朋友經常聯絡,那些朋友的電話號碼不用翻電話本我們也能記住,但是,如果長時間沒有聯絡了,要再次聯絡那位朋友的時候,我們又不得不求助電話本,但是,通過電話本查詢還是很費時間的。但是,我們大腦能夠記住的東西是一定的,我們只能記住自己最熟悉的,而長時間
JAVA實現頁面置換演算法——LRU演算法
理解演算法才能實現演算法,要不然就和我一樣無從下手,抓破頭皮也沒用!!!import java.util.*; import java.io.*; public class Main{ public
蠻力法和分治法 求最近對問題——Java 實現
public class ClosestPair2{ public static void main(String[] args) { /** *輸入需要比較的點的對數存在變數n中 */ Scanner in=new Scanner(System.in); System.out.println(