【数据结构】链表与顺序表的比较

不同点:

顺序表和链表是两种常见的数据结构,他们的不同点在于存储方式和插入、删除操作、随机访问、cpu缓存利用率等方面。

一、存储方式不同:

顺序表:

顺序表的存储方式是顺序存储,在内存中申请一块连续的空间,通过下标来进行存储;

链表:

链表的存储方式是链式存储,申请的空间是未必连续的,以节点的形式连接,每个节点会有一个next指针,指向下一个节点,通过指针来访问元素;

二、插入、删除的效率不同:

顺序表:

插入删除元素时,需要移动元素的位置也就是搬移元素,导致效率低下

链表:

插入删除时只需要修改指针指向。

三、内存利用率:

顺序表:

需要扩容,创建空间大小是固定的,当空间不够时需要进行扩容,以2倍的关系扩增的,你少一个空间,我增大到原来的2倍,还会有多余空间未使用,所以扩容会造成空间浪费的现象。

但是注意我们因为用的realloc扩容,所以扩容本身会有消耗!!👉👉👉

由于realloc扩容的特性,不确定是原地还是异地扩容,这个与编译器有点关系

原地扩容:扩容的空间地址与原来地址相同

异地扩容:扩容的空间地址与原来地址不同(将原来的数据拷贝过来,还要销毁原来的空间)

链表:

按需申请的空间,不会存在空间浪费现象,利用率极高

四、随机访问:

顺序表:

支持用下标随机访问

链表:

不支持,因为空间在物理上就不是连续的,next找到下一个节点,在用该节点的next找一个,找起来比较麻烦

五、缓存利用率:

缓存👉CPU高速缓存🧑‍🎓🧑‍🎓 内存在带电的情况下存储,当断电后未保存的数据会丢失(就像我们在用画板时,画了画,你给电脑关机,下次进去就找不到了)但其速度快,而硬盘可以不带电存储,但是速度慢。

🤔🤔为啥有寄存器和三级缓存??

✨✨主要是cpu的运行速度很快,看不上内存日常不会去访问内存,但是寄存器和三级缓存的速度还是能入下眼✨✨

我们写的代码时,变量存在内存里面,当你要修改变量时会将数据放到寄存器,然后cpu对其接收指令进行修改

看下面代码的反汇编,mov 是将 i 放到 eax(寄存器)中,然后对寄存器的数据进行inc指令也就是加1, 在讲寄存器的数据放到可i中

但是寄存器个数有限,一般对于4个 8个字节会放到寄存器,数据比较大会加载到缓存,( 缓存里面还要涉及到三级缓存的调用,有点深奥,不讲这么难的,可以自己去查资料)

cpu访问数据会先访问数据是否在缓存中,在---》缓存命中,直接访问。

                                                                不在---》不命中,先将数据加载到缓存中,再进行访问。

🤔怎么加载到缓存的??

cpu会按cpu字长去读,会认为你访问当前数据后面(连续在一起的)都不在缓存中,给它加载进去

举个例子:数组为例子,下面的20个人就是一个数组。度假村相当于缓存,领导是cpu,大巴车也是cpu,cpu给你加载到缓存,再访问

注意:缓存有一定的范围,新进来的过多,放不下了,就给旧的清理掉!


对于链表了,你的物理空间是不连续,拉的数据太多,会把缓存区之前的一些数据排挤走了

顺序表:

 CPU缓存利用率高。

链表:

CPU缓存利用率低。

六、总结:

不同点顺序表单链表
存储空间物理上一定连续(底层是数组)只是逻辑上连续,物理上并不连续
随机访问下标访问 O(1)不支持:要遍历O(N)
任意位置的增删需要搬运元素,效率低O(N)无需搬运,只需要修改指针指向
插入动态顺序表,需要扩容(成倍扩容,可能会造成空间浪费)按需申请,没有扩容这一说法
应用场景元素的高效存储+频繁的访问任意位置插入+删除频繁
CPU缓存利用率缓存利用率高缓存利用率低

链表和顺序表各有优势,互相弥补各自的缺点

总之,顺序表用于数据元素较少、读取操作频繁的场景,而链表更适用于数据元素较多、插入、删除操作频繁的场景。

  就到               这吧  ❤️🫰

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

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

相关文章

解决OpenCV读取目标图像,cv2.imshow出现闪退的问题

前言 本文是该专栏的第17篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 最近有粉丝朋友询问到OpenCV读取目标图像出现的一个问题,在基于python语言“使用OpenCV读取目标图像的时候,利用cv2.imshow函数出现闪退”的情况。 而本文,笔者将详细介绍针对上述问题,…

【硬件工程师话家常】硬件工程师的项目时间管理

在整个项目研发团队中,有两个人和所有人打交道,一个就是项目经理,另一个就是硬件工程师。硬件工程师需要和各种研发人员打交道 、协调工作,这也要求硬件工程师具有丰富的知识面和强大的协调能力。 硬件工程师处于一个项目中的核心…

Java运算符及程序逻辑控制

🎉welcome to my blog 请留下你宝贵的足迹吧(点赞👍评论📝收藏⭐) 💓期待你的一键三连,你的鼓励是我创作的动力之源💓 🐣目录 🍀运算符📚1.算术运算符&#x…

centos7安装jq报错No package jq available

