91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript怎么實現LRU緩存淘汰算法

發布時間:2023-04-26 11:25:54 來源:億速云 閱讀:118 作者:iii 欄目:開發技術

這篇文章主要講解了“JavaScript怎么實現LRU緩存淘汰算法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript怎么實現LRU緩存淘汰算法”吧!

如何實現LRU緩存淘汰算法?

LRU(Least Recently Used)緩存淘汰算法是一種常見的緩存淘汰策略,它的核心思想是優先淘汰最近最少使用的緩存數據,以保證緩存中的數據始終是最熱門的。

使用哈希表和雙向鏈表

LRU緩存淘汰算法的核心在于如何快速定位最近最少使用的緩存數據,這可以通過哈希表和雙向鏈表的結合來實現。具體來說,我們可以使用一個哈希表來存儲緩存數據的鍵值對,同時使用一個雙向鏈表來維護緩存數據的訪問順序,每次訪問緩存時,我們將訪問的數據節點移動到鏈表頭,當緩存滿時,淘汰鏈表尾部的節點即可。

哈希表實現LRU緩存淘汰算法

下面是一個使用哈希表實現LRU緩存淘汰算法的例子,假設我們要實現一個最大容量為3的緩存:

import java.util.HashMap;
import java.util.Map;

class LRUCache<K, V> {
    private int capacity;
    private Map<K, Node<K,V>> cache;
    private Node<K,V> head;
    private Node<K,V> tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.cache = new HashMap<>();
        this.head = new Node<>(null, null);
        this.tail = new Node<>(null, null);
        this.head.next = this.tail;
        this.tail.prev = this.head;
    }

    public V get(K key) {
        if (!cache.containsKey(key)) {
            return null;
        }
        Node<K,V> node = cache.get(key);
        remove(node);
        addFirst(node);
        return node.value;
    }

    public void put(K key, V value) {
        if (cache.containsKey(key)) {
            Node<K,V> node = cache.get(key);
            node.value = value;
            remove(node);
            addFirst(node);
        } else {
            if (cache.size() == capacity) {
                Node<K,V> node = removeLast();
                cache.remove(node.key);
            }
            Node<K,V> node = new Node<>(key, value);
            cache.put(key, node);
            addFirst(node);
        }
    }

    private void remove(Node<K,V> node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }

    private void addFirst(Node<K,V> node) {
        node.next = head.next;
        node.prev = head;
        head.next.prev = node;
        head.next = node;
    }

    private Node<K,V> removeLast() {
        Node<K,V> node = tail.prev;
        remove(node);
        return node;
    }

    private static class Node<K, V> {
        K key;
        V value;
        Node<K,V> prev;
        Node<K,V> next;

        public Node(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
}

在這個例子中,我們使用了一個哈希表cache來存儲緩存數據的鍵值對,同時使用了一個雙向鏈表來維護緩存數據的訪問順序,其中headtail分別表示鏈表頭和鏈表尾,每次訪問緩存時,我們將訪問的數據節點移動到鏈表頭,當緩存滿時,淘汰鏈表尾部的節點即可。

注意,為了方便起見,我們在鏈表頭和鏈表尾分別添加了一個哨兵節點headtail,這樣就不需要在代碼中處理鏈表為空的情況了。

下面是一個使用雙向鏈表實現LRU緩存淘汰算法的例子,假設我們要實現一個最大容量為3的緩存:

import java.util.HashMap;
import java.util.Map;

class LRUCache<K, V> {
    private int capacity;
    private Map<K, Node<K,V>> cache;
    private Node<K,V> head;
    private Node<K,V> tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.cache = new HashMap<>();
        this.head = new Node<>(null, null);
        this.tail = new Node<>(null, null);
        this.head.next = this.tail;
        this.tail.prev = this.head;
    }

    public V get(K key) {
        if (!cache.containsKey(key)) {
            return null;
        }
        Node<K,V> node = cache.get(key);
        remove(node);
        addFirst(node);
        return node.value;
    }

    public void put(K key, V value) {
        if (cache.containsKey(key)) {
            Node<K,V> node = cache.get(key);
            node.value = value;
            remove(node);
            addFirst(node);
        } else {
            if (cache.size() == capacity) {
                Node<K,V> node = removeLast();
                cache.remove(node.key);
            }
            Node<K,V> node = new Node<>(key, value);
            cache.put(key, node);
            addFirst(node);
        }
    }

    private void remove(Node<K,V> node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }

    private void addFirst(Node<K,V> node) {
        node.next = head.next;
        node.prev = head;
        head.next.prev = node;
        head.next = node;
    }

    private Node<K,V> removeLast() {
        Node<K,V> node = tail.prev;
        remove(node);
        return node;
    }

    private static class Node<K, V> {
        K key;
        V value;
        Node<K,V> prev;
        Node<K,V> next;

        public Node(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
}

在這個例子中,我們使用了一個哈希表cache來存儲緩存數據的鍵值對,同時使用了一個雙向鏈表來維護緩存數據的訪問順序,其中headtail分別表示鏈表頭和鏈表尾,每次訪問緩存時,我們將訪問的數據節點移動到鏈表頭,當緩存滿時,淘汰鏈表尾部的節點即可。

注意,為了方便起見,我們在鏈表頭和鏈表尾分別添加了一個哨兵節點headtail,這樣就不需要在代碼中處理鏈表為空的情況了。

感謝各位的閱讀,以上就是“JavaScript怎么實現LRU緩存淘汰算法”的內容了,經過本文的學習后,相信大家對JavaScript怎么實現LRU緩存淘汰算法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

车致| 漳浦县| 淳安县| 广汉市| 石首市| 仁化县| 龙南县| 凌海市| 渭源县| 区。| 伊春市| 闽侯县| 城固县| 黄石市| 贺兰县| 阿拉善盟| 舟曲县| 新安县| 本溪| 瑞安市| 蛟河市| 清河县| 博客| 肥乡县| 洪湖市| 潼关县| 大安市| 东山县| 横山县| 贵阳市| 黄浦区| 光泽县| 宁陵县| 临西县| 平昌县| 五指山市| 锦屏县| 始兴县| 芮城县| 平远县| 甘德县|