文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

LeetCode上的Java缓存算法题解析

2023-06-28 05:47

关注

在现代计算机系统中,缓存是一个非常重要的概念。缓存可以缓解计算机系统中的瓶颈,提高计算机系统的性能。缓存算法是缓存的核心,它决定了缓存如何存储、管理和使用数据。在本文中,我们将探讨LeetCode上的Java缓存算法题,并提供相应的解析和代码示例。

题目描述

题目链接:https://leetcode.com/problems/lru-cache/

题目描述:

设计和实现一个LRU(最近最少使用)缓存数据结构,它支持两个操作:

get(key) - 如果key存在于缓存中,则获取key的值(总是正数),否则返回-1。

put(key, value) - 如果key不存在,则插入其值。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目无效。

算法分析

对于这个问题,我们可以使用一个双向链表和一个哈希表来实现。哈希表用于快速查找缓存数据,而双向链表用于维护缓存的顺序。

在双向链表中,每个节点表示一个缓存项,其中节点的键存储缓存项的键,节点的值存储缓存项的值。链表的头部表示最近使用的缓存项,链表的尾部表示最近最少使用的缓存项。当缓存达到其容量时,我们将删除链表的尾部节点,因为它表示最近最少使用的缓存项。

当我们访问缓存时,我们首先在哈希表中查找键。如果键存在于哈希表中,则我们可以通过哈希表找到对应的节点,并将其移动到链表的头部。如果键不存在于哈希表中,则我们返回-1。

当我们插入一个新的缓存项时,我们首先在哈希表中查找键。如果键已经存在于哈希表中,则我们更新对应的节点,并将其移动到链表的头部。否则,我们创建一个新的节点,并将其插入到链表的头部和哈希表中。如果插入新的节点后,缓存的大小超过了容量,则删除链表的尾部节点。

代码实现

下面是一个Java实现的示例代码,它实现了上述的算法。

class LRUCache {
    class ListNode {
        int key;
        int value;
        ListNode prev;
        ListNode next;
    }

    private Map<Integer, ListNode> map;
    private int capacity;
    private int count;
    private ListNode head;
    private ListNode tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.count = 0;
        this.head = new ListNode();
        this.tail = new ListNode();
        this.head.next = this.tail;
        this.tail.prev = this.head;
        this.map = new HashMap<>();
    }

    private void addNode(ListNode node) {
        node.prev = this.head;
        node.next = this.head.next;
        this.head.next.prev = node;
        this.head.next = node;
    }

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

    private void moveToHead(ListNode node) {
        this.removeNode(node);
        this.addNode(node);
    }

    private ListNode popTail() {
        ListNode node = this.tail.prev;
        this.removeNode(node);
        return node;
    }

    public int get(int key) {
        ListNode node = this.map.get(key);
        if (node == null) {
            return -1;
        }
        this.moveToHead(node);
        return node.value;
    }

    public void put(int key, int value) {
        ListNode node = this.map.get(key);
        if (node == null) {
            node = new ListNode();
            node.key = key;
            node.value = value;
            this.map.put(key, node);
            this.addNode(node);
            this.count++;
            if (this.count > this.capacity) {
                ListNode tail = this.popTail();
                this.map.remove(tail.key);
                this.count--;
            }
        } else {
            node.value = value;
            this.moveToHead(node);
        }
    }
}

总结

缓存是计算机系统中的一个重要概念。缓存算法是缓存的核心,它决定了缓存如何存储、管理和使用数据。在本文中,我们探讨了LeetCode上的Java缓存算法题,并提供了相应的解析和代码示例。通过学习本题,我们可以深入理解缓存算法的实现原理,并提高对缓存的应用能力。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