2.12.顺序表和链表的比较

news2024/12/19 9:07:31

存储密度 = 数据元素本身占用的存储量 / 结点结构占用的存储量


一.逻辑结构:


二.物理结构/存储结构:

1.顺序表:

  • 优点:顺序表采用顺序存储的方式实现了线性表,由于采取了顺序存储,而且各个数据元素的内存大小相等,因此只需要知道该顺序表的起始地址即可立即找到某个元素在该顺序表中的位置,也就是顺序表拥有随机存取的特性,顺序表的每个结点中只需要存储数据元素本身即可(单链表每个结点中除了存储数据元素本身外还需要存储指向下一个结点的指针),因此顺序表的存储密度要比链表高

  • 缺点:顺序存储的存储结构要求系统分配一整片连续的存储空间,所以在给顺序表分配空间时会较繁琐,并且顺序表的容量一开始就固定了,想要改变顺序表的容量也会较繁琐(因为改变容量后可能数据溢出如减小顺序表容量导致数据溢出)

2.链表:

  • 优点:链表采用链式存储的方式实现了线性表,链表由于各个结点是离散的存放在空间中,所以添加一个结点时只需要动态地申请一小片的空间即某一个结点空间即可,同时由于各个结点的存储空间不要求连续,因此改变容量大小也会较容易

  • 缺点:链式存储的缺陷就是当查询某个数据元素时只能从第一个结点(头结点)开始依次往后遍历寻找,所以链表(链式存储)是不可以随机存取的,而且各个结点中除了存储数据元素外,还需要花费一定的空间来存储指向下一个元素的指针,所以链表的存储密度比顺序表低


三.基本操作:

销毁操作在考研中出现频率较少,但实际操作中是非常重要的;

改操作其实只要实现了查操作后进行赋值即可修改;

a.创建操作:

  • 顺序表:创建顺序表时由于顺序表要求分配一整片连续的存储空间,所以初始化顺序表时就需要预分配大片连续空间,如果一开始分配的空间较小,后期拓展容量时会很不方便,但一开始分配的空间过大,又会浪费内存空间

  • 链表:创建链表时只需要申明一个头结点(头指针),并且分配一个头结点所需要的空间即可,当然链表也可以是无头结点的,无论链表有没有头结点,对于链表来说,之后如果想要拓展链表容量时,其实很方便,只需要再申请一小片新的空间,然后再用指针的方式把这个新结点连接到链表中即可,所以链表的存储容量的可拓展性(灵活性)要比顺序表强

  • 总结:顺序表无论是采用静态分配(静态数组)还是动态分配(动态数组),都会导致数据变动量大,灵活性低于链表,所以在创建时优先考虑链表

b.销毁操作:

  • 顺序表:销毁顺序表首先要把顺序表的长度修改为0即顺序表变为空表,这是在逻辑上把顺序表标记为一个空表,但顺序表占用的存储空间实际上分为两种情况->1.如果顺序表采用静态分配的方式实现,那就意味着顺序表占用的存储空间是通过申明一个静态数组的方式来请求系统分配的,这种情况下这片存储空间的回收是由系统自动进行的,当定义的静态数组的生命周期结束时系统会自动把这片空间回收(申明一个变量来申请空间,当变量的生命周期结束时系统也会自动把这个变量回收),也就是说顺序表采用静态分配方式时对于空间回收是不需要手动操作的,只需要手动把顺序表长度改为0即可;2.如果顺序表采用动态分配的方式实现,也就是说动态数组是用malloc函数申请的一片空间,这种情况下就需要手动地把这片空间free掉,由malloc函数申请的内存空间是属于内存当中的堆区域,在堆区域的内存空间不会由系统自动地回收,也就是说需要手动free掉来实现回收

  • 链表:销毁链表本质就是把链表中的各个结点依次删除,所以对于链表的销毁操作核心就是一个free函数,可以写一个循环,依次扫描各个结点,把各个结点都free掉,这样就可以把链表中各个结点占用的空间都给回收(注:链表的结点也是由malloc函数申请的)

  • 注:用malloc函数手动申请的空间,那就必须手动用free函数销毁

