C#高效LRU缓存需用Dictionary+LinkedList实现O(1)的get/put:Dictionary映射key到链表节点,LinkedList按访问序维护节点,get时命中则移至尾部,put时更新或插入并超容删头。

用 C# 实现一个高效 LRU 缓存,关键在于让 get 和 put 操作都保持 O(1) 时间复杂度。标准解法是哈希表(Dictionary)配合双向链表(LinkedList),而不是靠 List 或 Queue 模拟——后者会导致移动或删除节点时退化到 O(n)。
核心结构:Dictionary + LinkedList
哈希表负责快速定位 key 对应的节点;双向链表按访问顺序组织节点,尾部为“最近使用”,头部为“最久未使用”。
Dictionary> 存 key → 链表节点映射LinkedList 维护访问时序,新访问或新增都移到 LastCachedItem 是自定义结构体或类,含 Key 和 Value
Get 操作:查到就移到链表尾
如果 key 存在,先从 Dictionary 取出对应节点,再调用 Remove() + AddLast() 把它挪到链表末尾,表示“刚刚被使用”。最后返回 value。
没命中直接返回 default(TValue) 或抛异常,按需设计注意:不要新建节点或改 value,只做位置调整
Put 操作:更新或插入,并处理容量超限
分两种情况:
key 已存在:更新节点的 value,再移至链表尾key 不存在:新建 CachedItem,AddLast 入链表,并加入 Dictionary插入后若 Count >= Capacity,则移除 First 节点,同时从 Dictionary 中删掉它的 key
小技巧与避坑点
避免常见低效写法:
别用 List 手动找索引再 RemoveAt —— 删除中间元素是 O(n)别每次 get 都重建 Dictionary 或重排整个链表注意 null 值处理:value 类型为可空引用类型时,default 不代表“不存在”,建议用 TryGetValue + 显式判断线程安全?如需并发访问,可包装成 ConcurrentDictionary + 锁住链表操作,或用 ReaderWriterLockSlim
基本上就这些。C# 的 LinkedList 天然支持 O(1) 的节点移除和尾插,搭配 Dictionary 就能干净利落地落地 LRU。不需要第三方库,.NET 自带组件足矣。
以上就是C# 如何实现一个LRU缓存 – 最近最少使用算法的C#实现的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442777.html
微信扫一扫
支付宝扫一扫