前言

经典的链表应用场景:LRU 缓存淘汰算法

缓存是一种提高数据读取性能的技术,由于缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。

  • 常见的策略有三种:

    • 先进先出策略 FIFO(First In,First Out)
    • 最少使用策略 LFU(Least Frequently Used)
    • 最近最少使用策略 LRU(Least Recently Used)

==》如何用链表来实现 LRU 缓存淘汰策略呢? ==》详见 五 的解答

一、链表

链表:不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用.
内存分布

最常用的链表结构:单链表、双向链表和循环链表

二、单链表

1、基本概念

结点(Node):单链表的结点结构
链表中的每一个数据元素称为 “结点” ,每个结点都由两部分组成:数据域 + 指针域。其中,数据域存储数据元素信息,指针域存储链表的下一个结点的位置信息,是一个指针。

单链表:当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。

  • 非空表(有头结点):
  • 空表:

头指针:是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。头指针具有标识作用。任何情况下,头指针都存在,无论链表是否为空。
头结点:为了操作的统一和方便(插入/删除首元结点)设立的,放在首元结点(第一元素结点)之前,其数据域一般无意义(也可以 存放链表的长度)。非必需要素。
最后一个结点:最后一个结点指针为“空”(通常用NULL或“^”符号表示),是链表的结束标志,表示它没有后继结点。

2、查找操作

目标:随机访问第 k 个元素 ==》依次遍历 ==》时间复杂度:O(n)

3、插入操作

插入 x 结点: ==》时间复杂度:O(1)
x->next = a2 -> next
a2 -> next = x

4、删除操作

删除 a2 结点: ==》时间复杂度:O(1)
p = a1->next
a1->next = p->next

三、循环链表

循环链表:与单链表的唯一区别就是最后一个结点的指针指向链表的头结点。
优点: 从链尾到链头比较方便。当要处理的数据具有环型结构特点时,就特别适合采用循环链表。eg: 约瑟夫问题

四、双向链表

双向链表:每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点。
特点:支持双向遍历,更具灵活性;O(1) 时间复杂度的情况下前驱结点
结点:

2、双向链表的优势

(1)删除

删除的两种情况:

  • 删除结点中“值等于某个给定值”的结点
  • 删除给定指针指向的结点

第一种情况

无论单链表还是双向链表,均需要从头开始遍历对比,直至找到值等于给定值的结点,然后再执行删除操作。==》时间复杂度:O(n)

第二种情况

已找到需删除的结点,但是删除某个结点 q 需要得到其前驱结点,双向链表可以不用遍历就得到前驱结点。 ==》时间复杂度:O(1)

(2)有序链表的查找操作

对于有序链表,双向链表的按值查询的效率要比单链表高一些。具体来说,可以记录上次查找的位置 p ,每次查找时,根据查询值与 p 的大小关系,决定向前还是向后查找。

五、设计思想:空间 <-> 时间

  • 当内存足够时,若追求代码的执行速度 ==》选择空间复杂度高、时间复杂度相对较低的算法或者数据结构
  • 当内存比较紧张 ==》时间换空间

链表实现LRU缓存淘汰算法:越靠近链表尾部的结点是越早之前访问的

  1. 若此数据之前就在缓存链表中,遍历得到该数据所对应的结点,并将其从原来的位置删除,然后插入到链表的头部。
  2. 若此数据没在缓存链表中,具体分为以下两种情况:
  • 若此时缓存未满 ==》此结点直接插入到链表的头部;
  • 若此时缓存已满,则链表的最后一个结点删除,并将新的数据结点插入链表的头部

