Python实现FIFO缓存置换算法

 更新时间:2022年05月25日 13:20:03   作者:旺旺小小超  
这篇文章主要为大家详细介绍了Python实现FIFO(先进先出)缓存置换算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Python实现FIFO缓存置换算法的具体代码,供大家参考,具体内容如下

在上一节中我们实现了双向链表DoubleLinkedList类,本节我们基于双向链表实现FIFO(先进先出)缓存置换算法。

一、FIFO实现

代码逻辑很简单,就是遵循先进先出的原则,具体流程都写在注释中了。通过一个map来实现查找时的O(1)复杂度

class FIFOCache(object):

    def __init__(self, capacity=0xffffffff):
        """
        FIFO缓存置换算法
        :param capacity:
        """
        self.capacity = capacity
        self.map = {}
        self.size = 0
        self.list = DoubleLinkedList(capacity)

    def get(self, key):
        """
        获取元素
            不存在 返回None
            已存在 则返回缓存值
        :param key:
        :return:
        """
        # 当前缓存中不存在
        if key not in self.map:
            return None

        # 当前缓存中存在
        node = self.map.get(key)

        return node.value

    def put(self, key, value):
        """
        添加元素
            已存在 更新值并添加至链表尾部
            不存在 判断缓存容量大小后添加
        :param key:
        :param value:
        :return: 已添加的节点
        """
        # 当前缓存中已存在
        if key in self.map:
            node = self.map.get(key)
            self.list.remove(node)
            node.value = value
            self.list.append(node)
        else:
            # 缓存容量达到上限 删除头结点
            if self.size >= self.capacity:
                old_node = self.list.pop()
                del self.map[old_node.key]
                self.size -= 1

            node = Node(key, value)
            self.map[key] = node
            self.list.append(node)
            self.size += 1

        return node

    def print(self):
        """
        打印当前链表
        :return:
        """
        self.list.print()
        # print(self.map)

二、测试逻辑

if __name__ == '__main__':
    fifo_cache = FIFOCache(2)
    fifo_cache.put(1, 1)
    fifo_cache.print()
    fifo_cache.put(2, 2)
    fifo_cache.print()
    print(fifo_cache.get(2))
    fifo_cache.put(3, 3)
    fifo_cache.print()
    print(fifo_cache.get(1))
    fifo_cache.put(2, 4)
    fifo_cache.print()

测试结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python 实现将大图切片成小图,将小图组合成大图的例子

    Python 实现将大图切片成小图,将小图组合成大图的例子

    这篇文章主要介绍了Python 实现将大图切片成小图,将小图组合成大图的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python连接mysql数据库的正确姿势

    Python连接mysql数据库的正确姿势

    这篇文章主要为大家详细介绍了Python连接mysql数据库的正确姿势,如何使用Python连接mysql数据库,本文为大家揭晓,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Python输入二维数组方法

    Python输入二维数组方法

    下面小编就为大家分享一篇Python输入二维数组方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 使用Python函数进行模块化的实现

    使用Python函数进行模块化的实现

    这篇文章主要介绍了使用Python函数进行模块化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 浅谈Python实现2种文件复制的方法

    浅谈Python实现2种文件复制的方法

    这篇文章主要介绍了浅谈Python实现2种文件复制的方法,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 详解python  OpenCV如何使用背景分离方法

    详解python  OpenCV如何使用背景分离方法

    这篇文章主要为大家介绍了python OpenCV如何使用背景分离方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • python获取全国最新省市区数据并存入表实例代码

    python获取全国最新省市区数据并存入表实例代码

    我们在开发中经常会遇到获取省市区等信息的时候,下面这篇这篇文章主要给大家介绍了关于python获取全国最新省市区数据并存入表的相关资料,需要的朋友可以参考下
    2021-08-08
  • Python使用atexit模块实现Golang的defer功能

    Python使用atexit模块实现Golang的defer功能

    这篇文章主要为大家详细介绍了Python如何使用atexit模块实现Golang的defer功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • tensorflow pb to tflite 精度下降详解

    tensorflow pb to tflite 精度下降详解

    这篇文章主要介绍了tensorflow pb to tflite 精度下降详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python实现A*寻路算法

    python实现A*寻路算法

    A*算法可以显示寻路图,两点之间寻找最短路径,本文使用Python实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论