C#简单实现LRU缓存
最近跟同学吃饭扯淡的时候,由技术扯到薪资,又由薪资扯到他找工作时跟面试官是怎么扯淡拿高工资的,各种技术一顿侃,总之只要啥都了解就没问题了。谈到缓存的时候,我试探性的问了问- -你还记得LRU怎么写吗,他说啥完?我说没事。。
写完这篇文章发给他- -鄙视完他让他请我再吃饭,标准的缓存LRU实现为哈希表+链表,这是热乎的双向链表,也是C#版本的。。C#实现双向链表
代码:
public class LRUCache<T>{private int _size;//链表长度private int _capacity;//缓存容量 private Dictionary<int, ListNode<T>> _dic;//key +缓存数据private ListNode<T> _linkHead;public LRUCache(int capacity){_linkHead = new ListNode<T>(-1, default(T));_linkHead.Next = _linkHead.Prev = _linkHead;this._size = 0;this._capacity = capacity;this._dic = new Dictionary<int, ListNode<T>>();}public T Get(int key){if (_dic.ContainsKey(key)){ListNode<T> n = _dic[key];MoveToHead(n);return n.Value;} else{return default(T);}}public void Set(int key, T value){ListNode<T> n;if (_dic.ContainsKey(key)){n = _dic[key];n.Value = value;MoveToHead(n);}else{n = new ListNode<T>(key, value);AttachToHead(n);_size++;} if (_size > _capacity){RemoveLast();// 如果更新节点后超出容量,删除最后一个_size--;}_dic.Add(key, n);}// 移出链表最后一个节点private void RemoveLast(){ListNode<T> deNode = _linkHead.Prev;RemoveFromList(deNode);_dic.Remove(deNode.Key);}// 将一个孤立节点放到头部private void AttachToHead(ListNode<T> n){n.Prev = _linkHead;n.Next = _linkHead.Next;_linkHead.Next.Prev = n;_linkHead.Next = n;}// 将一个链表中的节点放到头部private void MoveToHead(ListNode<T> n){RemoveFromList(n);AttachToHead(n);}private void RemoveFromList(ListNode<T> n){//将该节点从链表删除n.Prev.Next = n.Next;n.Next.Prev = n.Prev;}}public class ListNode<T>{public ListNode<T> Prev;public ListNode<T> Next;public T Value;public int Key;public ListNode(int key, T val){Value = val;Key = key;this.Prev = null;this.Next = null;}}
测试:
LRUCache<int> cache = new LRUCache<int>(3);cache.Get(1);cache.Set(1, 1);cache.Set(2, 2);cache.Get(3);cache.Set(3, 3); cache.Set(4, 4);cache.Get(2);
转载于:https://www.cnblogs.com/ylsforever/p/6511000.html
C#简单实现LRU缓存相关推荐
- 关于LRU缓存简单记录以及代码补全。
目录 大概思路 时间空间复杂度分析 指针操作具体细节 代码 双向链表设计 私有成员变量设计: 构造函数和析构函数设计: get与put具体设计 双向指针的具体细节 添加到头节点函数 删除尾节点函数 删 ...
- 算法必知 --- LRU缓存淘汰算法
作者:_code_x 链接:https://www.jianshu.com/p/b7fed77324b9 写在前 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾 ...
- LeetCode第 146 号问题: LRU 缓存机制
题目描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (ke ...
- 【转】简单的java缓存实现
本文转自 http://my.oschina.net/u/866190/blog/188712 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法,每种算法各有各的优 ...
- 实现 LRU 缓存机制
实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...
- LRU缓存实现(Java)
LRU是Least Recently Used 的缩写,翻译过来就是"最近最少使用",LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的 ...
- LRU缓存 数据结构设计(C++)
做LeetCode第146题LRU缓存,觉得收获不小,特此记录. 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构. 实现 LRUCache 类: LRUCache(int ca ...
- 06 | 链表(上):如何实现LRU缓存淘汰算法?
缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...
- 【牛客 - NC93】设计LRU缓存结构(模拟)
设计LRU缓存结构_牛客题霸_牛客网 描述 设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能 1. set(key, value):将记录(key, va ...
最新文章
- 网站不允许上传asp cer cdx htr等文件时
- Linux输入不同颜色字体
- 10分钟搞定 Java 并发队列好吗?好的
- mysql 导入创建表空间_说说在 Oracle11g 中如何创建表空间、创建用户并授权以及导入与导出数据...
- python 功能键ord_ord()函数以及Python中的示例
- c语言设计程序实现顺序冒泡_2019年9月全国计算机等级考试《二级C语言程序设计》题库...
- Spring:aspectj-autoproxy 简介
- sqoop连接mysql_Sqoop jdbc 连接 MySQL 驱动包com.mysql.cj.jdbc.Driver 问题解决方法
- iOS已发布应用中对异常信息捕获和处理(转)
- 软件测试结束的标准是什么??
- java根据文件字符换行_java操作txt文本(一):遇到指定字符换行
- 【持续更新】 2022年 (2023届) 计算机 软件 保研经历 保研经验贴 (菜鸟 211 低rank 无科研成果 复旦/浙大/西安交大/中山/武大/华师大/东南/国科大杭高院)
- 物联网信息安全复习笔记(从头开始,两天速成)
- 假设检验,p-value,glm
- to be solved
- 80老翁谈人生(151):老翁老眼昏花,读错了一个数量级
- ora-12505错误
- 十三届蓝桥青少组省赛Python-20220423
- scikit-learn 支持向量机算法库使用小结
- html怎么设置下划线形状,科技常识:CSS如何给文字添加下划线样式
热门文章
- Ansible 入门案例
- 【软考-软件设计师】CPU的功能与组成
- zTree树形菜单交互选项卡效果实现
- id3与软件测试,ID3算法的实现
- oracle常用函数api,Oracle-API OracleAPI、oracle10G函数大全(常用函数)、 联合开发网 - pudn.com...
- scala调用java代码_scala调用java代码
- Vb 与 Vc 的区别
- 还没掌握Linux文件权限与目录配置命令?就这还不点进来看看干货
- 关于静态联编和动态联编
- qt 背景和控件布局_Qt控件背景图片设置总结