【初阶数据结构】顺序表与链表的比较(附题)
目录
一、顺序表和链表的区别(其他链表存在缺陷,比较意义不大,这里用带头双向循环链表与顺序表进行比较)
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缓存知识
相关文章:
【初阶数据结构】顺序表与链表的比较(附题)
目录 一、顺序表和链表的区别(其他链表存在缺陷,比较意义不大,这里用带头双向循环链表与顺序表进行比较) 1.1插入、扩容与随机访问 二、缓存利用率的比较 2.1前置知识 详解及补充知识(本文仅为比较顺序表及链表&am…...
git-20240822
目录 初始化仓库 Git init Git init project --bare 查看提交的记录 git log --prettyoneline 查看当前git远程库地址 git remote -v 查看详细提交记录 git log 撤出暂存区的文件 git reset HEAD file(.代表全部文件) 提交数据到远程仓库 git config --global push.…...
【时时三省】c语言例题----华为机试题< 数字颠倒>
目录 1,题目 描述 输入描述: 输出描述: 示例1 2,代码...
【前缀和算法】--- 一维和二维前缀和模板
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本文开始,博主开始讲解有关前缀和的算法,本篇博客我们先来了解一下有关前缀和的两个模板。 🏠 一维前缀和模板 &…...
有些信息注定会丢失
智能在分析问题、做出决策时,总是希望获取尽可能多的信息,以此更加准确地决策。然而,很遗憾的是,有一些信息注定会丢失,不可能获取完全的信息,而且即使能够获取,智能也不能完全利用。 这一点与…...
c#中Task.Run 和使用 Task 构造函数创建任务的区别
Task.Run 和使用 Task 构造函数创建任务是两种不同的方法,它们在某些方面有显著的区别: 启动方式: Task.Run 是一个静态方法,它立即启动一个任务并在后台执行指定的工作。它通常用于快速启动一个简单的后台任务。使用 Task 构造函数创建任务&…...
使用nginx做代理转发
需求1:通过监听服务器的80端口,将请求转发到另一台服务器的8070端口 打开nginx/nginx.conf文件 server {listen 80;server_name localhost;location /analys {proxy_pass http://10.xx.xx.xx:8070/;} }需求2:通过监听服务器的80端口&am…...
Java前端与后端交互:JSON与XML数据交换 - 掌握现代Web开发的核心技能
引言 随着互联网技术的不断进步,Web应用变得越来越复杂,从前端到后端的每一个环节都需要精心设计以保证良好的用户体验。在这个过程中,数据的传递扮演着至关重要的角色。无论是简单的表单提交还是复杂的API调用,都需要一种可靠的…...
网络攻击原理及过程
网络攻击原理表 攻击者 内容 攻击访问 攻击效果 攻击意图 黑客 挑战 间谍 用户命令 破坏信息 好奇 恐怖主义者 脚本或程序 本地访问 信息泄密 获取情报 公司职员 自治主体 远程访问 窃取服务 经济利益 职业犯罪分子 电磁泄露 拒绝服务 恐怖事…...
day30(8/16)——ansible
目录 一、回顾 1、mysql和python 1. mysql5.7 2. 可以使用pymysql非交互的管理mysql 2、mycat中间件 1. 独属于mysql主从的负载均衡策略 2.配置写主读从 3. 步骤 3.1 安装jdk 3.2 mycat 3.3 配置 3.4 启动和调试 二、运维自动化(ansible) 1、任务背…...
fastadmin 安装
环境要求,大家可以参考官方文档的,我这里使用的是phpstudy,很多已经集成了。 注意一点,PHP 版本:PHP 7.4 。 第二步:下载 下载地址:https://www.fastadmin.net/download.html 进入下载地址后…...
Unity动画模块 之 3D模型导入基础设置 Rig页签
本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.Rig页签 Rig 选项卡 - Unity 手册,rig是设置骨骼与替身系统的,工作流程如下 Avatar是什么…...
⭐️Python在Windows命令行(Command Prompt)运行Python脚本或交互式地执行Python代码详解
Python在Windows命令行(Command Prompt)运行Python脚本或交互式地执行Python代码详解 Python在Windows命令行(Command Prompt)运行Python脚本或交互式地执行Python代码详解一、安装Python二、运行Python脚本1. 打开命令行2. 导航到…...
Python | Leetcode Python题解之第355题设计推特
题目: 题解: class Twitter:class Node:def __init__(self):self.followee set()self.tweet list()def __init__(self):self.time 0self.recentMax 10self.tweetTime dict()self.user dict()def postTweet(self, userId: int, tweetId: int) ->…...
D. Beard Graph
https://codeforces.com/problemset/problem/165/D 主要是边转点 后面都是简单的线段树维护 我们维护ok标记,val值,黑(1),白(0) id.okl.ok&r.ok id.vall.valr.val 注意特判如果两个点一样是0,如果dfn[u]1>dfn[v]就不…...
使用预训练的 ONNX 格式的 YOLOv8n 模型进行目标检测,并在图像上绘制检测结果
目录 __init__方法: pre_process方法: run方法: filter_boxes方法: view_img方法: __init__方法: 初始化类的实例时,创建一个onnxruntime的推理会话,加载名为yolo…...
mac安装xmind
文章目录 介绍软件功能下载安装1.下载完成后打开downloads 双击进行安装2.将软件拖到应用程序中3.在启动台中搜索打开4.提示损坏问题解决5.执行完成关闭命令窗口6.打开成功,点击继续,跳过登录7.打开成功后,点击关于 小结 介绍 XMind 是一款流…...
MySQL分区表入门
MySQL数据库的分区表是一种将表数据分成逻辑上相关的部分并存储在不同的物理位置的技术。使用分区表可以提高查询性能、简化数据维护和提供更好的数据管理。 以下是MySQL中创建和使用分区表的一般步骤: 设计分区策略: 首先,需要确定如何将表…...
StarRocks 存算分离数据回收原理
前言 StarRocks存算分离表中,垃圾回收是为了删除那些无用的历史版本数据,从而节约存储空间。考虑到对象存储按照存储容量收费,因此,节约存储空间对于降本增效尤为必要。 在系统运行过程中,有以下几种情况可能会需要删…...
【运维】Linux中的xargs指令如何使用?
xargs 是 Linux 中一个非常强大的命令,用于将标准输入中的输出作为参数传递给其他命令。通常情况下,xargs 用于处理长列表或者将多行输入转换成一行。 以下是 xargs 的基本用法和一些常见的例子: 基本语法 command | xargs [options] [command]常见的例子 删除文件:假设…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
