先写骨架,再补细节:用契约拆解算法题与中型程序
围绕“公开接口先行、helper 以契约占位、实现围绕不变量展开”这条主线,系统讲解如何从算法题过渡到中型程序设计,并用 LRUCache 与下单流程示例说明它和 DDD 的分工关系。
围绕“公开接口先行、helper 以契约占位、实现围绕不变量展开”这条主线,系统讲解如何从算法题过渡到中型程序设计,并用 LRUCache 与下单流程示例说明它和 DDD 的分工关系。
副标题 / 摘要 这题不是“背答案题”,而是缓存系统的基本功:如何在常数时间内同时满足“快速访问”和“按最近最少使用淘汰”。本文从朴素方案推到最优结构,并给出可运行的多语言实现。 预计阅读时长:14~18 分钟 标签:LRU、哈希表、双向链表、系统设计 SEO 关键词:LRU Cache, LeetCode 146, 哈希表, 双向链表, O(1) 元描述:通过哈希表 + 双向链表实现 LRU 缓存,get/put 平均 O(1),附工程场景、常见坑与六语言实现。 目标读者 正在刷 LeetCode 中等题、想吃透“数据结构组合技”的同学 做后端/中间件,需要实现或优化本地缓存的工程师 面试中经常被问到 LRU,但只记住结论、没掌握细节的人 背景 / 动机 缓存是“空间换时间”,但空间是有限的。 当缓存满了,必须淘汰一些键。LRU(Least Recently Used,最近最少使用)假设: 最近被访问的数据,将来更可能再次访问 很久没访问的数据,优先淘汰更合理 工程里常见于: 接口响应缓存 数据库热点记录缓存 页面/会话本地状态缓存 核心概念 LRU 策略:淘汰“最久未使用”的键 访问即更新新鲜度:get 成功后要把该 key 标为“最近使用” 容量约束:put 新 key 造成超容时,需要立即驱逐一个最旧键 O(1) 平均复杂度:get 和 put 都不能线性扫描 A — Algorithm(题目与算法) 题目重述 设计并实现一个满足 LRU 约束的数据结构 LRUCache: LRUCache(int capacity):用正整数容量初始化 int get(int key):若 key 存在返回 value,否则返回 -1 void put(int key, int value): key 已存在:更新 value,并视作最近使用 key 不存在:插入新键值对 若超出容量:淘汰最久未使用的 key 并要求 get 和 put 平均时间复杂度为 O(1)。 ...