当前位置: 首页 > news >正文

Python大厂笔试题:手写 LRU 缓存淘汰算法

大家好,我是锋哥。今天分享关于【Python大厂笔试题:手写 LRU 缓存淘汰算法】面试题。希望对大家有帮助;

Python大厂笔试题:手写 LRU 缓存淘汰算法

LRU(Least Recently Used,最少使用)缓存淘汰算法是一种常见的缓存管理策略,它的主要思想是:当缓存达到最大容量时,淘汰最久未被使用的缓存项。在一些实际应用中,比如数据库缓存、浏览器缓存等,LRU算法能有效提高缓存命中率,避免频繁地从磁盘或者数据库读取数据。

在Python中,我们可以通过不同的方式手写实现LRU缓存算法。下面将介绍如何使用Python实现LRU缓存,并给出代码示例。

LRU缓存的实现思路

  1. 数据结构的选择:

    • 为了高效地实现LRU缓存,我们需要在O(1)的时间复杂度内完成插入、删除以及查询操作。因此,可以使用双向链表(Doubly Linked List)和哈希表(Hash Map)的组合来实现LRU缓存。
      • 双向链表:可以让我们在O(1)时间内移除最久未使用的缓存项(即链表尾部)以及将缓存项移到最前面(表示最近使用)。
      • 哈希表:可以让我们在O(1)时间内访问缓存项。
  2. 操作说明:

    • get(key):返回缓存中存储的值,如果缓存中没有该key,返回-1。
    • put(key, value):插入缓存项,如果缓存已满,删除最久未使用的缓存项。

Python实现LRU缓存

我们将使用OrderedDict来实现LRU缓存,OrderedDict是Python内置的一个字典,它保持元素插入顺序。我们可以利用它提供的move_to_end方法来模拟LRU缓存中的访问顺序。

代码实现:
from collections import OrderedDict class LRUCache: def __init__(self, capacity: int): """ 初始化LRU缓存 :param capacity: 缓存的最大容量 """ self.capacity = capacity # 使用OrderedDict来保持缓存项的顺序 self.cache = OrderedDict() def get(self, key: int) -> int: """ 获取缓存中key对应的值,如果缓存中没有该key,返回-1 :param key: 键值 :return: 如果key存在则返回对应的值,否则返回-1 """ if key not in self.cache: return -1 else: # 将该key移动到OrderedDict的末尾,表示最近访问 self.cache.move_to_end(key) return self.cache[key] def put(self, key: int, value: int) -> None: """ 将key-value插入缓存 :param key: 键值 :param value: 值 """ if key in self.cache: # 如果缓存中已有该key,更新其值并将其移动到末尾 self.cache.move_to_end(key) elif len(self.cache) >= self.capacity: # 如果缓存满了,删除最旧的缓存(即OrderedDict的第一个元素) self.cache.popitem(last=False) # 将新的key-value添加到OrderedDict末尾 self.cache[key] = value # 示例使用: lru_cache = LRUCache(3) lru_cache.put(1, 1) # 缓存 = {1=1} lru_cache.put(2, 2) # 缓存 = {1=1, 2=2} lru_cache.put(3, 3) # 缓存 = {1=1, 2=2, 3=3} print(lru_cache.get(1)) # 返回 1, 缓存 = {2=2, 3=3, 1=1} lru_cache.put(4, 4) # 该操作会删除key 2, 缓存 = {3=3, 1=1, 4=4} print(lru_cache.get(2)) # 返回 -1 (未找到) print(lru_cache.get(3)) # 返回 3 lru_cache.put(5, 5) # 该操作会删除key 1, 缓存 = {3=3, 4=4, 5=5} print(lru_cache.get(1)) # 返回 -1 (未找到) print(lru_cache.get(4)) # 返回 4