c.增加操作&删除操作:

  • 顺序表:由于顺序表采用顺序存储的方式,要求各个数据元素在内存中是相邻且有序的,所以当插入/删除元素都需要把此次操作的位置之后的元素都给后移/前移->插入元素就后移,删除元素就前移,对于顺序表,插入/删除元素的最坏时间复杂度(插在顺序表第一个位置,就需要移动所有元素)和平均时间复杂度都为数量级O(n),时间开销主要来自移动元素

  • 链表:由于链表采用链式存储的方式,所以插入/删除元素只需要修改指针即可,链表的插入/删除元素的时间复杂度也是O(n),链表的时间开销主要来自查找目标元素,因为链表不具有随机存取的特性,要想找到要插入的位置,只能从第一个元素循环遍历依次往后查找,直达找到要插入的位置或者找到要删除的数据结点

  • 总结:虽然顺序表和链表插入/删除元素的时间复杂度都是数量级O(n),但如果数据量非常大时,移动元素付出的时间代价要比查找元素的代价大,也就是说单链表在插入/删除元素时要优于顺序表

d.查找操作:分为按位查找和按值查找

  • 顺序表:对于按位查找,要想找到某一个位序的元素所存放的位置只需要O(1)的时间复杂度,也就是说顺序表具有随机存取的特性;对于按值查找,如果顺序表中的各个数据元素的排列本来就是无序的,那么只能从第一个元素开始依次往后对比,所以时间复杂度为数量级O(n),如果顺序表中的各个数据元素的排列是有序的,则可以使用某些查找算法如折半查找在更短的时间内找到目标元素

  • 链表:链表只能从第一个结点开始依次往后遍历查找,所以它的按位查找的时间复杂度为数量级O(n);链表中的数据元素无论是有序还是无序,进行按值查找时都只能从第一个数据元素开始依次往后遍历,因此时间复杂度就是数量级O(n)

  • 查找操作中综合来看顺序表比链表更高效


四.总结:

例如排队适合用链表,因为队伍长度无法预估;一个班级的人数可用顺序表,因为一个班的人数可准确得知;


五.开放式问题的答题思路:

讨论基本操作时也要考虑效率。


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

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

相关文章

OSLC助力系统工程的全生命周期整合 (转)

本文作者胡振超,上海交通大学博士研究生。课题牵头人为鲁金直,瑞典皇家理工学院博士。本项目有Ericsson.SE高级顾问顾文卿,中科蜂巢相关工程师相关工程师所提供的基于多架构建模Karma语言的自主多架构建模工具MetaGraph、OSLC数据整合工具Dat…

electron打包linux环境

注意:新版的electron已经不支持在win上直接打包Linux的环境了,服务会卡住,会一直生成文件占用磁盘(我发现的时候占了我100G,而且文件夹很深,找了java代码while循环,好不容易删除的o(╥﹏╥)o) electron有一个专门打包的docker镜像&#xff0c…

活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享

近年来,云原生技术迅猛发展,成为企业数字化转型的关键动力,云原生不仅极大地提升了系统的灵活性和可扩展性,还为企业带来了前所未有的创新机遇。 12 月 28 日 知乎携手 AutoMQ、OceanBase 和快猫星云推出“云原生创新论坛”主题的…

AMS1117芯片驱动电路·降压芯片的驱动电路详解

编写不易,仅供学习,请勿搬运,感谢理解 AMS1117驱动电路 很常用的一种LDO降压芯片,LDO(Low Dropout Regulator)降压芯片是线性稳压器,这种IC因为内部集成的不是开关电路,只能将输入与输出的电压差值通过内部…

[论文阅读]Universal and transferable adversarial attacks on aligned language models

Universal and transferable adversarial attacks on aligned language models http://arxiv.org/abs/2307.15043 图 1:Aligned LLMs 不是对抗性 Aligned。我们的攻击构建了一个单一的对抗性提示,该提示始终绕过最先进的商业模式(包括 ChatG…

【HarmonyOS之旅】HarmonyOS开发基础知识(一)

目录 1 -> 应用基础知识 1.1 -> 用户应用程序 1.2 -> 用户应用程序包结构 1.3 -> Ability 1.4 -> 库文件 1.5 -> 资源文件 1.6 -> 配置文件 1.7 -> pack.info 1.8 -> HAR 2 -> 配置文件简介 2.1 -> 配置文件的组成 3 -> 配置文…

DDoS工作原理