安装EPEL仓库 sudo yum install epel-release清理软件仓缓存 sudo yum clean all重建软件仓缓存 sudo yum makecache重新安装jq yum install jq

python基础知识点(蓝桥杯python科目个人复习计划67)

今日复习内容:做一下昨天的算法赛题目,试试基础怎样 小白挑战赛一共6题,我只会5题,而且这5题是全对的,比起上次的两题,已经有进步了。 第一题:六一献礼 题目描述: 六月的阳光热情…

python判断文件是否存在

import os test_path "/Users/yxk/Desktop/test/GrayScale.tif" if(os.path.exists(test_path)):print(文件存在!!!!) else:print("文件不存在!!!!")结果如下 …

net前端怎么集成:探索集成之道

net前端怎么集成:探索集成之道 在软件开发领域,前端集成是一个复杂而关键的环节。特别是在.NET框架中,前端集成的成功与否直接影响着应用程序的整体性能和用户体验。本文将深入剖析net前端集成的四个方面、五个方面、六个方面和七个方面&…

RabbitMQ(四)事务消息,惰性队列,优先队列

文章目录 事务消息概念配置 惰性队列概念应用场景 优先队列概念配置 事务消息 仅在生产者端有效,消费端无效 概念 总结: 在生产者端使用事务消息和消费端没有关系在生产者端使用事务消息仅仅是控制事务内的消息是否发送提交事务就把事务内所有消息都发送…

Python知识点13---面向对象的编程

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python是一个完全面向对象开发的语言,它的一切都以对象的…

Java面试——专业技能

优质博文:IT-BLOG-CN 一、简单讲下 Java 的跨平台原理 由于各个操作系统(Windows,Linux等)支持的指令集不是完全一致的。就会让我们程序在不同的操作系统上要执行不同的程序代码。Java 开发了适用于不同操作系统及位数的 Java 虚拟…

【教程】自监督 对比学习,代码,爽学一波

from: https://docs.lightly.ai/self-supervised-learning/examples/simclr.html

代码随想录第22天|回溯part2 组合总和III电话号码的字母组合

216.组合总和III 当组合的数量为k就判断和&#xff0c;并且返回。 在枚举的时候可以进行剪枝&#xff0c;如果总和已经超过了n&#xff0c;那么就没必要继续递归下去了 class Solution { public:vector<int> path;vector<vector<int>> res;void backTrackin…

微信小程序手机号码授权登录

文章目录 一、微信小程序开发二、使用步骤1.前端代码2.后台配置3.后台代码 总结 一、微信小程序开发 目前个人的小程序无法使用手机号码授权登录&#xff0c;可以使用测试号进行开发 二、使用步骤 1.前端代码 代码如下&#xff08;示例&#xff09;&#xff1a; <butto…

Java版本家政上门系统源码,自主研发、安全可控,支持任意二次开发

家政上门系统源码&#xff0c;Java版本&#xff0c;自主研发、安全可控。支持任意二次开发、有丰富合作案例。多端管理&#xff1a;管理端、用户端、服务端。 技术参数&#xff1a; 技术架构&#xff1a;springboot、mysql 、Thymeleaf 开发语言&#xff1a;java1.8、vue 开…

python 象棋小游戏代码

以下是一个简单的Python象棋小游戏的代码示例。这个示例使用了pygame库来创建图形用户界面和处理用户输入。 首先&#xff0c;确保安装了pygame库&#xff1a; pip install pygame 然后&#xff0c;可以运行以下代码&#xff1a; import pygame import sys # 初始化pygam…

软件开发步骤详解

一、引言 随着信息技术的迅猛发展&#xff0c;软件已成为现代社会不可或缺的一部分。无论是企业运营、个人生活还是科学研究&#xff0c;都离不开各种软件的支持。因此&#xff0c;掌握软件开发的步骤和技巧对于IT从业者来说至关重要。本文旨在详细介绍软件开发的整个流程&…

Python知识点7---字典与集合

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的字典与集合是没有下标一说的&#xff0c;字典说的其实就是ma…

使用机器学习做医学图像分类的开源项目集锦

项目名称仓库描述主要特点适配建议U-Net用于生物医学图像分割zhixuhao/unetKeras中的U-Net实现&#xff0c;用于2D图像分割。 - 基本的U-Net架构 - 生物医学图像训练示例 - 简单的数据加载器 - 修改数据加载器以处理特定MRI格式 - 调整训练管道以适应STIR序列和标签 使用PyTor…

更改Web网站设计——css和css框架

虽然使用HTML可以定义文章的结构&#xff0c;但是其中不包含设计相关的信息。此时CSS就派上用场&#xff0c;可以用它对HTML文章指定设计样式。由于可以决定Web网页的外观风格&#xff0c;因此&#xff0c;它有时也被称为格式表。 如果使用CSS设置背景色&#xff0c;文…

计算机网络期末复习(1)计算机网络在信息时代对的作用 计算机网络的定义和分类 三种交换方法

计算机网络在信息时代扮演着至关重要的角色&#xff0c;它极大地改变了我们生活、工作和学习的方式。 计算机网络在信息时代的作用 信息共享与传播&#xff1a;计算机网络使全球范围内的信息快速共享成为可能&#xff0c;无论是新闻、学术研究还是娱乐内容&#xff0c;都可以…