1. 程式人生 > >LRU最近最少使用的Java實現

LRU最近最少使用的Java實現

1LRULeastRecently Used的縮寫,即最近最少使用,常用於頁面置換演算法,是為虛擬頁式儲存管理服務的。

2:為了實現LRU,需要做到

    查詢出最近最晚使用的項

    給最近使用的項做一個標記

連結串列可以實現這個兩個操作,標記最近使用的項只需要將使用的項從當前位置刪除,並將該項放到頭部。那麼最近最少使用的項就在連結串列尾部。比較困難的是怎樣快速的在連結串列中找到該項。查詢的話可以藉助hash表,雜湊表可以在常量時間內索引某個物件。如果建立一個key到連結串列節點的雜湊表就可以在常量時間內找到最近使用的節點。也能在常量時間內判斷節點是否存在。這種形式的資料結構在java中是有的:LinkedHashMap

3LinkedHashMap

    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.

快取淘汰演算法LRUJAVA實現

一、基本概念 命中:訪問快取是通過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(