成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在C#中實(shí)現(xiàn)LRU緩存,你學(xué)會(huì)了嗎?

開(kāi)發(fā) 前端
LRUCache?類通過(guò)結(jié)合字典和雙向鏈表高效管理固定大小的緩存,實(shí)現(xiàn)了Get和Put操作的O(1)時(shí)間復(fù)雜度,適用于高性能應(yīng)用程序。

引言

LRU(比較少用)緩存是一種數(shù)據(jù)結(jié)構(gòu),它存儲(chǔ)有限數(shù)量的項(xiàng)目,并在緩存達(dá)到容量限制時(shí)優(yōu)先移除最近最少使用的項(xiàng)目。本文介紹了如何在C#中使用字典和雙向鏈表相結(jié)合實(shí)現(xiàn)LRU緩存。

實(shí)現(xiàn)細(xì)節(jié)

LRUCache類使用字典來(lái)實(shí)現(xiàn)Get和Put操作的O(1)時(shí)間復(fù)雜度,并使用雙向鏈表來(lái)維護(hù)緩存項(xiàng)的使用順序。

以下是實(shí)現(xiàn)LRU緩存的兩種方法:

手動(dòng)雙向鏈表

在LRU緩存中,手動(dòng)雙向鏈表用于維護(hù)緩存項(xiàng)的使用順序。當(dāng)通過(guò)Get方法訪問(wèn)某個(gè)項(xiàng)目或通過(guò)Put方法添加/更新項(xiàng)目時(shí),該項(xiàng)目會(huì)被移動(dòng)到鏈表的末尾。這確保了最近使用的項(xiàng)目始終位于鏈表末尾,最近最少使用的項(xiàng)目位于鏈表開(kāi)頭,當(dāng)需要移除項(xiàng)目時(shí),首先移除這些項(xiàng)目。

public class LRUCache
{
    int Capacity;
    IDictionary<int, LRUNode> keyValuePairs;
    LRUNode head;
    LRUNode tail;

    public LRUCache(int capacity)
    {
        Capacity = capacity;
        keyValuePairs = new Dictionary<int, LRUNode>();
        head = new LRUNode(0, 0);
        tail = new LRUNode(0, 0);
        head.next = tail;
        tail.prev = head;
    }

    private void MoveToTail(LRUNode node)
    {
        RemoveNode(node);
        AddToTail(node);
    }

    private void RemoveNode(LRUNode node)
    {
        node.next.prev = node.prev;
        node.prev.next = node.next;
    }

    private void AddToTail(LRUNode node)
    {
        node.next = tail;
        node.prev = tail.prev;
        tail.prev.next = node;
        tail.prev = node;
    }

    public int Get(int key)
    {
        if (keyValuePairs.TryGetValue(key, out LRUNode node))
        {
            MoveToTail(node);
            return node.value;
        }
        return -1;
    }

    public void Put(int key, int value)
    {
        if (!keyValuePairs.TryGetValue(key, out LRUNode node))
        {
            if (keyValuePairs.Count == Capacity)
            {
                LRUNode lru = head.next;
                RemoveNode(lru);
                keyValuePairs.Remove(lru.key);
            }
            LRUNode newNode = new LRUNode(key, value);
            keyValuePairs[key] = newNode;
            AddToTail(newNode);
        }
        else
        {
            node.value = value;
            MoveToTail(node);
        }
    }
}

public class LRUNode
{
    public int key;
    public int value;
    public LRUNode prev;
    public LRUNode next;

    public LRUNode(int key, int value)
    {
        this.key = key;
        this.value = value;
    }
}

手動(dòng)雙向鏈表是實(shí)現(xiàn)LRU緩存的一種強(qiáng)大技術(shù),它提供了高效、可控的緩存項(xiàng)管理。通過(guò)手動(dòng)處理節(jié)點(diǎn)及其連接,此方法可確保緩存操作的最佳性能,適用于需要緩存的高性能應(yīng)用程序。

C#中的內(nèi)置鏈表

LRUCacheDLL類使用字典和內(nèi)置的雙向鏈表來(lái)實(shí)現(xiàn)LRU緩存。這種方法確保Get和Put操作的時(shí)間復(fù)雜度為O(1)。

類成員

  • capacity:定義緩存最多能存儲(chǔ)的項(xiàng)目數(shù)量。
  • keyValuePairs:一個(gè)字典,將鍵映射到鏈表中的對(duì)應(yīng)節(jié)點(diǎn),允許O(1)時(shí)間復(fù)雜度的節(jié)點(diǎn)訪問(wèn)。
  • dll:一個(gè)雙向鏈表,維護(hù)緩存項(xiàng)的使用順序。最近使用的項(xiàng)目位于鏈表末尾,最近最少使用的項(xiàng)目位于鏈表開(kāi)頭。

構(gòu)造函數(shù)

