国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LRU算法(JAVA實現(xiàn))

這篇具有很好參考價值的文章主要介紹了LRU算法(JAVA實現(xiàn))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、算法介紹

最近最久未使用(Least Recently Used? ? LRU)算法是?種緩存淘汰策略,它是大部分操作系統(tǒng)為最大化頁面命中率而廣泛采用的一種頁面置換算法。該算法的思路是,發(fā)生缺頁中斷時,將最近一段時間內(nèi)最久未使用的頁面置換出去。 從程序運行的原理來看,最近最久未使用算法是比較接近理想的一種頁面置換算法,這種算法既充分利用了內(nèi)存中頁面調(diào)用的歷史信息,又正確反映了程序的局部問題

虛擬頁式存儲管理,則是將進程所需空間劃分為多個頁面,內(nèi)存中只存放當前所需頁面,其余頁面放入外存的管理方式。
有利就有弊,虛擬頁式存儲管理減少了進程所需的內(nèi)存空間,卻也帶來了運行時間變長這一缺點:進程運行過程中,不可避免地要把在外存中存放的一些信息和內(nèi)存中已有的進行交換,由于外存的低速,這一步驟所花費的時間不可忽略。因而,采取盡量好的交換算法以減少讀取外存的次數(shù),也是相當有意義的事情。

二、基本原理

假設 序列為 4 3 4 2 3 1 4 2
物理塊有3個
4調(diào)入內(nèi)存 4
3調(diào)入內(nèi)存 3 4
4調(diào)入內(nèi)存 4 3
2調(diào)入內(nèi)存 2 4 3
3調(diào)入內(nèi)存 3 2 4
1調(diào)入內(nèi)存 1 3 2(因為最少使用的是4,所以丟棄4)
4調(diào)入內(nèi)存 4 1 3(原理同上)
2調(diào)入內(nèi)存 2 4 1

規(guī)律就是,如果新存入或者訪問一個值,則將這個值放在隊列開頭。如果存儲容量超過上限cap,那么刪除隊尾元素,再存入新的值。

我們下面通過一個簡單的存儲int的方式來實現(xiàn)LRU cache,實現(xiàn)put和get功能。

三、數(shù)據(jù)結(jié)構(gòu)

?先要接收?個參數(shù)作為緩存的最?容量, 然后實現(xiàn)兩個 API, ?個是 put(key, val) ?法存?鍵值對,get(key) ?法獲取 key 對應的 val, 如果 key 不存在則返回null,get 和 put ?法必須都是 O(1) 的時間復雜度。

因此LRU cache 的數(shù)據(jù)結(jié)構(gòu)的必要的條件: 查找快, 插?快, 刪除快, 有順序之分。那么, 什么數(shù)據(jù)結(jié)構(gòu)同時符合上述條件呢? 哈希表查找快, 但是數(shù)據(jù)?固定順序; 鏈表有順序之分, 插?刪除快, 但是查找慢。 所以結(jié)合?下, 形成?種新的數(shù)據(jù)結(jié)構(gòu): 哈希鏈表。如下圖所示:

java lru,操作系統(tǒng),算法

四、算法細節(jié)

新插入的元素或者最新查詢的元素要放到鏈表的頭部,對于長時間未訪問的元素要放到鏈表尾部,所以每次插入或者查詢都需要維護鏈表中元素的順序。

使用哈希表的原因是查詢時間復雜度為O(1),使用雙向鏈表的原因是對于刪除和插入操作時間復雜度為O(1)。

其中哈希表中存儲的 key 為 K,value 為 Node<K,V> 的引用,雙向鏈表存儲的元素為Node<K,V>的引用.

put 方法是線程安全方法,定義如下所示:

public synchronized void put(K key,V value)

對于put操作:

①首先判斷緩存中 元素 K 是否存在,如果存在,則把鏈表中的元素Node<K, V>刪除,map中的數(shù)據(jù)<K, Node<K, V> >不用刪除,再在鏈表頭部插入元素,并更新map,直接返回即可?;

②緩存不存在,并且緩存沒有滿的話,直接把元素插入鏈表的表頭,緩存滿了的話移除表尾元素(最舊未訪問元素),將元素K插入表頭,增加map中的<K, Node<K, V>>, 更新map。

get 方法是線程安全方法,定義如下所示:

public synchronized V get(K key)

對于get操作:

