【初阶数据结构】顺序表与链表的比较(附题)

news2024/11/24 10:58:43

目录

一、顺序表和链表的区别(其他链表存在缺陷,比较意义不大,这里用带头双向循环链表与顺序表进行比较)

1.1插入、扩容与随机访问

二、缓存利用率的比较

2.1前置知识

详解及补充知识(本文仅为比较顺序表及链表,相关缓存与知识可以看下文)


一、顺序表和链表的区别(其他链表存在缺陷,比较意义不大,这里用带头双向循环链表与顺序表进行比较)

不同点顺序表链表(带头双向循环)
存储空间上物理上一定连续逻辑上连续,但物理上不一定连 续
随机访问(用下标随机访问)支持O(1)不支持:O(N)
任意位置插入或者删除元 素可能需要搬移元素,效率低O(N)只需修改指针指向
插入动态顺序表,空间不够时需要扩 容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁
缓存利用率

1.1插入、扩容与随机访问

首先链表的,如果知道要插入的位置,我们可以修改前后节点的指针,直接插入数据,不需要挪动其他数据非常方便。而顺序表我们如果在数据间插入数据就要将其他数据前移或后移。可能会出现为了插入一个数据而挪动原先所有数据的情况,成本较大。

其次,链表的本身没有容量的概念,节点都是按需申请的,不需要考虑扩容的问题。

这方面扩容本身就有很大的消耗。使用realloc扩容主要会有原地扩容和异地扩容两种情况。

如果要扩的空间不大,在已有空间接下来的地址够用或者可用,就会使用接下来的地址扩大原空间,这个过程原空间地址不变只是单纯申请空间扩大。一但接下来的空间不可用或者不够,realloc就会另寻一块足够大的可用地址申请空间(地址改变),之后将原空间中数据复制过来,并释放原空间。显而易见的,异地扩容的消耗较大。

此外扩容还会存在的一个问题是存在空间浪费,比如一般来说我们原空间容量是100,现在需要插入5个新元素,我们一般将原空间扩大两倍,但是可能我们只会插入5个数据,这就会浪费95个空间。

需要注意的是扩容存在的两个问题还是相互影响的,我们一般按照二倍扩容其实是通过概率学计算希望减少扩容次数,避免异地扩容的消耗,但是这样扩容大了,又会造成浪费的问题;反过来,为了节省空间,扩容小了,就会需要多次扩容,这样异地扩容的消耗会非常大。

不过一般来说。单次扩容大,减小扩容次数,节省时间;单次扩容小,扩容次数多,节省空间。除了物联网等领域,时间比空间更宝贵,所以一般扩容扩大点。

但是链表有个比较大的缺陷是不支持随机访问(用下标访问),如果大家学过C++的STL,就会发现链表的排序比起顺序表来说没有优势,此外如二分查找等场景都需要使用顺序表或者说数组。

总的来说,顺序表在存储空间连续、支持随机访问等方面占有优势,链表在没有容量和任意位置插入方面占优势。顺序表与链表是互补,各有优势。

二、缓存利用率的比较

2.1前置知识

备注:缓存利用率参考存储体系结构以及局部原理性。

如上图,为我们电脑中存储体系,一般来说我们接触最多的是主存(即内存)和本地磁盘(磁盘或者叫做外存),两者的区别在于内存是带电存储,速度快,但是空间相对较小,8G、16G等;而磁盘是不带电存储,速度慢,但是空间大,可以达到几百G及以上。所谓带电与不带电存储是指程序运行时数据主要在内存上,如果此时断电,数据都会丢失,如果我们按保存,文件就会被保存到硬盘上,这样即使断电,数据也会保留下来。

以上图i++为例,程序运行后由CPU来执行一系列指令,但是CPU的速度与内存的速度相差非常大,两者不同频,所以将内存中的数据加载到寄存器中,CPU再对寄存器中的数据进行操作,然后将数据放回内存中,这是数据较小的情况(四或八个字节),如果数据较大,就会加载到L3高速缓存中,然后L2,L1一级一级加载。

