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

news2024/11/19 0:44:28

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

顺序表的实现icon-default.png?t=N4HBhttp://t.csdn.cn/Lxyg2单链表的实现icon-default.png?t=N4HBhttp://t.csdn.cn/rHgjG双链表的实现icon-default.png?t=N4HBhttp://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个原因,在加载当前数据时也会将当前数据后面的字节一并加载到缓存中。🔍顺序表存储的数据是连续的,第一次访问数据时发现当前数据不在缓存中会将当前数据和后面的几个字节一并加载到缓存中,访问第二个数据时发现该数据已经或有部分被加载到缓存中,则可以直接访问,提高效率;🔍链表存储的数据不是连续的,第一次访问数据时会将当前数据和后面几个字节一并加载进缓存中,访问下一个数据时由于数据不是连续存储所以访问的数据大概率没有被加载到缓存中,需要重新加载,这会导致访问速率下降,并且每次加载时会将加载数据后面的字节一并加载,这个数据不是我们想要的,会造成缓存污染。

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

使用场景

🔍如果需要频繁的访问数据和尾插尾删数据或高效存储数据建议使用顺序表。🔍如果需要频繁任意位置插入或者删除建议使用链表。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国考省考行测:现期比重,基期比重

国考省考行测: 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

【c++】位图与布隆过滤器

一.位图 1.位图的概念 给 40 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这 40 亿个数中。【腾讯】 刚开始许多同学能想到的方法有: 1. 遍历,时间复杂度 O(N) 2. 排序 (O(NlogN)) &#x…

分代回收工作流程

GC回收算法之分代回收 GC回收垃圾主要有三个算法,分别是标记清除,复制算法以及标记整理。 三种算法各有优缺点,其中标记清除的优点就是简单高效,缺点就是很容易带来内存碎片化问题。 复制算法的话,优点确实解决了内存碎…

springcloud-alibaba (02)nacos学习笔记

nacos 一,介绍1. 什么是Spring Cloud Alibaba Nacos2. Nacos的特点和优势 二,安装和配置三,创建项目第一步,创建父工程第二步,创建基础公共模块第三步,创建服务模块第四步,开启多个实例 四&…

用Python进行AB测试之T检验的案例学习【文末源码地址】

文章目录 案例背景假设检验解读一、提出假设二、检验统计量三、代码实现四、结论 源码地址 案例背景 产品经理对APP做了许多改动,想要通过AB测试评估一下改动后的效果如何? 其中有一项评估是:签到按钮从蓝色改为红色后,客户点击…

Java 成员变量与局部变量有什么区别?

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符…

Smart HTML Elements Crack

Smart HTML Elements Crack Smart HTML Elements是一个现代的Vanilla JS和ES6库以及下一代前端框架。企业级Web组件包括可访问性功能(WAI-ARIA,第508/WTAG法规遵从性)、本地化、从右到左键盘导航和主题化。与Angular、ReactJS、Vue.js、Bootstrap、Meteor和任何其他…

vue编写组件 根据指定日期获取一周内所有 日期与农历日期展示 并标记当天

首先 我们要引入一下对应的第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader这里 我们需要 chinese-lunar-calendar 将日期变成农历日期的工具 sass是因为 我这里为了方便 用了 sass写样式 组件代码如下 <template><headerclass "ske…

学习自动化这3个坏习惯要你命,90%测试人躺枪!

将自动化测试当成很了不起的资本&#xff0c;源于国内对Coding的崇拜 盲目的学习自动化&#xff0c;不光对你的工作没有帮助&#xff0c;可能对你的测试之路还会起反作用&#xff01; 1,为什么说盲目学习自动化可能会让你一无是处&#xff1f; 没有全面理解软件测试的基本原理…

让自己再认识一下分区吧

在上个博客中&#xff0c;我们讨论了复制 —— 即数据在不同节点上的副本&#xff0c;对于非常大的数据集&#xff0c;或非常高的吞吐量&#xff0c;仅仅进行复制是不够的&#xff1a;我们需要将数据进行 分区&#xff08;partitions&#xff09;&#xff0c;也称为 分片&#…