首先要判斷 緩存中(map)是否存在,如果存在則把該節(jié)點刪除并在鏈表頭部插入該元素并更新map 返回當前元素即可,如果map不存在 則直接返回null;文章來源地址http://www.zghlxwxcb.cn/news/detail-693752.html

五、算法實現(xiàn)

public class LRUCache {
    class DLinkedNode {
        int key;
        int value;
        DLinkedNode prev;
        DLinkedNode next;
        public DLinkedNode() {}
        public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
    }

    private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
    private int size;
    private int capacity;
    private DLinkedNode head, tail;

    public LRUCache(int capacity) {
        this.size = 0;
        this.capacity = capacity;
        // 使用偽頭部和偽尾部節(jié)點
        head = new DLinkedNode();
        tail = new DLinkedNode();
        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        DLinkedNode node = cache.get(key);
        if (node == null) {
            return -1;
        }
        // 如果 key 存在,先通過哈希表定位,再移到頭部
        moveToHead(node);
        return node.value;
    }

    public void put(int key, int value) {
        DLinkedNode node = cache.get(key);
        if (node == null) {
            // 如果 key 不存在,創(chuàng)建一個新的節(jié)點
            DLinkedNode newNode = new DLinkedNode(key, value);
            // 添加進哈希表
            cache.put(key, newNode);
            // 添加至雙向鏈表的頭部
            addToHead(newNode);
            ++size;
            if (size > capacity) {
                // 如果超出容量,刪除雙向鏈表的尾部節(jié)點
                DLinkedNode tail = removeTail();
                // 刪除哈希表中對應的項
                cache.remove(tail.key);
                --size;
            }
        }
        else {
            // 如果 key 存在,先通過哈希表定位,再修改 value,并移到頭部
            node.value = value;
            moveToHead(node);
        }
    }

    private void addToHead(DLinkedNode node) {
        node.prev = head;
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
    }

    private void removeNode(DLinkedNode node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }

    private void moveToHead(DLinkedNode node) {
        removeNode(node);
        addToHead(node);
    }

    private DLinkedNode removeTail() {
        DLinkedNode res = tail.prev;
        removeNode(res);
        return res;
    }
}

六、總結(jié)

