什么是链表
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章