三、链表(Linked List)(原理)相关推荐

  1. 怎么解释三线圈直流电机工作原理更好?

    简 介: 针对网络上小型直流电机原理说明视频存在的问题,通过CSDN视频制作系统进行阐释.进一步把TEASOFT中的文稿-视频转换功能进行完善,实现快速零后期视频制作. 经过这次测试,为今后MOOC课 ...

  2. c语言是以文件为单位编译,c语言从头开始(三:编译器工作原理) (我们还可以自己编写头文件后缀是xx.h并把它当前代码文件所在目录我们要用就可以直接通过下面代码使用)...

    c语言从头开始(三:编译器工作原理) [[枫歌枫歌]c语言从头开始(三:编译器工作原理)]https://toutiao.com/group/6568056688174170628/?iid=1590 ...

  3. C++链表linked list(附完整源码)

    C++链表linked list 链表linked list算法的完整源码(定义,实现,main函数测试) 链表linked list算法的完整源码(定义,实现,main函数测试) #include ...

  4. 链表(Linked List)之单链表

    原文地址:传送门 链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结: 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节 ...

  5. 《网络攻防》实验三:免杀原理与实践

    <网络攻防>实验三:免杀原理与实践 世界上公认的第一个在个人电脑上广泛流行的病毒是1986年初诞生的大脑(C-Brain)病毒,编写该病毒的是一对巴基斯坦兄弟,两兄弟经营着一家电脑公司,以 ...

  6. 【目标追踪】三帧差法原理及实现

    三帧差法原理及实现 (一)帧差法原理及实现: (二)帧差法存在的问题: (三)三帧差法的原理: (四)三帧差法的实现代码: (五)视频中的目标追踪效果: 关注我的公众号: (一)帧差法原理及实现: 这 ...

  7. 插值法(最邻近,双线性,双三次)的原理及实现

    插值法(最邻近,双线性,双三次)的原理及实现 常用的插值方法有最邻近插值法.双现象插值法和双三次插值法等,主要用于图像的放大或缩小. 缩小图像(或称为下采样(subsampled) 或降采样(down ...

  8. 三位加法器实现原理详解

    三位加法器实现原理详解 近日在读集智俱乐部里面的大牛们写的一本<科学的极致:漫谈人工智能>.看到了简单的数学计算计算机是如何实现的.一切的一切都起于逻辑门,本是本科已经学过的东西,现在早已 ...

  9. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  10. LVS三种工作模式原理

    1. LVS 三种工作模式原理 1.1 LVS-DR: 通过直接路由实现虚拟服务器(VS/DR) 跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请 ...

最新文章

  1. C# 实现单线程线程池并调用实例
  2. tomcat服务器配置及加固
  3. jsonb 查询_如何使用IN运算符查询jsonb数组
  4. SVN和Git 介绍,区别,优缺点以及适用范围
  5. android页面统计代码,android流量统计(示例代码)
  6. 单耳蓝牙耳机怎么连接_蓝牙耳机怎么挑选?推荐性价比高的蓝牙耳机
  7. java 运行 出现选择_Eclipse 运行出现java.lang.NoClassDefFoundError的解决方法
  8. oracle最快访问行,Oracle技术网—在Oracle快速进行数据行存在性检查
  9. 游戏开发-cocos creator技巧-cc.Component.EventHandler自定义click事件
  10. win10电脑开机密码忘了怎么办_电脑开机密码忘了怎么办最简单的方法_windows7教程...
  11. MySQL优化SQL性能问题
  12. Linux系统非阻塞I/O select、poll和epoll非常好的两篇文章
  13. POJ 3061  Subsequence   尺取法   挑战146页
  14. 前端框架中的大熊猫Ember
  15. Python下载和安装图文教程[超详细]
  16. 2020-05-15-用于深度学习训练的分布式多租户GPU集群分析
  17. 李国飞:全面反思腾讯的战略
  18. 微信订阅号之政府认证
  19. iOS/Android 纪念模式(黑白灰模式) 记录
  20. 请使用netty框架实现高效稳定的websocket通信

热门文章

  1. python中值滤波去除椒盐噪声_python 中值滤波,椒盐去噪,图片增强实例
  2. python手机销售系统详细设计_数据库详细设计文档 .doc
  3. 内置host_浏览器内置对象应用实践
  4. windows文件路径 正则表达式_Windows非常实用的四款软件
  5. python列表推导式_聊一聊:python的各种推导式(列表推导式、字典推导式、集合推导式)...
  6. css transition兼容性,CSS3 Transition详解和使用
  7. android 消息循环滚动条,Android ViewPager实现循环滚动
  8. 建筑与建筑群综合布线系统工程验收规范_GB50XXX电气施工规范
  9. Pathlib获取当前文件绝对路径
  10. html table没有align,HTML