到了這里,關(guān)于LRU算法(JAVA實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 操作系統(tǒng):用C語言模擬先進先出的算法(FIFO)、最久未使用算法(LRU)、改進的Clock置換算法的命中率。

    操作系統(tǒng):用C語言模擬先進先出的算法(FIFO)、最久未使用算法(LRU)、改進的Clock置換算法的命中率。

    ??通過請求頁面式存儲管理中頁面置換算法設計,了解存儲技術(shù)的特點,掌握請求頁式存儲管理的頁面置換算法。 用程序?qū)崿F(xiàn)生產(chǎn)者——消費者問題,將指令序列轉(zhuǎn)換為用戶虛存中的請求調(diào)用頁面流。 具體要求: l頁面大小為1K l用戶內(nèi)存容量為4頁到40頁 l用戶外存的容量為

    2024年02月03日
    瀏覽(26)
  • LRU算法(JAVA實現(xiàn))

    LRU算法(JAVA實現(xiàn))

    最近最久未使用 (Least Recently Used? ? LRU)算法是?種緩存淘汰策略,它是大部分操作系統(tǒng)為 最大化頁面命中率 而廣泛采用的一種頁面置換算法。該算法的思路是,發(fā)生缺頁中斷時,將最近一段時間內(nèi)最久未使用的頁面置換出去。 從程序運行的原理來看,最近最久未使用算

    2024年02月10日
    瀏覽(26)
  • 操作系統(tǒng)--磁盤調(diào)度算法(FCFSSSTFSCANCSCAN)Java實現(xiàn)

    操作系統(tǒng)--磁盤調(diào)度算法(FCFSSSTFSCANCSCAN)Java實現(xiàn)

    一、先來先服務算法(FCFS) 根據(jù)進程請求訪問磁盤的先后次序進行調(diào)度。 二、最短時間優(yōu)先算法(SSTF) 選擇調(diào)度處理的磁道是與當前磁頭所在磁道距離最近的磁道,以使每次的尋找時間最短。 三、掃描算法(SCAN) 在磁頭當前移動方向上選擇與當前磁頭所在磁道距離最近的請求作

    2024年02月08日
    瀏覽(20)
  • 頁面置換算法模擬實現(xiàn)-操作系統(tǒng)課程設計基于Java

    頁面置換算法模擬實現(xiàn)-操作系統(tǒng)課程設計基于Java

    存儲管理的主要功能之一是合理的分配空間,請求頁式存儲管理是一種常用的虛擬存儲管理技術(shù)。在地址映射過程中,若在頁表中發(fā)現(xiàn)所要訪問的頁面不在內(nèi)存,則產(chǎn)生中斷,當發(fā)生中斷時,系統(tǒng)必須在內(nèi)存選擇一個頁面移出內(nèi)存,調(diào)用頁面置換算法,以便為調(diào)入新的頁面讓

    2024年02月07日
    瀏覽(29)
  • 操作系統(tǒng)銀行家算法(JAVA/Python/C#/JavaScript/C/C++)代碼實現(xiàn)

    操作系統(tǒng)銀行家算法(JAVA/Python/C#/JavaScript/C/C++)代碼實現(xiàn)

    銀行家算法是一種資源分配和死鎖避免算法,它通過模擬所有資源的預定最大可能數(shù)量的分配來測試安全性,然后進行“s狀態(tài)”檢查以測試可能的活動,然后決定是否應該允許繼續(xù)分配。 Banker’s algorithm?之所以叫“銀行家算法”,是因為它在銀行系統(tǒng)中被用來檢查貸款是否

    2024年02月06日
    瀏覽(42)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之LRU: 實現(xiàn) LRU 緩存算法功能 (Javascript版)

    關(guān)于LRU緩存 LRU - Lease Recently Used 最近使用 如果內(nèi)存優(yōu)先,只緩存最近使用的,刪除 ‘沉睡’ 數(shù)據(jù) 核心 api: get set 分析 使用哈希表來實現(xiàn), O(1) 必須是有序的,常用放在前面,沉睡放在后面, 即:有序,可排序 這樣 {} 不符合要求;Map是可以排序的,按照設置順序 不用 Map 如何

    2024年02月06日
    瀏覽(30)
  • Go實現(xiàn)LRU算法

    Go實現(xiàn)LRU算法

    ??LRU是內(nèi)存淘汰策略,LRU (Least recently used:最近最少使用)算法在緩存寫滿的時候,會根據(jù)所有數(shù)據(jù)的訪問記錄,淘汰掉未來被訪問幾率最低的數(shù)據(jù)。也就是說該算法認為,最近被訪問過的數(shù)據(jù),在將來被訪問的幾率最大。 那LRU使用什么實現(xiàn)的呢?雙鏈表的話,那查詢的

    2024年01月25日
    瀏覽(15)
  • 面試遇到算法題:實現(xiàn)LRU緩存

    面試遇到算法題:實現(xiàn)LRU緩存

    請你設計并實現(xiàn)一個滿足 LRU (最近最少使用) 緩存約束的數(shù)據(jù)結(jié)構(gòu)。 這是一道大廠面試高頻出現(xiàn)的算法題,難度為??????,屬于中等,老鐵們來一起看看這個題該怎么解? 沒有廢話,翠花,上酸菜! 為了實現(xiàn)一個滿足 LRU (最近最少使用)緩存約束的數(shù)據(jù)結(jié)構(gòu),我們需

    2024年04月25日
    瀏覽(28)
  • LRU頁面置換算法(C語言實現(xiàn))

    LRU頁面置換算法(C語言實現(xiàn))

    1 、實驗目的 ( 1 )熟悉虛擬存儲器頁面置換過程; ( 2 )通過編寫和調(diào)試頁面置換算法的模擬程序以加深對頁面置換算法的理解; ( 3 )掌握 LRU 算法的原理; ( 4 )熟悉 OPT 和 FIFO 頁面置換算法原理。 2 、 實驗要求 ?? ??? 編寫并調(diào)試一個頁面置換模擬程序,采用 LR

    2024年02月11日
    瀏覽(10)
  • 操作系統(tǒng)實驗—進程調(diào)度算法(java)

    操作系統(tǒng)實驗—進程調(diào)度算法(java)

    目錄 文章目錄 前言 一、實驗原理 二、實驗步驟 1.創(chuàng)建PCB類 2.創(chuàng)建創(chuàng)建類 3.設計主窗口類 4.調(diào)度界面函數(shù) 5.算法類及其調(diào)度算法通用函數(shù) 6.進程調(diào)度算法函數(shù) 總結(jié) 操作系統(tǒng)實驗1:進程調(diào)度算法,步驟3、4在一個類中,步驟5、6在一個類中。 (1)先到先服務調(diào)度算法:按照進程提

    2024年02月04日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包