首先 先写点儿感悟吧:

本来计划是 晚上回家写的  后来发现还是没坚持的了  上午花了一个多小时  做了一下这个题目  应该还有提高的空间 的,这个题目是在力扣里面看到的  为什么看到这个题目 是因为 我最近在看极客时间里面消息队列有关的课程 有一章讲到了 使用缓存来减少磁盘的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# 实现的更多相关文章

  1. Android图片缓存之Lru算法

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  2. OS存储管理——FIFO,LRU,OPT命中率

    课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...

  3. [LeetCode] LRU Cache 最近最少使用页面置换缓存器

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  4. 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

    在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...

  5. 页置换算法FIFO、LRU、OPT

    页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...

  6. LRU LFU FIFO 转载

    -------------------------------------->href--------------------------> http://blog.chinaunix.n ...

  7. 缓存淘汰算法--LRU算法

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...

  8. 【leetcode】LRU Cache

    题目简述: Design and implement a data structure for Least Recently Used (LRU) cache. It should support t ...

  9. memcache的lru删除机制

    惰性删除,get时才删除 LRU原理:当某个单元被请求的时候,维护一个计数器,通过计数器来判断最近谁最少使用,那就把谁踢出去. 注:即使某个key设置的永久有效,也会被踢出来,这个就是永久数据被踢的现 ...

  10. 链表&LRU

    简介 链表就是链式存储数据的一种数据结构.双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针). class DSChain<T> { //使用栈来进行废弃空间回收 priv ...

随机推荐

  1. Docker-CentOS系统安装Docker

    上一节,我们介绍了安装虚拟机及操作系统,本文再详细描述安装docker的命令. 前提条件 虚拟机系统:CentOS,并且虚拟机能连通外网. 另外,虚拟机最好配置上阿里的镜像源,点此链接,进入cento ...

  2. day22作业

    # 1.检索文件夹大小的程序,要求执行方式如下 # python3.8 run.py 文件夹 import os,sys l = sys.argv[1] size = 0 def get_size(f ...

  3. U - Obtain a Permutation CodeForces - 1294E 思维

    题解: 注意每一列与每一列之间互不影响,所以贪心地求出没一列的最小操作值,然后累加起来. 怎么求没一列的最小值呢?维护一个数组same表示其中same[i]=j表示将该序列向上翻滚i次有j个元素归位, ...

  4. Scrapy学习-(1)

    Scrapy框架介绍 Scrapy是一个非常优秀的爬虫框架,基于python. 只需要在cmd运行pip install scrapy就可以自动安装.用scrapy-h检验是否成功安装 Scrapy部 ...

  5. vue2.x学习笔记(一)

    使用vue开发项目已经过了一段时间了,对其中的很多东西还是一知半解,于是想要系统学习一下.主要内容是参照官方中文网站https://cn.vuejs.org/v2/guide/,然后加上一些自己的理解 ...

  6. 《并发编程的艺术》阅读笔记之Volatile

    来源 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不 ...

  7. SpringMVC视图解析中的 forward: 与 redirect: 前缀

    在 SpringMVC 中,可以指定画面的跳转方式.使用 forward: 前缀实现请求转发跳转,使用 redirect: 前缀实现重定向跳转.有前缀的转发和重定向操作和配置的视图解析器没有关系,视图 ...

  8. python 基础篇 错误和异常处理

    语法错误 所谓语法错误,也就是你写的代码不符合编程规范,无法被识别与执行,比如下面这个例子: if name is not None print(name) If 语句漏掉了冒号,不符合 Python ...

  9. linux上Docker安装gogs私服亲测(详解)

    一.前言 有网友问我为什么要使用私服,可能大部分人都不是太懂,网上那么多存储仓库而且好用方便,但是你想过没有如果企业中的项目,放在人家的仓库上这个安全性不是太好,所以说一般企业都会有自己的私服.本章教 ...

  10. 上传文件的input问题以及FormData特性

    1.input中除了type="file"还要加上name="file",否则$_FILES为空,input的name值就是为了区分每一个input的 2.va ...