public LRUCacheDLL(int capacity)
{
    this.capacity = capacity;
    keyValuePairs = new Dictionary<int, LinkedListNode<(int key, int value)>>();
    dll = new LinkedList<(int key, int value)>();
}

Get方法

public int Get(int key)
{
    if (keyValuePairs.TryGetValue(key, out LinkedListNode<(int key, int value)> node))
    {
        dll.Remove(node);
        dll.AddLast(node);
        return node.Value.value;
    }
    return -1;
}

Put方法

public void Put(int key, int value)
{
    if (keyValuePairs.TryGetValue(key, out LinkedListNode<(int key, int value)> node))
    {
        dll.Remove(node);
        node.Value = (key, value);
        dll.AddLast(node);
    }
    else
    {
        if (keyValuePairs.Count == capacity)
        {
            keyValuePairs.Remove(dll.First.Value.key);
            dll.RemoveFirst();
        }
        keyValuePairs[key] = dll.AddLast((key, value));
    }
}

LRUCacheDLL類通過(guò)結(jié)合字典和雙向鏈表高效管理固定大小的緩存。這種實(shí)現(xiàn)確保Get和Put操作的時(shí)間復(fù)雜度為O(1),非常適合高性能應(yīng)用。

時(shí)間復(fù)雜度

  • Get操作:O(1)
  • Put操作:O(1)

空間復(fù)雜度

  • O(n),其中n是緩存的容量。

使用示例

LRUCache cache = new LRUCache(2);

cache.Put(1, 1);
cache.Put(2, 2);
Console.WriteLine("Get key 1: " + cache.Get(1));
cache.Put(3, 3);
Console.WriteLine("Get key 2: " + cache.Get(2));
cache.Put(4, 4);
Console.WriteLine("Get key 1: " + cache.Get(1));
Console.WriteLine("Get key 3: " + cache.Get(3));
Console.WriteLine("Get key 4: " + cache.Get(4));

輸出

圖片圖片

在此示例中,緩存初始化為容量2,存儲(chǔ)鍵值對(duì),并在超過(guò)容量時(shí)移除最近最少使用的項(xiàng)目。

結(jié)語(yǔ)

LRUCache類通過(guò)結(jié)合字典和雙向鏈表高效管理固定大小的緩存,實(shí)現(xiàn)了Get和Put操作的O(1)時(shí)間復(fù)雜度,適用于高性能應(yīng)用程序。

譯文地址:c-sharpcorner.com/article/implementing-an-lru-cache-in-c-sharp/

作者:Rajiv Singh

責(zé)任編輯:武曉燕 來(lái)源: DotNet開(kāi)發(fā)跳槽
相關(guān)推薦

2024-12-31 00:08:37

C#語(yǔ)言dynamic?

2024-09-10 10:34:48

2024-11-06 11:38:59

C#單例模式

2024-12-23 10:06:45

C#深拷貝技術(shù)

2024-12-05 08:31:10

2024-10-21 07:05:14

C#特性語(yǔ)言

2024-12-12 08:50:30

開(kāi)源多媒體框架

2024-05-07 07:58:47

C#程序類型

2024-05-17 08:42:52

AttributeMyClass方法

2022-06-16 07:50:35

數(shù)據(jù)結(jié)構(gòu)鏈表

2024-07-29 10:35:44

KubernetesCSI存儲(chǔ)

2024-07-03 08:15:39

C#字符串表達(dá)式

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺(tái)工具

2022-11-11 08:29:24

C語(yǔ)言中文字符代碼

2025-01-09 07:58:42

C#API函數(shù)

2024-11-28 09:59:35

2025-01-26 15:31:27

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久在线精品 | 亚洲欧美少妇 | 午夜电影福利 | 久久久精品久 | 久久久久中文字幕 | 狠狠草视频| 亚洲欧美中文日韩在线v日本 | 亚洲国产高清高潮精品美女 | 亚洲香蕉| 亚洲精品久久久9婷婷中文字幕 | 一级欧美视频 | 精品国产一区二区在线 | 欧美日韩视频在线第一区 | 在线看日韩 | 最新国产福利在线 | 亚洲欧美在线观看视频 | 精品一区二区av | av中文天堂 | 中文字幕 在线观看 | 成人免费大片黄在线播放 | 欧美韩一区二区三区 | 国产一区二| 日本不卡一区二区三区 | 九九99九九精彩46 | 精品久久久久久亚洲精品 | 真人女人一级毛片免费播放 | 韩国久久精品 | 午夜精品久久久久久久久久久久久 | 97伊人| 久久久精品亚洲 | 天天干天天草 | 日韩久久久一区二区 | 九九久久久 | 亚洲美女av网站 | 日本不卡免费新一二三区 | 欧美一级免费 | 99亚洲视频 | 久久精品小视频 | av中文字幕在线播放 | 蜜臀网| 国产无人区一区二区三区 |