【Proteus仿真】| 51单片机——MAX7219 驱动数码管

系列文章 todo: 文章目录 前言1. 简单了解MAX72191.1 引脚说明1.2 寄存器说明1.2.1 选位寄存器1.2.2 BCD译码器设置寄存器1.2.3 亮度寄存器1.2.4 扫描限制寄存器1.2.5 显示测试寄存器1.2.6 关停寄存器 1.3 spi总线通信时序1.4 数据格式 2. 使用MAX7219驱动数码管2.1 驱动数码管…

【2023/05/18】TPU

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第13天。 Share The waterfall sings,"I find my song,when I find my freedom." 译文&#xff1a; 瀑布歌唱到&#xff1a;“我得到自由时便有了歌声。” I cannot tell why this heart la…

精彩直击 | 迅镭激光参展CIBF2023年电池技术盛会

5月16日&#xff0c;全球规模最大的电池、能源行业盛会——CIBF2023第十五届中国国际电池技术展览会(以下简称2023CIBF电池展)&#xff0c;在深圳国际会展中心(宝安新馆)隆重开幕! 迅镭激光携一系列新能源自动化解决方案亮相9T263展位&#xff0c;与客户分享创新技术及自动化产…

【Jmeter第四章】Jmeter添加断言(捕捉自定义错误信息)

文章目录 1、断言介绍2、Jmeter使用断言3、效果展示 1、断言介绍 前言&#xff1a;关于Jmeter中的断言&#xff0c;其实可以理解为对返回信息&#xff0c;返回代码的一种处理&#xff0c; 因为对应HTTP状态200而言&#xff0c;但我们会定义不同的返回值&#xff0c;例如 code…

【数据结构<顺序表>】C语言

前言 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…

linux swap交换区满了怎么办(已解决)

swap交换区满了怎么办 一、不增加交换区的方法 free -m 或free -h查看占用情况 使用如下指令来查看占用swap的前十进程 for i in $( cd /proc;ls |grep "^[0-9]"|awk $0 >100) ;do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i…

仓库信息管理系统设计与实现

一、数据库设计 1.数据库模型设计概览 2.数据库表设计 ①depository 描述&#xff1a; 该表存储仓库的信息&#xff0c;比如仓库名称&#xff0c;仓库地址和仓库介绍 表结构&#xff1a; 序号 字段名 数据类型 主键 非空 默认值 描述 1 id INT(10) 是 是 2…

LlamaIndex 联合创始人下场揭秘:如何使用私有数据提升 LLM 的能力?

ChatGPT 的爆火证明了大型语言模型&#xff08;LLM&#xff09;在生成知识和推理方面的能力。不过&#xff0c;ChatGPT 是使用公共数据集进行预训练的模型&#xff0c;因此可能无法提供与用户业务相关的特定答案或结果。 那么&#xff0c;如何使用私有数据最大化发挥 LLM 的能力…

SpringMVC第三阶段:源码解析SpringMVC如何调用Controller目标方法

源码解析SpringMVC如何调用Controller目标方法&#xff1a; 浏览器如何访问到Controller目标方法. 1、所有请求进入时候,会先进入org.springframework.web.servlet.DispatcherServlet前端控制器的doDispatch() 方法 2 、在 1016 行 getHandler() 方法中,会通过请求的资源路径…

【51单片机】万年历功能的数字时钟+倒计时 Proteus仿真 普中板子可用

// 硬件&#xff1a;DS1302、按键、LCD1602、无源蜂鸣器 // 1、具有万年历功能的数字时钟 (本世纪100年通用)&#xff0c;能够正确的显示年、月、日、时、分、秒 // 2、按键设置时间(校时) // 3、24小时内至少可设置3个闹钟&#xff0c;并具有不同的闹钟铃声。每个闹钟可以选择…