<数据结构>顺序表和链表的比较|缓存命中率

这篇具有很好参考价值的文章主要介绍了<数据结构>顺序表和链表的比较|缓存命中率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💭前言:通过之前对顺序表和链表的实现,我们可以发现在增删查改某些操作上两者的效率前言有所差异,本篇文章将总结二者的异同。

顺序表的实现http://t.csdn.cn/Lxyg2单链表的实现http://t.csdn.cn/rHgjG双链表的实现http://t.csdn.cn/j3amO

存储空间

📚顺序表通过数组来实现的,所以在物理存储空间上是连续的。链表是通过指针域找到下一个节点的,所以在物理存储空间上一般不连续,逻辑结构上是连续的。

随机访问

📚数组支持下标访问,所以可以在O(1)时间复杂度下访问顺序表的任意位置,链表不支持随机访问,像访问中间的任意节点必须从头开始遍历,时间复杂度为O(1)。

插入删除节点

📚数组删除除最后一个元素外的任意元素或在最后一个元素后面插入元素时都需要挪动数据,因此顺序表删除、插入元素的时间复杂度为O(n);🔍 在已知删除、插入元素地址时,链表可以仅通过O(1)的时间复杂度删除、插入元素。

缓存命中率

来自百度百科的解释:始端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要回原服务器取,就是没有命中。取数据的过程与用户访问是同步进行的,所以即使是重新取的新数据,用户也不会感觉到有延时。 命中率=命中数/(命中数+没有命中数), 缓存命中率是判断加速效果好坏的重要因素之一。

 对于没有硬件基础的人来说想要理解上面这句话并不容易,因此我将用我自己的理解来解释缓存命中率。

在此之前我们需要了解计算机存储器的结构<数据结构>顺序表和链表的比较|缓存命中率

         我们较为熟悉的存储器是磁盘和主存,🔍两个的区别在于主存中只有在通电的状态下才会存储数据,而磁盘里的数据可以永久保存。🔍另外一个区别是从主存中读取数据比从磁盘读取数据据要更快。程序定义的变量是在主存中的,但是CPU读取数据时并不会直接从主存里面读取数据,而是将数据加载到高速缓存或者寄存器中(取决于读取数据的大小),🔑原因在于CPU读取数据的速度很快,而主存相对CPU来说加载数据太慢了,因此读取数据时会先将数据加载到更快的存储器中再被CPU读取。

💬验证从寄存器中读取数据

int i = 1;
00081F75  mov         dword ptr [i],1  
	i++;
00081F7C  mov         eax,dword ptr [i]  
00081F7F  add         eax,1  
00081F82  mov         dword ptr [i],eax  

❕当数据更大时会将数据加载到告诉缓存中,CPU从告诉缓存中读取数据。

❓如果要经常访问和修改数据,下面两种数据结构使用哪种更合适?

<数据结构>顺序表和链表的比较|缓存命中率

💡答案:顺序表更好。

🔑解析:CPU读取数据时会查看数据是否在缓存中。①如果数据不在缓存中,称为缓存不命中,则会先加载数据到缓存中,再访问该数据;②如果数据在缓存中,称为缓存命中,直接访问该数据。

❕接下来就是顺序表更适合的本质原因了----①由于硬件的设计,当将数据加载到缓存和将当前数据与当前数据后面几个字节(与CPU字节长度有关)一起加载到缓存中所需要的成本是一样的。②当将当前数据加载到缓存中时,计算机会认为你有很大概率访问紧接当前数据的数据。出于这2个原因,在加载当前数据时也会将当前数据后面的字节一并加载到缓存中。🔍顺序表存储的数据是连续的,第一次访问数据时发现当前数据不在缓存中会将当前数据和后面的几个字节一并加载到缓存中,访问第二个数据时发现该数据已经或有部分被加载到缓存中,则可以直接访问,提高效率;🔍链表存储的数据不是连续的,第一次访问数据时会将当前数据和后面几个字节一并加载进缓存中,访问下一个数据时由于数据不是连续存储所以访问的数据大概率没有被加载到缓存中,需要重新加载,这会导致访问速率下降,并且每次加载时会将加载数据后面的字节一并加载,这个数据不是我们想要的,会造成缓存污染。

🔺总结:当需要频繁访问数据时,使用顺序表可以提高缓存命中率,减少缓存污染。

使用场景

🔍如果需要频繁的访问数据和尾插尾删数据或高效存储数据建议使用顺序表。🔍如果需要频繁任意位置插入或者删除建议使用链表。文章来源地址https://www.toymoban.com/news/detail-449550.html

到了这里,关于<数据结构>顺序表和链表的比较|缓存命中率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:2_顺序表和链表

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构, 常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的 ,线性表在物理上

    2024年01月18日
    浏览(55)
  • 【数据结构初阶】顺序表和链表(1)

    线性表(linear list) 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上

    2024年02月08日
    浏览(242)
  • 数据结构奇妙旅程之顺序表和链表

    ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人主页:xiaoxieʕ̯

    2024年02月05日
    浏览(66)
  • 【手撕数据结构】(三)顺序表和链表

    🎗️线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 🎗️线性表在逻辑上是线性结构,也就说是一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储

    2024年02月05日
    浏览(55)
  • 数据结构修炼第二篇:顺序表和链表

    第一章 时间复杂度和空间复杂度 第二章 顺序表,列表 第三章 栈和队列 第四章 二叉树 第五章 排序 作者:🎈乐言🎈 简介:🎈大一学生,目前在致力于c/c++/python,高数的学习,有问题尽管问我,关注后私聊! 持续更新专栏:《c进阶》,《数据结构修炼》 🚀 (优质好文持

    2024年02月02日
    浏览(118)
  • 初阶数据结构之---顺序表和链表(C语言)

    线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上存储时,通常以 数组 和 链式结构 的形式存储。

    2024年02月22日
    浏览(67)
  • 【数据结构篇C++实现】- 线性表 - 顺序表和链表

    友情链接:C/C++系列系统学习目录 故事导入: 幼儿园放学时,一个班级的小朋友,一个跟着一个排队出校,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面和后面的一个是谁,就如同一根线把他们串联了起来。如此具有像线一样的性质的表就叫线性表 线性表(

    2024年02月07日
    浏览(57)
  • 顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

    目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组  3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义  2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双向链表 双向链

    2024年01月24日
    浏览(53)
  • 探索树形数据结构,通识树、森林与二叉树的基础知识(专有名词),进一步利用顺序表和链表表示、遍历和线索树形结构

      结点之间有分支,具有层次关系 树的定义 : 树 (tree)是n(n≥0)个有限集。 若n = 0,则称为空树; 若n 0,则它满足如下两个条件: 有且仅有一个特定的称为根(Root)的结点; 其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3,.....,Tm,其中每一个集合本身又是一棵树,并称为根的

    2024年02月01日
    浏览(53)
  • 顺序表和链表的练习题

    该题目需要先对顺序表进行遍历至元素x正确插入位置,再对顺序表完成插入操作。因此涉及到for循环与if语句的使用 该题目需要对顺序表制定元素删除,并且还需要返回值。所以定义的函数接口不能为void类型,使用for循环对p后继顺序表元素进行遍历前移,且考虑可能出现删

    2024年04月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包