Rust高级代码题 - 手写一个 LRU Cache

Hi guys, this is Kevin here. 今天想给大家锻炼一个rust的底层数据结构的设计能力的题目,同时为了帮自己加深对rust的理解。好的,现在直接进入正题。

题目

实现:

rust 复制代码
struct LruCache<K, V>{...}

支持:

  • new(capacity: usize) -> Self
  • get(&mut self, key: &K) -> Option<&V>
  • put(&mut self, key: K, value: V)
  • 超过容量时淘汰最近最少使用的元素 要求:
  • get 后要更新最近使用顺序
  • 时间复杂度尽量做到接近 O(1)

考点

  • HashMap
  • 双向链表
  • Rc<RefCell<_>> / Box / 裸指针取舍
  • 可变借用冲突怎么规避
  • 数据结构设计能力

实现思路: LRU - 全称least-recent-used(最近最少使用)

Solution 1:

Hashmap + Vec

rust 复制代码
因为hashmap查找复杂度0(1), 更新顺序的话: 0(n) Vec中需要移除并添加
所以这个不太满足

Solution 2:

HashMap + 双向链表 + 裸指针

rust 复制代码
HashMap<K, *mut Node<V>>  // 直接存指针
性能: 最优
风险: 内存安全性难以保证,容易段错误
不推荐用于生产环境

Solution 3:

HashMap + 双向链表 + Rc<RefCell<_>>

rust 复制代码
HashMap<K, Rc<RefCell<Node<V>>>>
性能: O(1)
安全性: 完全的内存安全
可维护性: 高

关键结构:

rust 复制代码
struct Node<V> {
    value: V,
    prev: Option<Rc<RefCell<Node<V>>>>,
    next: Option<Rc<RefCell<Node<V>>>>,
}

struct LruCache<K, V> {
    capacity: usize,
    cache: HashMap<K, Rc<RefCell<Node<V>>>>,
    head: Option<Rc<RefCell<Node<V>>>>,  // 最近使用
    tail: Option<Rc<RefCell<Node<V>>>>,  // 最少使用
}

See complete implementation, please refers to:

github.com/KevinSheera...

同时,unit test已经都pass了

最后的summary

好啦,其实如果手动实现的话,确实需要做一个详细的分析,才能真正从中领悟他的hashmap的底层实现和所有权机制。今天的分享就到这里, thanks for reading.

相关推荐
凤山老林4 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
朱涛的自习室5 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
woniu_maggie8 小时前
SAP MDG主数据治理实战:从架构原理到项目实施全解析
后端
xiaoqiMikko8 小时前
Redis 实战(一):内存满了 —— 拒写、淘汰、被系统杀掉,以及删了 key 内存为什么不降(6.2.4 实测)
redis·后端
工程师小爱8 小时前
电芯尺寸合格,不等于电池包尺寸合格
后端
geovindu8 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
闲云lazycloud8 小时前
第 1 课:Harness 与 Agent 运行时
人工智能·后端
熊哈哈O_o8 小时前
260+异构同步链路:DDL语法自动翻译在大规模数据同步中的实现原理
后端
用户9888321871749 小时前
别把 IOptionsSnapshot 注入单例:从生命周期看 .NET 配置读取
后端