简介

链表就是链式存储数据的一种数据结构。双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针)。

  1. class DSChain<T>
  2. {
  3. //使用栈来进行废弃空间回收
  4. private DSStack<int> _recycle;
  5.  
  6. //数据需要三个数据来存储内容,分别存储前后节点索引和数据本身
  7. private int[] _prev;
  8. private T[] _ds;
  9. private int[] _next;
  10.  
  11. //链表头尾的索引,跟踪表尾主要方便LRU使用
  12. private int _head;
  13. private int _tail;
  14.  
  15. public DSChain(int length)
  16. {
  17. _head = -1;
  18. _tail = -1;
  19. _prev = new int[length];
  20. _ds = new T[length];
  21. _next = new int[length];
  22.  
  23. _recycle = new DSStack<int>(length);
  24. //将所有可用空间压入栈,也可改良当顺序空间耗尽后再读取栈中记录的回收空间
  25. for (int i = 0; i < length; i++)
  26. {
  27. _recycle.Push(i);
  28. }
  29. }
  30.  
  31. //搜索数据,返回所在索引
  32. int Search(T data)
  33. {
  34. if (_head == -1) return -1;
  35. int index = _head;
  36. while (!_ds[index].Equals(data))
  37. {
  38. index = _next[index];
  39. if (index == -1) return -1;
  40. }
  41. return index;
  42. }
  43.  
  44. public bool Insert(T data)
  45. {
  46. int index;
  47. if (!_recycle.Pop(out index)) return false;
  48. if (_head == -1)
  49. {
  50. _prev[index] = -1;
  51. _ds[index] = data;
  52. _next[index] = -1;
  53. _tail = index;
  54. }
  55. else
  56. {
  57. _prev[index] = -1;
  58. _ds[index] = data;
  59. _next[index] = _head;
  60. _prev[_head] = index;
  61. }
  62. _head = index;
  63. return true;
  64. }
  65.  
  66. public bool Delete(T data)
  67. {
  68. int index = Search(data);
  69. if (index == -1) return false;
  70.  
  71. if (_prev[index] != -1) _next[_prev[index]] = _next[index];
  72. else _head = _next[index];
  73.  
  74. if (_next[index] != -1) _prev[_next[index]] = _prev[index];
  75. else _tail = _prev[index];
  76.  
  77. _recycle.Push(index);
  78. return true;
  79. }
  80.  
  81. //LRU
  82. public bool DeleteLast()
  83. {
  84. int index = _tail;
  85. if (index == -1) return false;
  86. _tail = _prev[index];
  87. _next[_prev[index]] = -1;
  88. _recycle.Push(index);
  89. return true;
  90. }
  91.  
  92. //LRU访问方法,读取数据的同时调整数据在链表中位置
  93. //链表这种数据结构实现LRU非常方便
  94. public bool LRUAccess(T data)
  95. {
  96. int index = Search(data);
  97. if (index == -1) return false;
  98. if (_head == index) return true;
  99. if (_tail == index) _tail = _prev[index];
  100.  
  101. _next[_prev[index]] = _next[index];
  102. if (_next[index] != -1) _prev[_next[index]] = _prev[index];
  103.  
  104. _prev[index] = -1;
  105. _next[index] = _head;
  106. _prev[_head] = index;
  107. _head = index;
  108. return true;
  109. }
  110. }

链表&LRU的更多相关文章

  1. 单链表LRU

    单链表实现lru 越靠近链表尾部的节点是越早之前访问的 当有一个新的数据被访问时,从链表头开始顺序遍历链表 1.如果此数据之前已经被缓存在链表中 遍历得到这个数据对应的节点,并将其从原来的位置删除,然 ...

  2. 再谈LRU双链表内存管理

    N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...

  3. 你知道MySQL的LRU链表吗?

    相信大家对LRU链表是不陌生的,算是一种基础的数据结构! LRU:Least Recently Used 一.简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表 ...

  4. OCP读书笔记(13) - 管理内存

    SGA 1. 什么是LRULRU表示Least Recently Used,也就是指最近最少使用的buffer header链表LRU链表串联起来的buffer header都指向可用数据块 2. 什 ...

  5. Linux内存管理 (13)回收页面

    专题:Linux内存管理专题 关键词:LRU.活跃/不活跃-文件缓存/匿名页面.Refault Distance. 页面回收.或者回收页面也即page reclaim,依赖于LRU链表对页面进行分类: ...

  6. Linux内核设计笔记13——虚拟文件系统

    虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...

  7. 800+Java后端经典面试题,希望你找到自己理想的Offer呀~

    前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github ...

  8. MySQL InnoDB技术内幕:内存管理、事务和锁

    前面有多篇文章介绍过MySQL InnoDB的相关知识,今天我们要更深入一些,看看它们的内部原理和机制是如何实现的. 一.内存管理 我们知道,MySQl是一个存储系统,数据最后都写在磁盘上.我们以前也 ...

  9. Innodb的存储及缓存

    参考[mysql技术内幕] 一.mysql体系结构和存储引擎 1.数据库与数据库实例 数据库:物理操作系统文件或者其他文件组成的集合: 数据库实例:有数据库后台进程/线程和一个共享内存区域组成. 数据 ...

随机推荐

  1. Tor网络突破IP封锁,爬虫好搭档【入门手册】

    本文地址:http://www.cnblogs.com/likeli/p/5719230.html 前言 本文不提供任何搭梯子之类的内容,我在这里仅仅讨论网络爬虫遇到的IP封杀,然后使用Tor如何对抗 ...

  2. EXT.NET 使用总结(3)--动态图表

    动态生成雷达图--Radar 效果图: aspx页面代码: <ext:Panel ID="ResultPanel" Border="true" runat ...

  3. eclipse优化设置

    1. Eclipse的控制台console有时候经常的跳出来,非常的烦人! 让它不经常的调出来,可以按下面的操作去掉它: windows  ->   preferences   ->  r ...

  4. UVA 12300 Smallest Regular Polygon(正多边形)

    题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...

  5. wpf 加载项目图片的几种写法

    new System.Windows.Media.Imaging.BitmapImage( new Uri("pack://application:,,,/TeacherAssistant. ...

  6. a 标签中加 onclick事件,根据事件中的校验情况来决定是否执行a标签的链接

    a 标签中加 onclick方法后,先执行onclick方法,在去执行a标签href下属性对应的动作,如果不想执行href属性下动作需要用false作为返回值. <a href="ht ...

  7. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  8. tornado学习笔记11 Web应用中模板(Template)使用应用实践

    上一篇中(Web应用中模板的工作流程分析),已经分析了模板的渲染流程,以及相关参数获取及设置原理.这篇主要讲述模板在实际应用案例. 11.1 需求 根据用户输入的两次密码,判断两次密码是否一致,并将判 ...

  9. python使用pdkdf2加盐密码

    from werkzeug.security import generate_password_hash, check_password_hash pw = generate_password_has ...

  10. 开启PHP的伪静态

    1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有 apache2handl ...