LRU 的C# 实现
首先 先写点儿感悟吧:
本来计划是 晚上回家写的 后来发现还是没坚持的了 上午花了一个多小时 做了一下这个题目 应该还有提高的空间 的,这个题目是在力扣里面看到的 为什么看到这个题目 是因为 我最近在看极客时间里面消息队列有关的课程 有一章讲到了 使用缓存来减少磁盘的IO 里面讲到了这个LRU 置换算法 哎 真的一脸懵逼呀,后来花了2个晚上时间 看了很多文章 涉及到了数据结构 算法 等一系列知识 哪个时候真的感觉内心空洞,毕业X年了 都不好意思说,一些基础 真的 很缺乏 感叹 大学 没好好的学,好了 不说了 show code
public class LRUCache
{
private LinkedList<KeyValuePair<int, int>> linkedList = new LinkedList<KeyValuePair<int, int>>();//双链表 private Dictionary<int, LinkedListNode<KeyValuePair<int, int>>> keyValuePairs = new Dictionary<int, LinkedListNode<KeyValuePair<int, int>>>();//哈希字典
private int _capacity = ; public LRUCache(int capacity)
{
keyValuePairs = new Dictionary<int, LinkedListNode<KeyValuePair<int, int>>>(capacity);
_capacity = capacity;
} public int Get(int key)
{
if (keyValuePairs.ContainsKey(key) == false)
{
Console.WriteLine($"输出的值是:-1");
return -;
}
var node = keyValuePairs[key].Value;
Put(key, node.Value);
Console.WriteLine($"输出的值是:{node.Value}");
return node.Value;
} public void Put(int key, int val)
{
LinkedListNode<KeyValuePair<int, int>> newLinkedListNode = new LinkedListNode<KeyValuePair<int, int>>(KeyValuePair.Create(key, val));
if (keyValuePairs.ContainsKey(key))
{
linkedList.Remove(keyValuePairs[key]);
linkedList.AddFirst(newLinkedListNode);
// keyValuePairs.Add(key, newLinkedListNode);
keyValuePairs[key] = newLinkedListNode;//更新dic key 中的值 不能用add 会报错
}
else
{
if (_capacity == linkedList.Count)
{
LinkedListNode<KeyValuePair<int, int>> lastNode = linkedList.Last;
linkedList.RemoveLast();
keyValuePairs.Remove(lastNode.Value.Key);
} linkedList.AddFirst(newLinkedListNode);
keyValuePairs.Add(key, newLinkedListNode);
} } }
测试代码
static void Main(string[] args)
{
LRUCache cache = new LRUCache( /* 缓存容量 */ ); cache.Put(, );
cache.Put(, );
cache.Get(); // 返回 1
cache.Put(, ); // 该操作会使得密钥 2 作废
cache.Get(); // 返回 -1 (未找到)
cache.Put(, ); // 该操作会使得密钥 1 作废
cache.Get(); // 返回 -1 (未找到)
cache.Get(); // 返回 3
cache.Get(); // 返回 4 }
截图 力扣里面的运行结果:

从运行结果上面看 这个内存消耗还是很严重的 后面慢慢研究下怎么去改进:
贴上题目的地址:https://leetcode-cn.com/problems/lru-cache/
希望 自己能继续保持 继续加油~ 留给我的时间不多了~
LRU 的C# 实现的更多相关文章
- Android图片缓存之Lru算法
前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...
- OS存储管理——FIFO,LRU,OPT命中率
课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...
- [LeetCode] LRU Cache 最近最少使用页面置换缓存器
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- 页置换算法FIFO、LRU、OPT
页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...
- LRU LFU FIFO 转载
-------------------------------------->href--------------------------> http://blog.chinaunix.n ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- 【leetcode】LRU Cache
题目简述: Design and implement a data structure for Least Recently Used (LRU) cache. It should support t ...
- memcache的lru删除机制
惰性删除,get时才删除 LRU原理:当某个单元被请求的时候,维护一个计数器,通过计数器来判断最近谁最少使用,那就把谁踢出去. 注:即使某个key设置的永久有效,也会被踢出来,这个就是永久数据被踢的现 ...
- 链表&LRU
简介 链表就是链式存储数据的一种数据结构.双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针). class DSChain<T> { //使用栈来进行废弃空间回收 priv ...
随机推荐
- 深度解密 Go 语言之 sync.Pool
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底.准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗.为了用起来更顺畅,我特地研究了 ...
- 数字电路技术之触发器(基本RS触发器)
一.触发器的知识 1.触发器是构成时序逻辑电路的基本逻辑部件. 2.[1]它有两个稳定的状态:0状态和1状态: [2]在不同的输入情况下,它可以被置成0状态或1状态: [3]当输入 ...
- F. Count Prime Pairs
单点时限: 2.0 sec 内存限制: 512 MB 对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数. 输入格式 第一行输入一个n,表示数组的长 ...
- Linux相关操作
ssh配置秘钥 连接远程服务器时:需要用户持有“公钥/私钥对”,远程服务器持有公钥,本地持有私钥. 客户端向服务器发出请求.服务器收到请求之后,先在用户的主目录下找到该用户的公钥,然后对比用户发送过来 ...
- [html][javascript] 关于SVG环形进度条
下面是个例子: <style> .demo2{ transform-origin: center; transform: rotate(-90deg); transition: strok ...
- [leetcode] 并查集(Ⅰ)
预备知识 并查集 (Union Set) 一种常见的应用是计算一个图中连通分量的个数.比如: a e / \ | b c f | | d g 上图的连通分量的个数为 2 . 并查集的主要思想是在每个连 ...
- 前端基础-HTML(1)
1.浏览器: 1.1 浏览器内核: 渲染引擎和JS引擎 渲染引擎:负责页面内容的在(html,xml,图像等).整理讯息(加入css等),以及计算网页的显示方式,然后输出至显示器后者打印机 JS引擎: ...
- thinkphp5 --接口实例
这是我自己构思的案例,写的不好请多多指教. 后台接口的代码: public function index() { $res = array(); header("Access-Control ...
- failed to open stream :HTTP request failed 解决方法
用curl抓取,不要用file_get_contents(); 前者比后者效率高一点
- 2019-2020-1 20199329《Linux内核原理与分析》第七周作业
<Linux内核原理与分析>第七周作业 一.本周内容概述: 对Linux系统如何创建一个新进程进行追踪 分析Linux内核创建一个新进程的过程 二.本周学习内容: 1.学习进程的描述 操作 ...