2.2顺序表和链表缓存利用的比较

像顺序表和链表中的数据较大,是加载到缓存中的,CPU执行指令之前,会先拿链表或顺序表的地址,判断数据在不在缓存中,如果数据在缓存中,叫做缓存吗,命中,可以直接访问缓存;如果不在缓存内,叫不命中,这是要先把数据从内存加载到缓存中再访问。

在这个加载的过程中由于计算机局部设计原理与计算机设计逻辑,往往访问当前位置,那么极有可能访问,同时单独只访问当前位置的设计不划算((使用物理线探测当前位置是0还是1)),所以一般会加载一段一长段(几十个字节,甚至是多少k),具体数值跟CPU的型号(字长)有关系

这时对于数组来说,如果第一个数据不命中,那么就会将第一个数据连同后面一大段数据加载到缓存中(数组不同数据存储的物理地址是连续的),之后我们连续访问多个数据都会出现缓存命中的前情况,我们将这称为缓存命中率高,

但是链表不同节点的物理地址极大概率是不连续的,这时将第一个节点连同后面一大段数据加载到缓存中时,极大概率是无法加载第二个节点到缓存中的(可能加载部分节点),这时内存中就会加载进很多无用数据,因为缓存大小是固定的,根据最近最少用原则(LRU),这些无用数据会把缓存中之前早期的数据挤走,我们将这种情况称为缓存污染。所以链表的缓存命中率较低。

详解及补充知识(本文仅为比较顺序表及链表,相关缓存与知识可以看下文)

与程序员相关的CPU缓存知识

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

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

相关文章

照片怎么转jpg格式?这些照片格式转换方法简单又高效

图片已成为我们日常生活与工作中不可或缺的一部分。然而,面对多种多样的图片格式,如何高效地将它们转换为最常用的JPG格式,成为了许多人面临的难题。下面给大家分享常用的几种照片格式转换方法,一起来了解下吧。 方法一&#xff1…

数据结构之树体系:二叉树、平衡二叉树、红黑树、AVL树、B树、B+树、最小生成树、哈夫曼树、决策树、LSM树、后缀树、R树

概述 数据结构与算法 二叉树 其中每个结点都不能有多于两个子结点: 满二叉树:若设二叉树的高度为 h h h,除第 h h h层外,其它各层(1~h-1) 的结点数都达到最大个数,最后一层都是叶子结点,且叶…

CICD持续集成持续交付部署

一、CICD概念 1、什么是CI/CD? 通俗来说就是启动一个服务,能够监听代码变化,然后自动执行构建、测试、打包、发布等流程; 2、CI 持续集成 指在开发人员频繁地提交新代码,都会自动执行构建、测试。根据测试结果&…

WPS回应“崩了”:提供15天会员补偿,另有新羊毛,你还不来薅?

