链表(上)

链表(上)

@(数据结构与算法)

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

缓存是一种提高数据读取性能的计数,如常见的:CPU 缓存,数据库缓存,浏览器缓存等。

缓存的大小有限,当缓存被用满时,那些数据应该被清理出去,那些数据应该保留,这就需要缓存淘汰策略算法来决定。常见得策略有三种:先进先出策略 FIFO(First In ,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU (Least Recently Used)。

链表的结构

从底层的存储数据结构上看,数组需要连续的内存空间来存储,对内存的要求比较高,而链表并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用。

单链表有两个节点是特殊的,他们分别是第一个节点和最后一个节点,习惯性称之为头结点和尾节点,头结点用来记录链表的基地址,而尾节点特殊的地方是:指针不是指向下一个节点,而是指向一个空地址 NULL。
1230701-20181004145908616-864052324.png

在链表中插入或者删除一个数据不需要像数组那样为了保存内存的连续性而搬移结点,所以在链表中插入和删除操作的时间复杂度为 $O(1)$。
1230701-20181004145925787-2033880181.png

但是有利就有弊,链表药性随机访问第 k 个元素怒,就没有数组那么高效了,因为链表中的数据并非连续存储,所以无法像数组那样,根据首地址和下标,通过寻址公式就能直接计算出对应的内存地址,而是需要根据指针一个接一个结点的依次遍历,直到找到相应的结点。时间复杂度为$O(n)$。

循环链表是一种特殊的单链表,唯一区别就在为节点指针指向链表的头结点。
1230701-20181004145938225-1162391766.png

双向链表,每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点,显然需要更占用内存。
1230701-20181004145956303-1520479475.png

在实际的删除操作中,无外乎这两种情况

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

对于第一种情况,无论单链表还是双链表,都需要从头结点遍历一遍整个链表,直到找到值等于给定值的结点,将其删除,尽管删除的时间复杂度为 $O(1)$,但查找的时间复杂度为 $O(n)$,所以总的时间复杂度为 $O(n)$。

对于第二种情况,我们已经找到了要删除的结点,但是删除某个结点 q 需要知道其前驱结点,而单链表并不支持直接获取前驱结点,所以还是需要从头结点遍历,直到找到 p->next = q,才可进行删除,时间复杂度为 $O(n)$,而对于双向链表,泽科直接进行删除,时间复杂度为 $O(1)$。

同理如果我们希望在链表的某个指定结点前插入一个结点插入操作,双向链表可以在 $O(1)$ 时间复杂度内搞定,而单链表则需要 $O(n)$ 时间复杂度。

双向链表的重要思想是空间换时间,当内存空间充足时,如果更加追求代码的执行速度,可以选择空间复杂度相对较高,但时间复杂度相对很低的算法或者数据结构,相反同理。而缓存正是利用了空间换时间的设计思想。

链表和数组的比较

1230701-20181004150016084-1040572195.png

不过,数组和链表的对比,并不能局限于时间复杂度,而且,在实际的软件开发中,不能仅仅利用复杂度分析就决定使用哪个数据结构来存储数据。

数组简单易用,在实现上使用的连续的内存空间,可以借助 CPU 的缓存机制,预读数据,所以访问效率更高。而链表在内存中并不是连续存储的,所以不支持预读。

数组声明需要预先分配内存大小,而链表天然支持动态扩容。除此之外,如果代码对内存的使用非常苛刻,数组更加适合,因为链表中的每个结点都需要消耗额外的存储空间,而且,对链表进行频繁的掺入、删除操作,还会导致频繁的内存申请和释放,容易造成内存内存碎片。

链表实现 LRU 缓存淘汰算法

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

  1. 如果此数据之前已经被缓存在链表中,遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。
  2. 如果此数据没有在缓存链表中,两种情况
  • 此时缓存未满,则将此节点直接插入到链表的头部。
  • 此时缓存已满,则链表尾结点删除,将新的数据节点插入链表头部。

参考自:极客时间《数据结构与算法之美 》专栏

转载于:https://www.cnblogs.com/wobu/p/9742267.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24006.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ogc是一个非营利性组织_非营利组织的21个最佳WordPress主题

ogc是一个非营利性组织 Are you looking for the best WordPress themes for nonprofits? 您是否在寻找非营利组织的最佳WordPress主题? Charity and nonprofit websites require an appealing presentation with the right tools to achieve their donation goal…

橡皮擦的英语_小朋友们知道“橡皮擦”用英语该怎么说吗?

点击上面“蓝字”关注我们! 小朋友们知道橡皮擦用英语该怎么说吗? 和老师一起学起来吧~ eraser 英 [ɪˈreɪzə(r)] 美 [ɪˈreɪsər] n.橡皮擦;黑板擦 复数:erasers 小朋友们都知道橡皮擦是我们常用的文具, 那小朋友们还知道哪…

测试用例方法-等价类划分

一、等价类划分 例:测试一个两位数的加法计算器 测试需求:测试两个参数值的相加后的结果是否正确 隐身需求:输入的数值在-99到99之间,大于99或小于-99输入应被拒绝,并显示错误信息 第一步:根据测试需求&am…

网易云数据分析实战

网易云数据分析 字段:title,tag,text,collection,play,songs,comments 导入模块,读取数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt import squarifydf pd.read_excel(D:/Pandas/music_message.xlsx,header0,names[…

最近抖音上虚拟元宇宙项目-猜歌名,代码解析

介绍一下最近抖音上元宇宙虚拟项目猜歌名,直播游戏。用户互动猜歌名,30秒后自动切歌。 CSDN项目源码:https://download.csdn.net/download/u010978757/85326344 类似的弹幕互动游戏除了猜歌名,还有挤地铁、广场舞和舞厅蹦迪的&a…

德清租房软件测试,门头沟实习生出租房

10 图 2室 65㎡ 苏州街 海淀南路小区 距4号线大兴线海淀黄庄地铁站步行438m 来自经纪人: 陈伟建 1天前 8300元 8 图 1室 35㎡ 北太平庄 花园路8号院 距10号线牡丹园地铁站步行1122m 来自经纪人: 陈泽科 1天前 4800元 10 图 1室 45㎡ 西北旺 芳怡园 距16号线西北旺地…

训练数据集操作方法总结

参考博客 移动九天毕昇:https://blog.csdn.net/weixin_45887062/article/details/126796359 肆十二:(B站有详细解说)https://blog.csdn.net/ECHOSON/article/details/121939535?ops_request_misc%257B%2522request%255Fid%2522%2…

chatgpt赋能python:Python多种输出格式详解

Python多种输出格式详解 对于Python程序员来说,输出是非常重要的。无论是在开发阶段还是在生产环境中,输出都是我们调试程序和确认程序运行是否正常的重要手段。Python标准库提供了丰富的输出格式,本文介绍了几种常见的输出格式及其使用方法…

Vue3实现chatgpt的流式输出

前言: 我在使用Vue3开发一个chatgpt工具类网站的时候,翻阅了不少博客和github上的一些相关项目,都没能找到适合Vue3去实现stream的流式数据处理。经过踩坑,最终实现了适用直接调chatgpt接口的方法以及改为调用Python后端接口的方…

ChatGPT基础知识系列之大型语言模型(LLM)初识

ChatGPT基础知识系列之大型语言模型(LLM)初识 ChatGPT本质是一个对话模型,它可以回答日常问题、挑战不正确的前提,甚至会拒绝不适当的请求,在去除偏见和安全性上不同于以往的语言模型。ChatGPT从闲聊、回答日常问题,到文本改写、诗歌小说生成、视频脚本生成,以及编写和调…

特朗普、马斯克和比尔·盖茨贫民窟AI画“让人尖叫”

点击上方“AI遇见机器学习”,选择“星标”公众号 重磅干货,第一时间送 深度学习与NLP编辑 一组名为“贫民窟的亿万富豪”的人工智能(AI)画作在网上发布后,引起了全球关注。这组画作的作者是印度数字艺术家戈库尔皮莱&a…

华为开发者大会2023官宣,华为云在憋什么大招?

文丨智能相对论 作者丨沈浪 华为云也坐不住了。 在此之前,百度、阿里、商汤、科大讯飞等国内科技厂商以及微软、谷歌等国际巨头都已经发布了自家的大模型新品以及AIGC等相关应用。而华为云手握盘古大模型,却始终按兵不动,迟迟没有正式进场…

又一家顶级的大模型开源商用了!Meta(Facebook)的 Llama 2 搅动大模型混战的格局...

“ 百模大战,花落谁家?” 01 — 开源、免费‍ 今年2月24日,Meta推出大语言模型Llama(羊驼),按参数量分为7B、13B、33B和65B四个版本。它凭借一己之力,引导了开源大模型的发展,由其演…

深度测评全新大模型「天工」,这些AI体验太香了

ChatGPT火了后,很多人都在关注“国产ChatGPT”的名号究竟花落谁家。 事实上,名号不重要,体验才是王道。ChatGPT能够火成“史上增长最快的消费者应用”,关键在于把体验提升到了新层次。毕竟对于用户来说,并不清楚产品背…

BLEXBot是什么蜘蛛,需要屏蔽这个爬虫吗

BLEXBot这个蜘蛛也是最近爬的比较厉害的一个,属于一家美国的反向链接查询网站(WebMeUp)的蜘蛛程序,它会大量的抓取我们的网站链接,所以一旦我们发现有他的抓取的踪迹,就会发现他真的是大量的抓取你的链接。…

孔乙己终结者!GPT-4拿100美元自创业,还要让马斯克下岗

【导读】GPT-4引发的新一波革命,把打工人推上了「断头台」。孔乙己的未来在哪里? GPT-4才诞生4天,人类就要失业了! 不仅要取代马斯克,还当上了大Boss,「孔乙己」的未来该怎么办? 就连Sam Altman…

文字转绘画的AI绘画效果不好?用ChatGPT辅助下立竿见影

对于那些喜欢宅在家里度过时光的女孩们来说,这种略带“莫测高深”的生活方式已经成为她们的日常习惯。不需要拘束的服装,只需舒适的衣服,蜷缩在舒适的沙发上与电脑、电视作伴,身边还要放置各种零食和饮料。最重要的是要有一只可爱…

申请百度语音识别API 接口-免费

1、浏览器打开:语音识别_语音识别技术_百度语音识别-百度AI开放平台 2、右上角-控制台,先登录上账号, 3、然后去点立即使用,进入后台, 4、点击-去领取,领取免费的额度 5、进去之后先实名认证,可…

百度API调用(三)——语音识别

python 调用百度语音识别API 一、开通百度语音技术接口服务二、python实现百度语音识别1、实现功能2、代码(已加注释) 最后 一、开通百度语音技术接口服务 基本过程: 1、打开百度ai开放平台 https://ai.baidu.com/ 2、打开控制台 3、选择…

百度语音SDK使用

百度语音SDK提供: 语音识别:将声音转成文字语音合成:将文字转成语音文件,然后播放语音文件,即文字变声音。语音唤醒:语音唤醒,激活运用程序 在这里,本篇介绍百度语音合成的使用。 百度语音介…