原理 原理解释1 DDoS攻击的核心原理是利用大量的恶意请求占用过多的资源,使目标系统无法处理正常的请求。 这些恶意请求可以包括数据包或请求,通常通过分布式网络进行发送,利用多个计算机或设备协同攻击。 这些被控制的计算机或设备被称为“…

搭建springmvc项目

什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据,对数据进行处理,…

【USB-HID】“自动化键盘“ - 模拟键盘输入

目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现,网…

Scratch圣诞节作品 | 礼物快递大作战——限时挑战,传递圣诞惊喜! ✨

今天为大家推荐一款紧张又趣味十足的Scratch圣诞小游戏——《礼物快递大作战》!由CreativeCatStudios制作,这款作品用简单的操作、快节奏的玩法,将圣诞节的礼物传递任务变成了一场冒险挑战!更棒的是,这款游戏的源码可以…

Gin- Cookie\Session相关

Cookie,Session是什么? Cookie直译小饼干,是一些数据信息,类似于小型文本文件,存储在浏览器上。Cookie是进行第一次登录之后,由服务器创建后返回给浏览器的。之后,每当浏览器再次向同一服务器发…

uniapp 微信小程序 功能入口

单行单独展示 效果图 html <view class"shopchoose flex jsb ac" click"routerTo(要跳转的页面)"><view class"flex ac"><image src"/static/dyd.png" mode"aspectFit" class"shopchooseimg"&g…

uniapp开发微信小程序优化项目

问题一&#xff1a;对JS文件进行压缩 1、上传代码时自动压缩 2、运行时压缩压缩代码 3、以上2步不行可直接在开发者工具设置 二、 主包与vendor.js过大问题 1、配置 manifest.json 分包配置 与 组件懒加载配置 "lazyCodeLoading" : "requiredComponents" …

day50|DFS,BFS

深度优先遍历&#xff08;DFS&#xff09; 不撞南墙不回头算法 撞了之后就回退一步找别的路&#xff08;回溯算法&#xff09; 直到访问所有的顶点 注意&#xff1a;深度优先遍历的序列不是唯一的 若无向图非连通&#xff1a; 需要执行多次深度优先遍历 重要结论&#xff…

Linux系统安装部署Tomcat

1、进入Tomcat官网&#xff0c;官网地址&#xff1a;https://tomcat.apache.org/ 2、点击左侧Download下的Archives按钮 3、选择需要下载的版本 下载地址&#xff1a;https://archive.apache.org/dist/tomcat/ 4、点击自己需要下载的版本&#xff0c;我这里下载的是9.0.6 5、…

java全栈day17--Web后端实战(java操作数据库)

前言&#xff1a;本章应该是针对数据库基础讲解&#xff0c;数据的增删改查但是本人忘记对知识进行归纳总结就直接跳过&#xff0c;基本的内容都很简单&#xff0c;都是套式子使用。现在开始学习本章&#xff0c;很重要需要好好掌握。 一、使用的工具 二、JDBC 2.1概述 JDBC …

分立器件---运算放大器关键参数

运算放大器 关键参数 1、供电电压:有单电源电压、双电源电压,双电源电压尽量两个电源都接。如图LM358B,供电电压可以是20V或者是40V和GND。 2、输入偏置电流IB:当运放输出直流电压为零时,运放两个输入端流进或者流出直流电流的平均值。同向输入端电流IB+与反向输入端电流…

CS61a.1 textbook1.2 编程要素

1.structure and interpretation of computer programs Python 内置了对各种常见编程活动的支持&#xff0c; 例如&#xff0c;操作文本、显示图形以及通过 互联网。Python 代码行 >>> from urllib.request import urlopen是一个 import 语句&#xff0c;用于加载用…

第100+33步 ChatGPT学习:时间序列EMD-ARIMA-LSTM模型

基于Python 3.9版本演示 一、写在前面 上一节&#xff0c;我们学了经验模态分解&#xff08;Empirical Mode Decomposition&#xff0c;EMD&#xff09;。 如同结尾所说&#xff0c;“那么&#xff0c;做这些分解有什么作用呢&#xff1f;有大佬基于这些分解出来的序列分别作…

vulnhub靶场【DriftingBlues】之7

前言 靶机&#xff1a;DriftingBlues-6&#xff0c;IP地址192.168.1.65 攻击&#xff1a;kali&#xff0c;IP地址192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 SSH服务&…