链表&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.数据库与数据库实例 数据库:物理操作系统文件或者其他文件组成的集合: 数据库实例:有数据库后台进程/线程和一个共享内存区域组成. 数据 ...
随机推荐
- racket
let 和 let* 区别 ``` racket // 这是对的 (let* ([x (random 4)][o (random 4)] [diff (number->string (abs ( ...
- LeetCode 344. Reverse String
Problem: Write a function that takes a string as input and returns the string reversed. Example: Giv ...
- http错误代码含义中英文对照
Http错误代码含义中文 概要当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字 ...
- asp.net mvc自定义JsonResult类来防止MaxJsonLength超过限制
前不久在做一个项目的时候,我用到了mvc的webapi返回了一个大数据,结果报了500错误,如下图所示: Server Error in ‘/’ Application. Error during s ...
- Hololens 硬件细节 Hardware Detail
微软HoloLens是世界第一款完全无线缆的全息计算机.通过在新方式上赋予用户的全息体验,HoloLens重新定义了个人计算(Personal Computing).为了将3D全息图形固定到你周围的真 ...
- T-SQL Recipes之Common Function
在我们写SQL的时候,经常会用到许多内置方法,简化了我们许多代码,也提高了效率,这篇主要总结一些常用的方法. ISNULL VS COALESCE VS NULLIF 在SQL中,NULL值是比较特殊 ...
- 【SRM】518 Nim
题意 \(K(1 \le K \le 10^9)\)堆石子,每堆石子个数不超过\(L(2 \le 50000)\),问Nim游戏中先手必败局面的数量,答案对\(10^9+7\)取模. 分析 容易得到\ ...
- js学习笔记
javacript笔记根据EC5.0一共有六种数据类型:number,string,bool undefine,nullobject(广义的) --->object(狭义的),array,fun ...
- 软件工程:Wordcount程序作业
由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...
- 基础2.Jquery过滤选择器
1.基础选择器: 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的 ...