代码解析

  1. 构造函数__init__

    • 初始化LRU缓存时,我们指定缓存的最大容量capacity,并使用OrderedDict来存储缓存项。OrderedDict能保持插入的顺序,方便我们访问最旧的元素。
  2. get方法:

    • 如果缓存中存在key,我们将它移到链表的尾部,表示最近访问,并返回其对应的值。如果缓存中没有key,返回-1
  3. put方法:

    • 如果缓存已满,首先删除最久未使用的缓存项(即OrderedDict中的第一个元素)。
    • 如果key已存在于缓存中,则更新其对应的值,并将其移到尾部(表示最近访问)。
    • 如果key不在缓存中,直接插入新的键值对。

复杂度分析

  • get(key)操作:

    • 时间复杂度是 O(1),因为我们使用了OrderedDict,并且访问是基于哈希表的查找。
  • put(key, value)操作:

    • 时间复杂度是 O(1),在最坏情况下,删除最久未使用的元素也是 O(1),而更新或者插入操作也是 O(1)。

最后总结下吧

LRU缓存是一种非常高效的缓存淘汰策略,适用于大多数需要缓存的场景。通过结合使用双向链表和哈希表,可以实现高效的缓存管理。Python提供的OrderedDict使得LRU缓存的实现变得非常简单且高效。如果需要更复杂的缓存策略,可以进一步扩展此基础实现。

http://www.jsqmd.com/news/438636/

相关文章:

  • pbootcms升级程序后报错 :Parse error: syntax error, unexpected :, expecting
  • Python基于flask的连锁超市购物会员商城系统_ka03zz59
  • 私域运营工具怎么选?小鹅通一站式SaaS方案解锁企业数字化增长新路径 - 资讯焦点
  • 【vllm】 scheduler 过程
  • springboot+vue游戏用品交易系统
  • springboot+vue研究生导师双选信息发布系统
  • Python基于flask的六盘水师范学院奖学金系统_o2868vmj_
  • 2026年专业的商用全套坚果加工设备,坚果深加工设备,坚果加工设备厂家口碑推荐清单 - 品牌鉴赏师
  • 2026年热门的坚果休闲食品生产线,入味坚果加工生产线,大型坚果成套生产线厂家品牌推荐清单 - 品牌鉴赏师
  • 2026年效果好微整形术后护理精华榜单:即时急救舒缓泛红促进创面修复+实测数据优选 - 资讯焦点
  • Python基于flask的四六级英语学习系统小程序_cf4sz0e7
  • springboot+vue研究生科研文档资料管理系统
  • Soitec 与NTU宣布在6G氮化镓技术上取得里程碑式进展
  • Python基于flask的实验室器材耗材设备信息管理系统_x50ntw8y
  • 聊聊广州高新技术企业认定靠谱的公司,推荐给你 - 工业设备
  • springboot+vue医疗用品销售商城网站
  • springboot+vue医院病房信息管理系统
  • Python基于flask的实验室课程教学成绩管理系统_1353ac4i
  • 和你聊聊广州高新企业认定,哪家口碑好一目了然 - 工业品网
  • 数据分析工具对比:访答的优势
  • springboot+vue学生宿舍报修管理系统
  • Python基于flask的某电梯厂固定资产管理系统excel数据导入 可视化_vfa9327d_
  • 质量计算数据都显示0,可能是u_carrier表中复盘质量未设置的原因;
  • (3-1)视觉感知:图像处理基础
  • 闲置沃尔玛购物卡回收变现认准京顺回收 - 京顺回收
  • 代码预测药物和食物会不会冲突,传统说明书总结,颠覆,代谢通路模型判断,输入药物+食物成分,输出冲击风险。
  • 分析激光焊接机租赁服务,深圳口碑好又好用的是哪家? - mypinpai
  • 单/双法兰液位变送器厂家哪家好?五家实力派品牌全面解析 - 品牌推荐大师
  • 信息壁垒究竟是抬高了,还是降低了?
  • 安装Openclaw教程