数据结构与算法之美--链表

1.如何实现LRU缓存淘汰算法
答:回答这个问题之前,我们首先了解一下什么是缓存

  • 缓存是一种提高数据性能的技术,在硬件、软件技术都有着非常广泛的应用,比如常见的CPU缓存,数据库缓存,浏览器缓存。
  • 但是缓存的大小是有限的,如果缓存满了怎么办,接下来介绍缓存淘汰策略:
  • 先进先出策略 FIFO
  • 最少使用策略 LFU
  • 最近最少使用策略 LRU–问题的主人公

2.链表的三种形式:单链表、双向链表、循环链表
简介一下单链表:
在这里插入图片描述
头节点用于记录基地址,有了它我们就可以遍历整条链表,而尾节点特殊地方不是指向下一个节点,而是指向一个空地址。
链表因为不是一个连续的地址,所以不需要考虑连续性,链表对于插入删除就是O(1),链表对于查找就不如数组那么高效,就需要O(n),因为每个节点只知道自己后面是谁,所以查找第k个元素,需要从头开始遍历。

循环链表
循环链表是一种特殊单链表,循环链表与单链表的区别就是循环链表的尾节点指向的是头节点

双向链表
双向链表需要额外的两个空间存储后继节点和前驱节点的地址,如果存储相同的数据,双向链表会比单链表占用更多的内存。

实际场景:
删除节点中值等于某个值的节点
答:虽然链表的删除操作时O(1),但是查找给定值时需要遍历链表的O(n),所以删除给定值的时间复杂度是O(n)

其实缓存就是一种用空间来换时间复杂度的例子,就是我们把数据放在内存中,虽然比较耗费内存,但是读取效率很快

在指定节点前插入节点,双向链表是高于单链表时候,比如我们删除某个节点,知道删除这个节点,需要知道它的先驱节点,但是单链表需要遍历才可以知道单链表,双向链表就不需要这么繁琐,它可以直接就知道先驱节点,所以删除指定节点的时候,双向链表就是O(1),单链表就是O(n)

如何实现基于链表LRU缓存淘汰算法?
答:1.如果此数据之前已经被缓存到链表中,我们遍历得到这个数据对应的结点,并将其从原来位置删除,再插入到链表头部。
2.如果此数据没有在缓存链表中,又可以分为两种情况
如果缓存未满,则将此节点直接插入到链表头部
如果缓存已经满了,则链表尾节点删除,将新的数据节点插入链表得头部。

如何轻松写出链表代码?
1.理解指针或者引用的含义?
2.警惕指针丢失与内存泄漏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值