ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

03_链表(上)

2022-06-22 08:03:12  阅读:146  来源: 互联网

标签:03 结点 缓存 复杂度 链表 单链 指针


03_链表(上)

写在最前

缓存淘汰策略

  • FIFO(First In, First Out):先进先出策略。

  • LFU(Least Frequentlly Used):最少使用策略。

  • LRU(Least Recently Used):最近最少使用策略。

链表与数组

链表与数组不一样,不需要一块连续的内存空间,他通过“指针”将一组零散的内存块串联起来使用。

同样是申请一个100MB大小的空间,当内存中没有连续的这么大空间时,数组会申请失败。

单链表、循环链表、双向链表

单链表

单链表结构示意图

这种结构的好处,插入和删除数据不需要搬运过多数据,速度快。

插入和删除数据的时间复杂度:O(1)

查询元素的时间复杂度:O(n) 需要遍历链表

循环链表

相比于单链表,多了一个从尾指针指向头指针的指针,形成一个闭环。

循环链表结构示意图

双向链表

顾名思义,支持两个方向遍历,多了一个前驱指针。

双向链表结构示意图:

弊端:增加一个指针的内存空间。

优点:删除和插入数据更加灵活。

双向循环链表

双向链表结构示意图:

数组与链表

数组与链表的对比,并不能局限于时间复杂度。在时间的业务开发当中,不能仅仅利用复杂度分析就决定使用哪个数据结构来进行使用,需要针对不同的业务场景,来进行选择。

使用链表实现LRU缓存淘汰算法

思路:维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。

  1. 访问的这个数据之前已经被缓存在链表当中,我们遍历链表得到这个数据对应的结点,将其从原来的位置删除,然后插入到链表的头部。

  2. 访问的这个数据不在缓存的链表中:

    • 如果此时缓存未满,则将此结点直接插入到链表的头部。

    • 如果此时缓存已满,则链表的尾结点删除,将新的数据结点插入链表的头部。

基于链表的思路,缓存的访问时间复杂度为O(n)。

 

标签:03,结点,缓存,复杂度,链表,单链,指针
来源: https://www.cnblogs.com/l12138h/p/16399103.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有