当前位置: 首页 > 编程笔记 >

在Python中实现最少使用的缓存的程序

百里业
2023-03-14
本文向大家介绍在Python中实现最少使用的缓存的程序,包括了在Python中实现最少使用的缓存的程序的使用技巧和注意事项,需要的朋友参考一下

假设我们要为最不常用(LFU)缓存系统实现数据结构。它应支持以下操作:

  • get(key) −如果密钥存在于高速缓存中,则这有助于获取密钥的值,否则返回-1。

  • set(key, value) −如果密钥不存在,将用于设置或插入值。

当缓存达到最大容量时,它应在插入新元素之前使最不常用的元素无效。

因此,如果使用容量2初始化LFUCache并调用这些方法cache.set(1,1); cache.set(2,2); cache.get(1); cache.set(3,3); cache.get(2); cache.set(4,4); cache.get(1); cache.get(3); cache.get(4); 那么输出将分别为1,-1,1,-1,4。

为了解决这个问题,我们将遵循以下步骤-

  • 初始化程序将获取容量值

  • 保持:=容量

  • Minimum_freq:= 1

  • node_for_freq:=一个根据插入顺序保存数据的映射

  • node_for_key:=一个新映射

  • 定义一个功能_update()。这将需要关键,价值

  • x,freq:= node_for_key [key]

  • 从node_for_freq [freq]中删除与键对应的元素

  • 如果node_for_freq [least_freq]的大小等于0,则

    • minimum_freq:= Minimum_freq + 1

  • node_for_freq [freq + 1,key]:=值,freq + 1

  • node_for_key [key]:=值,freq + 1

  • 定义一个功能get()。这将需要关键

  • 如果不在node_for_key中的密钥为非零,则

    • 返回-1

  • 值:= node_for_key [key,0]

  • _update(key, value)

  • 返回值

  • 定义一个功能set()。这将需要关键,价值

  • 如果node_for_key中的密钥为非零,则

    • _update(key, value)

  • 除此以外,

    • 保持:=保持− 1

    • 已删除:=按照FIFO顺序从node_for_freq [least_freq]中删除一个元素

    • node_for_key中的delete元素对应于已删除的键[0]

    • node_for_key [key]:= value,1

    • node_for_freq [1,键]:=值,1

    • 如果保持等于0,则

    • 除此以外,

    • Minimum_freq:= 1

    让我们看下面的实现以更好地理解-

    示例

    from collections import defaultdict, OrderedDict
    class LFUCache:
       def __init__(self, capacity):
          self.remain = capacity
          self.least_freq = 1
          self.node_for_freq = defaultdict(OrderedDict)
          self.node_for_key = dict()
       def _update(self, key, value):
          _, freq = self.node_for_key[key]
          self.node_for_freq[freq].pop(key)
          if len(self.node_for_freq[self.least_freq]) == 0:
             self.least_freq += 1
          self.node_for_freq[freq+1][key] = (value, freq+1)
          self.node_for_key[key] = (value, freq+1)
       def get(self, key):
          if key not in self.node_for_key:
             return −1
          value = self.node_for_key[key][0]
          self._update(key, value)
          return value
       def set(self, key, value):
          if key in self.node_for_key:
             self._update(key, value)
          else:
             self.node_for_key[key] = (value,1)
             self.node_for_freq[1][key] = (value,1)
             if self.remain == 0:
                removed =
    self.node_for_freq[self.least_freq].popitem(last=False)
                self.node_for_key.pop(removed[0])
             else:
                self.remain −= 1
             self.least_freq = 1
    cache = LFUCache(2)
    cache.set(1, 1)
    cache.set(2, 2)
    print(cache.get(1))
    cache.set(3, 3)
    print(cache.get(2))
    cache.set(4, 4)
    print(cache.get(1))
    print(cache.get(3))
    print(cache.get(4))

    输入值

    cache.set(1, 1)
    cache.set(2, 2)
    cache.get(1)
    cache.set(3, 3)
    cache.get(2)
    cache.set(4, 4)
    cache.get(1)
    cache.get(3)
    cache.get(4)
    输出结果
    1
    −1
    1
    −1
    4

     类似资料:
    • 问题内容: 最少使用(LFU)是一种高速缓存算法,用于管理计算机内的内存。此方法的标准特性涉及系统跟踪内存中块被引用的次数。当缓存已满且需要更多空间时,系统将以最低参考频率清除项目。 例如,用Java来实现最近使用的对象缓存的最佳方法是什么? 我已经使用LinkedHashMap实现了一个(通过保持访问对象的次数),但是我很好奇是否有任何新的并发集合会更好。 考虑这种情况:假设缓存已满,我们需要为

    • 问题内容: 我一直在研究一个网页,该网页显示我在天蓝色云中的数据库中的表。为了减少直接调用数据库以提高性能,我想为页面建立一个缓存。当前,我为表的 读取 保留了一个内存中的缓存(进程内)。现在,我要创建一个进程外缓存,该缓存应在进行 写 操作时进行更新,这意味着插入或更新(因为在更新或添加了一个值之后,内存中缓存将不再有效)。 我被推荐使用Redis,尤其是Book Sleeve,我的问题是在哪里

    • 本文向大家介绍SpringBoot使用Redis缓存的实现方法,包括了SpringBoot使用Redis缓存的实现方法的使用技巧和注意事项,需要的朋友参考一下 (1)pom.xml引入jar包,如下:   (2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:   (3)application.properties中配置Redis连接信息,如下:   (4)新建Redis

    • 问题内容: 我试图使用LinkedHashMap实现LRU缓存。在LinkedHashMap的文档(http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html)中,它表示: 请注意,如果将密钥重新插入到映射中,则插入顺序不会受到影响。 但是当我做以下推 输出是 这表明重新插入确实影响了订单。有人知道任何解释吗? 问题答

    • 问题内容: 我想在Web Java应用程序中实现重量级对象的简单缓存。但是我不知道该怎么做。 我是否缺少某些东西或ConcurrentHashMap方法(putIfAbsent等)还不够,是否需要额外的同步? 是否有更好的简单API(在内存存储中,没有外部配置)来执行此操作? P. 问题答案: 如果为要缓存的内容临时拥有多个实例是安全的,则可以执行“无锁”缓存,如下所示: 多个线程可以“竞争”来创

    • null 将整个object1作为完整的JSON存储在my key下。 将object2与它自己的键一起存储在我的object1序列化中,以将object2键作为引用,并且当从缓存中拉回时,也通过它的键拉出object2。 我觉得选项1是最好的实践,也是最有效的,但我有第二个想法,将大的嵌套对象存储在on键下。