如何使用Python实现链表的LRU缓存操作

2023-04-11 00:00:00 缓存 链表 如何使用

LRU(Least Recently Used)缓存是指缓存数据下次被使用的时间距离上一次被使用时间最长的数据,当缓存空间满时,会将最久未被使用的数据从缓存中删除。在实现LRU缓存时,需要使用链表的数据结构,Python中可以使用collections模块中的OrderedDict来实现。

OrderedDict是Python中的一个有序字典类,它可以记录元素添加的顺序,并且支持按顺序访问元素。我们可以利用这个特性来实现LRU缓存,将缓存的数据保存在OrderedDict中,当缓存已满时,将最久未被使用的数据从OrderedDict中删除即可。

下面是Python实现链表的LRU缓存操作的代码演示:

from collections import OrderedDict

class LRUCache(object):
    def __init__(self, capacity):
        """
        :type capacity: int
        """
        self.capacity = capacity
        self.cache = OrderedDict()

    def get(self, key):
        """
        :type key: int
        :rtype: int
        """
        if key not in self.cache:
            return -1
        value = self.cache.pop(key)
        self.cache[key] = value
        return value

    def put(self, key, value):
        """
        :type key: int
        :type value: int
        :rtype: void
        """
        if key in self.cache:
            self.cache.pop(key)
        elif len(self.cache) == self.capacity:
            self.cache.popitem(last=False)
        self.cache[key] = value

在LRUCache类的构造函数中,我们定义了一个容量变量capacity和一个OrderedDict类型的字典cache。get方法用于获取缓存中key对应的value值,并将其移动到OrderedDict的末尾,以表示该数据被最近使用。put方法用于向缓存中添加数据,在添加数据之前,我们需要判断缓存是否已满,如果已满则删除最早未被使用的数据,并将新数据添加到OrderedDict末尾。如果已经存在则将其从OrderedDict中移除并添加新的数据。

下面是使用字符串“pidancode.com”、“皮蛋编程”进行测试的代码:

cache = LRUCache(2)
cache.put("pidancode.com", 1)
cache.put("皮蛋编程", 2)
print(cache.get("pidancode.com")) # 1
cache.put("火锅技术", 3)
print(cache.get("皮蛋编程")) # -1
print(cache.get("火锅技术")) # 3
cache.put("肉蟹煲", 4)
print(cache.get("pidancode.com")) # -1

在这个范例中,LRUCache的容量为2,我们先将“pidancode.com”和“皮蛋编程”两个数据加入缓存,然后通过get方法获取“pidancode.com”值,再将“火锅技术”加入缓存,此时缓存已满,需要删除最早未被使用的数据,即“皮蛋编程”,接着我们尝试获取“皮蛋编程”值,得到结果为-1,表示该数据已不存在于缓存中,然后我们再次获取“火锅技术”的值,获取到了3,表示该数据被成功加入到缓存中,最后我们再次尝试获取“pidancode.com”的值,得到结果为-1,因为该数据已经被删除了。

相关文章