近期,“WPS崩了”这一话题在时隔两个月后,再次因多名用户反馈软件使用问题而登上微博热搜。 WPS官方微博随后发布消息称,经过工程师的紧急修复,WPS服务已经恢复正常。 为了补偿用户,在8月22日0点至24点期间&#xff…

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近,数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代,只要模拟材料能够数字化。 例如,讨论中涉及到的纸艺软件,纸龙的移动模型被时间锁定,以大约 3 fps(每秒帧数&a…

vm 虚拟机无法调用摄像头(亲测有效)

-- 前言1 报错说明1.1 opencv调用摄像头失败,画面窗口无法显示1.2 选择连接摄像头出现失败:桌面右下角出现【USB 设备“Acer Integrated RGB Camera"的连接失败】连接摄像头方法 2 解决方法步骤一步骤二步骤三 补充 前言 网上找的很多方法都是无效…

2024年游泳耳机哪个牌子好?四大热门游泳耳机多维测评盘点!

游泳不仅是夏日里最受欢迎的消暑方式,也是全年无休的一项全身性运动。在水中畅游时,若能伴随着喜爱的音乐,无疑能让体验更上一层楼。近年来,随着骨传导技术和防水材料的进步,游泳耳机已经成为许多游泳爱好者的必备装备…

网络编程,网络协议,UDP编程

网络: 1.协议:通信双方约定的一套标准 2.国际网络通信协议标准: 1.OSI协议: 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …

electron仿微信,新建贴合窗口

说明 在写electron项目时,只有一个主窗口不足以满足需求,我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样,全贴合在一起,看起来像一个整体呢: 分析 这个窗口有点像element ui中的抽屉(drawe…

回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出

回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出 文章目录 前言回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出 一、NGO-Transformer-BiLSTM模型回归预测:NGO-Trans…

VUE学习笔记 2

条件渲染 v-if : 若不频繁切换,会删除DOM节点,再重复添加; template只能配合v-if v-show: 适用于频繁切换,动态变换但不删除DOM节点 列表渲染 方式: v-for"p in person" :key"yyy" 遍历数组…

详讲C#中如何存储当前项目的设置-超级简单省事

我们在编写软件的时候总有一些配置数据需要保存,比如用户选择的偏好设置,又如软件所用到的数据库文件等。我们有很多中方式都可以保存,比如直接保存在某个文本文件,或者ini文件中,其实最简单的办法是保存在项目的资源文…

File的常见成员方法(创建,删除)

一.File的常见成员方法(创建,删除): 二.方法的代码实现: 1.createNewFile方法->创建一个新的空的文件: 如上图直接调用createNewFile方法会报错,处理方案如下: 本例选择第一个&a…

Kotlin OpenCV 图像图像51图片轮廓获取

Kotlin OpenCV 图像图像51图片轮廓获取 在OpenCV库中,Imgproc.adaptiveThreshold、Imgproc.findContours 和 Imgproc.boundingRect 这三个方法在图像处理和分析中非常有用。以下是它们的详细作用: Imgproc.adaptiveThreshold解释作用该方法用于将灰度图…

工业排污检测算法的算法样本及工业排污检测的源码展示

工业排污检测算法是一种结合了先进人工智能、图像识别、声音识别、数据分析等技术的解决方案,专门用于实时监测和评估工业排放的污染物。这种算法在环境保护、合规管理、数据支持等方面具有显著的优势,并且可以广泛应用于各种工业场景。 主要作用 1、实…

宝塔面板本地搭建Typecho博客结合内网穿透实现远程访问本地站点

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 本文主要介绍如何通过Linux centOS8宝塔面板工具,本地搭建一个Typecho个人博客网站。并结合cpolar内网穿透工具配置公网…

关于Arrays.asList返回List无法新增和删除?

这个是在写项目的时候发现的&#xff0c;然后就分析了一下源码&#xff0c;得其内部原理 复现代码示例&#xff1a; public class ArraysAsList {public static void main(String[] args) {Integer[] array {1, 2, 3, 4, 5};List<Integer> list Arrays.asList(array);…

html+css+js网页制作 电商小米商城7个页面

htmlcssjs网页制作 电商小米商城7个页面 ui还原度百分之99 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 …

uniapp/uniapp x总结

uni-app组成和跨端原理 上图所诉 App的渲染引擎&#xff1a;同时提供了2套渲染引擎&#xff0c;.vue页面文件由webview渲染&#xff0c;原理与小程序相同&#xff1b;.nvue页面文件由原生渲染&#xff0c;原理与react native相同。开发者可以根据需要自主选择渲染引擎。 uniapp…

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(2)

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(2) 简介 实验 2&#xff1a;在单片机搭建好 tcp 服务器后&#xff0c;编写传送文件的上位机。 整体实现 - 利用qt的tcpsocket简单封装 - 每次发送512字节&#xff0c;这样小的tcp包就不会自动分包。保证每一个51…