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.

相关推荐
llz_11229 分钟前
web-第二次课后作业
前端·后端·web
红尘散仙6 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记8 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆8 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪8 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6169 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364579 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao9 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒10 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰11 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理