为了账号安全,请及时绑定邮箱和手机立即绑定

数组结构和算法(四)链表

什么是链表

1.和数组一样,链表也是一种线性表。

2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。

3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。

4.链表包括单链表、双向链表、循环链表。

二、为什么使用链表?即链表的特点

1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n)级别(需要从链头至链尾进行遍历)。

链表三种缓存策略

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

LRU (Least Recently Use)最近最少使用策略

LFU (Least Frequently Used)最少使用策略

如何分贝用数组和链表实现LRU缓存淘汰算法

1)什么是缓存

  缓存是一种提高数据读取性能的技术,在硬件设计、软件设计中都有非常广泛的应用,比如常见的CPU缓存,数据库缓存,浏览器缓存。

2)为什么使用缓存

  缓存的大小是有限的,当缓存被用满时,哪些数据应该被保留,就需要用到缓存淘汰策略。

3)什么是缓存淘汰策略

指的是当缓存用满时数据清理的有限顺序

4)有哪些缓存淘汰策略

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

5)链表实现LRU缓存淘汰策略

当访问的数据没有存储在到缓存的链表中时,直接把数据添加到链表表头,时间复杂度为O(1);

当访问的数据已经存储到缓存的链表中时,把对应的结点,插入到链表的表头,时间复杂度为O(n)。如果缓存被占满,则从链表的尾部开始清理,时间复杂度为O(1).

6)数组实现LUR缓存策略

方法一:首位置保存最新访问数据,末位置优先清理。

当访问的数据未存于缓存的数组时,直接将数据插入到数组第一个位置,原来元素往后面移一个位置,时间复杂度为O(n);当访问的数据已经存储到缓存的数组时,把数据插入到数组的第一个位置,原来的元素往后面一位,时间复杂度为0(n),如果缓存已满,清理掉末位置的元素,时间复杂度为O(1)

方法二:末位置保存最新访问数据,首位置优先清理。

当访问的数据未存于缓存的数组时,直接将数据插入到数组最后一个位置,原来元素往后面移一个位置,时间复杂度为O(1);当访问的数据已经存储到缓存的数组时,把数据插入到数组的第一个位置,原来的元素往后面一位,时间复杂度为0(n),如果缓存已满,清理掉末位置的元素,时间复杂度为O(n)

通过单链表实现“判断某个字符串是否为水仙花字符串”(比如 上海自来水来自海上)

半栈法
1.用快慢两个指针遍历,同时用栈copy慢指针指向的data。
2.完成后,慢指针指向中间节点,耗时为N/2.
3.最后用pop栈中的data和慢指针指向的data比较,耗时也是N/2.
 所以时间复杂度为:O(N),空间复杂度因栈额外存储了一半的data,故为O(N/2)


哨兵结点

如果我们引入哨兵结点,在任何时候,不管链表是不是空,head 指针都会一直指向这个哨兵结

点。我们也把这种有哨兵结点的链表叫带头链表。相反,没有哨兵结点的链表就叫作不带头链表

 5 个常见的链表操作

单链表反转

 链表中环的检测

 两个有序的链表合并 

删除链表倒数第 n 个结点

 求链表的中间结点

练习题LeetCode对应编号:206,141,21,19,876






点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7
获赞与收藏
12

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消