IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LRU缓存淘汰算法(Python) -> 正文阅读

[数据结构与算法]LRU缓存淘汰算法(Python)

使用哈希链表实现,而哈希链表由双向链表和哈希表构建。
参考自算法就像搭乐高:带你手撸 LRU 算法

class Node:
    """
    节点类
    """

    def __init__(self, k, v):
        self.k = k
        self.v = v
        self.next = None
        self.prev = None


class DoubleList:
    """
    双向链表
    """

    def __init__(self):
        self.head = Node(0, 0)
        self.tail = Node(0, 0)
        self.head.next = self.tail
        self.tail.prev = self.head
        self.size = 0

    def addLast(self, x):
        """
        尾部添加节点
        :param x:
        :return:
        """
        x.next = self.tail
        x.prev = self.tail.prev
        self.tail.prev.next = x
        self.tail.prev = x
        self.size += 1

    def remove(self, x):
        """
        删除节点
        :param x:
        :return:
        """
        x.prev.next = x.next
        x.next.prev = x.prev
        self.size -= 1

    def removeFirst(self):
        """
        删除列表的第一个节点
        :return:
        """
        first = self.head.next
        if first == self.tail:
            return None
        self.remove(first)
        return first

    def length(self):
        """
        列表长度
        :return:
        """
        return self.size


class LRUCache:
    """
    LRU类
    """

    def __init__(self, capacity):
        self.capacity = capacity
        self.cache = DoubleList()
        self.map = {}

    def get(self, key):
        """
        获取key
        :param key:
        :return:
        """
        if not self.map.get(key):
            return -1
        self.makeRecently(key)
        return self.map.get(key).v

    def put(self, key, val):
        """
        添加或修改类
        :param key:
        :param val:
        :return:
        """
        if self.map.get(key):
            self.deleteKey(key)
            self.addRecently(key, val)
            return
        if self.cache.length() == self.capacity:
            self.removeLeaseRecently()
        self.addRecently(key, val)

    def makeRecently(self, key):
        """
        将节点提升为最近使用的
        :param key:
        :return:
        """
        node = self.map.get(key)
        self.cache.remove(node)
        self.cache.addLast(node)

    def deleteKey(self, key):
        """
        删除key
        :param key:
        :return:
        """
        node = self.map.get(key)
        self.cache.remove(node)
        self.map.pop(key)

    def removeLeaseRecently(self):
        """
        删除最久未使用的
        :return:
        """
        node = self.cache.removeFirst()
        self.map.pop(node.k)

    def addRecently(self, key, val):
        """
        添加最新使用的
        :param key:
        :param val:
        :return:
        """
        node = Node(key, val)
        self.cache.addLast(node)
        self.map[key] = node


lru = LRUCache(2)
print(lru.get(1))
lru.put(1, 2)
print(lru.get(1))
lru.put(2, 3)
lru.put(3, 4)
print(lru.cache.tail.prev.k, lru.cache.tail.prev.v)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:24:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:29:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码