Python实现LRU算法

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

在第一节中已经实现了双向链表DoubleLinkedList类,本节我们基于双向链表实现LRU(Least Recently Used最近最少使用)缓存置换算法。Redis的淘汰机制就包括LRU算法,用来淘汰那些最近最少使用的数据,具体怎么使用可在redis的配置文件中设置。

一、LRU算法的实现

逻辑很简单,get和put两种操作,其中get时如果元素存在则将节点从当前位置移到链表头部,表示最近被访问到的节点;put时也是,不管节点之前存不存在都要移动到链表头部。同样通过一个map来实现查找时的O(1)复杂度。

class LRUCache(object):

    def __init__(self, capacity=0xffffffff):
        """
        LRU缓存置换算法 最近最少使用
        :param capacity:
        """
        self.capacity = capacity
        self.size = 0
        self.map = {}
        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)
        self.list.remove(node)
        self.list.append_front(node)

        return node.value

    def put(self, key, value):
        """
        添加元素
            被添加的元素已存在 更新元素值并已到链表头部
            被添加的元素不存在
                链表容量达到上限 删除尾部元素
                链表容量未达上限 添加至链表头部
        :param key:
        :param value:
        :return:
        """
        if key in self.map:
            node = self.map.get(key)
            node.value = value
            self.list.remove(node)
            self.list.append_front(node)
        else:
            if self.size >= self.capacity:
                old_node = self.list.remove()
                del self.map[old_node.key]
                self.size -= 1

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

        return node

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

二、测试逻辑

if __name__ == '__main__':
    lru_cache = LRUCache(3)
    lru_cache.put(1, 1)
    lru_cache.print()
    lru_cache.put(2, 2)
    lru_cache.print()
    print(lru_cache.get(1))
    lru_cache.print()
    lru_cache.put(3, 3)
    lru_cache.print()
    lru_cache.put(1, 100)
    lru_cache.print()
    lru_cache.put(4, 4)
    lru_cache.print()
    print(lru_cache.get(1))
    lru_cache.print()

测试结果:

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

相关文章

  • 教你用python实现一个无界面的小型图书管理系统

    教你用python实现一个无界面的小型图书管理系统

    今天带大家学习怎么用python实现一个无界面的小型图书管理系统,文中有非常详细的图文解说及代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Python的输入,输出和标识符详解

    Python的输入,输出和标识符详解

    这篇文章主要介绍了介绍了Python的输入,输出和标识符,有需要的朋友们可以参考一下,希望能给您带来帮助
    2022-01-01
  • Python中可变变量与不可变变量详解

    Python中可变变量与不可变变量详解

    这篇文章主要介绍了Python中可变变量与不可变变量,但Python中没有指针和引用的概念,导致很多时候参数的传递和调用的时候会产生疑问:我到底是复制了一份新的做操作还是在它指向的内存操作?下面我们就带着疑问去阅读下面文章内容吧
    2021-10-10
  • python调用机器喇叭发出蜂鸣声(Beep)的方法

    python调用机器喇叭发出蜂鸣声(Beep)的方法

    这篇文章主要介绍了python调用机器喇叭发出蜂鸣声(Beep)的方法,实例分析了Python调用winsound模块的使用技巧,需要的朋友可以参考下
    2015-03-03
  • 深入浅析python继承问题

    深入浅析python继承问题

    这篇文章主要介绍了深入浅析python继承问题的相关资料,非常不错,感兴趣的朋友一起看看吧
    2016-05-05
  • 在Python中通过getattr获取对象引用的方法

    在Python中通过getattr获取对象引用的方法

    今天小编就为大家分享一篇在Python中通过getattr获取对象引用的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python疲劳驾驶困倦低头检测功能的实现

    python疲劳驾驶困倦低头检测功能的实现

    这篇文章主要介绍了python疲劳驾驶困倦低头检测,该系统可以检测一个人在开车时是否困倦,及时提醒,做到安全隐患排查,对实现代码感兴趣的朋友一起看看吧
    2022-04-04
  • 使用Python的Zato发送AMQP消息的教程

    使用Python的Zato发送AMQP消息的教程

    这篇文章主要介绍了使用Python的Zato发送AMQP消息的教程,主要是基于一些Zato的图形化界面进行操作,需要的朋友可以参考下
    2015-04-04
  • Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解

    虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好。它已经不适合现在的时代,不适合现代的互联网了。而Requests的诞生让我们有了更好的选择。本文就介绍了Python中第三方库Requests库的高级用法。
    2017-03-03
  • Python全栈之学习JS(3)

    Python全栈之学习JS(3)

    这篇文章主要为大家介绍了Python全栈之JS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论