链表&LRU
简介
链表就是链式存储数据的一种数据结构。双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针)。
- class DSChain<T>
- {
- //使用栈来进行废弃空间回收
- private DSStack<int> _recycle;
- //数据需要三个数据来存储内容,分别存储前后节点索引和数据本身
- private int[] _prev;
- private T[] _ds;
- private int[] _next;
- //链表头尾的索引,跟踪表尾主要方便LRU使用
- private int _head;
- private int _tail;
- public DSChain(int length)
- {
- _head = -1;
- _tail = -1;
- _prev = new int[length];
- _ds = new T[length];
- _next = new int[length];
- _recycle = new DSStack<int>(length);
- //将所有可用空间压入栈,也可改良当顺序空间耗尽后再读取栈中记录的回收空间
- for (int i = 0; i < length; i++)
- {
- _recycle.Push(i);
- }
- }
- //搜索数据,返回所在索引
- int Search(T data)
- {
- if (_head == -1) return -1;
- int index = _head;
- while (!_ds[index].Equals(data))
- {
- index = _next[index];
- if (index == -1) return -1;
- }
- return index;
- }
- public bool Insert(T data)
- {
- int index;
- if (!_recycle.Pop(out index)) return false;
- if (_head == -1)
- {
- _prev[index] = -1;
- _ds[index] = data;
- _next[index] = -1;
- _tail = index;
- }
- else
- {
- _prev[index] = -1;
- _ds[index] = data;
- _next[index] = _head;
- _prev[_head] = index;
- }
- _head = index;
- return true;
- }
- public bool Delete(T data)
- {
- int index = Search(data);
- if (index == -1) return false;
- if (_prev[index] != -1) _next[_prev[index]] = _next[index];
- else _head = _next[index];
- if (_next[index] != -1) _prev[_next[index]] = _prev[index];
- else _tail = _prev[index];
- _recycle.Push(index);
- return true;
- }
- //LRU
- public bool DeleteLast()
- {
- int index = _tail;
- if (index == -1) return false;
- _tail = _prev[index];
- _next[_prev[index]] = -1;
- _recycle.Push(index);
- return true;
- }
- //LRU访问方法,读取数据的同时调整数据在链表中位置
- //链表这种数据结构实现LRU非常方便
- public bool LRUAccess(T data)
- {
- int index = Search(data);
- if (index == -1) return false;
- if (_head == index) return true;
- if (_tail == index) _tail = _prev[index];
- _next[_prev[index]] = _next[index];
- if (_next[index] != -1) _prev[_next[index]] = _prev[index];
- _prev[index] = -1;
- _next[index] = _head;
- _prev[_head] = index;
- _head = index;
- return true;
- }
- }
链表&LRU的更多相关文章
- 单链表LRU
单链表实现lru 越靠近链表尾部的节点是越早之前访问的 当有一个新的数据被访问时,从链表头开始顺序遍历链表 1.如果此数据之前已经被缓存在链表中 遍历得到这个数据对应的节点,并将其从原来的位置删除,然 ...
- 再谈LRU双链表内存管理
N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...
- 你知道MySQL的LRU链表吗?
相信大家对LRU链表是不陌生的,算是一种基础的数据结构! LRU:Least Recently Used 一.简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表 ...
- OCP读书笔记(13) - 管理内存
SGA 1. 什么是LRULRU表示Least Recently Used,也就是指最近最少使用的buffer header链表LRU链表串联起来的buffer header都指向可用数据块 2. 什 ...
- Linux内存管理 (13)回收页面
专题:Linux内存管理专题 关键词:LRU.活跃/不活跃-文件缓存/匿名页面.Refault Distance. 页面回收.或者回收页面也即page reclaim,依赖于LRU链表对页面进行分类: ...
- Linux内核设计笔记13——虚拟文件系统
虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...
- 800+Java后端经典面试题,希望你找到自己理想的Offer呀~
前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github ...
- MySQL InnoDB技术内幕:内存管理、事务和锁
前面有多篇文章介绍过MySQL InnoDB的相关知识,今天我们要更深入一些,看看它们的内部原理和机制是如何实现的. 一.内存管理 我们知道,MySQl是一个存储系统,数据最后都写在磁盘上.我们以前也 ...
- Innodb的存储及缓存
参考[mysql技术内幕] 一.mysql体系结构和存储引擎 1.数据库与数据库实例 数据库:物理操作系统文件或者其他文件组成的集合: 数据库实例:有数据库后台进程/线程和一个共享内存区域组成. 数据 ...
随机推荐
- Tor网络突破IP封锁,爬虫好搭档【入门手册】
本文地址:http://www.cnblogs.com/likeli/p/5719230.html 前言 本文不提供任何搭梯子之类的内容,我在这里仅仅讨论网络爬虫遇到的IP封杀,然后使用Tor如何对抗 ...
- EXT.NET 使用总结(3)--动态图表
动态生成雷达图--Radar 效果图: aspx页面代码: <ext:Panel ID="ResultPanel" Border="true" runat ...
- eclipse优化设置
1. Eclipse的控制台console有时候经常的跳出来,非常的烦人! 让它不经常的调出来,可以按下面的操作去掉它: windows -> preferences -> r ...
- UVA 12300 Smallest Regular Polygon(正多边形)
题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...
- wpf 加载项目图片的几种写法
new System.Windows.Media.Imaging.BitmapImage( new Uri("pack://application:,,,/TeacherAssistant. ...
- a 标签中加 onclick事件,根据事件中的校验情况来决定是否执行a标签的链接
a 标签中加 onclick方法后,先执行onclick方法,在去执行a标签href下属性对应的动作,如果不想执行href属性下动作需要用false作为返回值. <a href="ht ...
- ACM :漫漫上学路 -DP -水题
CSU 1772 漫漫上学路 Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %lld & %llu Submit ...
- tornado学习笔记11 Web应用中模板(Template)使用应用实践
上一篇中(Web应用中模板的工作流程分析),已经分析了模板的渲染流程,以及相关参数获取及设置原理.这篇主要讲述模板在实际应用案例. 11.1 需求 根据用户输入的两次密码,判断两次密码是否一致,并将判 ...
- python使用pdkdf2加盐密码
from werkzeug.security import generate_password_hash, check_password_hash pw = generate_password_has ...
- 开启PHP的伪静态
1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有 apache2handl ...