数据结构知识点总结-线性表(1)-线性表的定义、基本操作、顺序表表示

线性表

定义

        线性表是具有相同数据类型的N(N>=0)个元素的有限序列,其中N为表长,当N=0时线性表是一张空表。

        线性表的逻辑特征:每个非空的线性表都有一个表头元素和表尾元素,中间的每个元素有且仅有一个直接前驱,有且仅有一个直接后继。

        线性表是一种逻辑结构,表示元素之间一对一相邻的关系。顺序表(数组)和链表是指存储结构,两者属于不同的层面。

线性表的基本操作

        基本操作的实现取决于采用哪种存储结构,存储结构不同,算法实现也不同,比如底层采用数据实现和链表实现,对应的代码不一样,但在上层实现算法逻辑时不关心底层具体实现,上述方法名可以直接作为伪代码使用。

线性表的顺序表示

(1)顺序表定义

# define MaxSize 50  // 定义线性表的最大长度typedef int ElemType;typedef struct{ElemType  data[MaxSize] ;    // 顺序表的元素int   length ;                  // 顺序表的当前长度} SqList;                            // 别名

        线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

        顺序表可以是静态分配的数组,也可以是动态分配的数组。如果采用动态分配,就是在使用时按照实际大小申请空间。

#define InitSize 100typedef struct {ElemType   *data ;        // 指示动态分配数组的指针int  MaxSize , length ;  // 数组的最大容量和当前个数}SeqList;                      // 动态分配数组顺序表的类型定义C语言初始化:L.data = (ElemType *) malloc (sizeof(ElemType) * InitSize);C++初始化:  L.data = new ElemType[InitSize] ;

注意:动态分配并不是链式存储,同样还是属于顺序存储结构,其物理结构没有变化,依然是随机存取方式,只是分配的空间大小可以在运行时决定。

(2)顺序表的特点

顺序表最主要的特点是:随机访问,即通过首地址和元素序号可以在O(1)时间内找到指定的元素

顺序表的存储密度高,每个结点只存储数据元素,相对于链表来说没有指针域。

顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动元素。

顺序表基本操作

有效性校验、边界检查:

如下面代码的“判断 i 的范围是否有效”。在函数体前面,主代码运行之前,对数据的有效性进行检查,比如是否为空、是否越界等。体现代码的健壮性,完整性,在考试时如果能多这一步并加上注释,是加分项。

1)顺序表的插入代码实现

// 本算法实现将元素 e 插入到顺序表 L 中第 i 个位置
bool  ListInsert( SqList   &L  , int i , ElemType e){if ( i < 1 || i > L.length +1 ){ //  判断 i 的范围是否有效return  false; }if ( L.length >= MaxSize ){       // 当前存储空间已满,不能插入return  false;}//有效性检查for( int j = L.length ; j >= i : j--){      //将 第 i 个元素及之后的元素后移L.data[ j ] = L.data[ j-1 ] ;}L.data[ i -1 ] = e;  // 在位置 i 处放入 eL.length++;           // 线性表的长度 加 1return true;
}

插入算法的平均时间复杂度为O(N)

最好情况:在表尾插入(即 i = n + 1 ),元素移动语句将不执行,时间复杂度为 O(1) 。

最坏情况:在表头插入(即 i = 1 ),元素移动语句将执行 n 次,时间复杂度为 O( n ) 。

(2)顺序表的删除操作代码

// 本算法实现删除顺序表 L 中第 i 个位置的元素
bool  ListDelete( SqList  &L , int i , int  &e ) {if( i < 1 || i > L.length ){                     // 判断 i 的范围是否有效return false ;}e = L.data[ i -1 ] ;                             // 将被删除的元素赋值给 efor( int j = i ; j < L.length ; j++ ){           // 将第 i 个位置之后的元素前移L.data[ j -1 ] = L.data[ j ]}L.length--;                                      // 线性表的长度减 1return true;
}

最好情况:删除表尾元素(即 i = n),无须移动元素,时间复杂度为 O(1)。

最坏情况:删除表头元素(即 i = 1),需要移动一个元素外的所有元素,时间复杂度为 O(n) 。

同理删除操作的平均时间复杂度也是O(N)

(3)按值查找,返回位序。

//本算法实现查找顺序表中值为 e 的元素,如果查找成功,返回元素位序,否则返回 0
int  LocateElem( SqList  L  , ElemType e){
int i ;
for( i = 0 ; i < L.length ; i++){if( L.data[ i ] == e){return  i +1 ;     // 下标为 i 的元素值等于 e ,返回其位序 i + 1}return  0;               //退出循环,说明查找失败
}

最好情况:查找的元素就在表头,仅需比较一次,时间复杂度为 O(1) 。

最坏情况:查找的元素在表尾(或不存在)时,需要比较 n 次,时间复杂度为 O(n)。

因此,线性表按值查找算法的平均时间复杂度为 O(n) 。

(4)按下标查找、随机访问。

给定下标之后(或给定取第几个元素)可以直接通过下标访问l.data[i],l.data[i-1];因此随机访问的时间复杂度为O(1)。

下一篇文章介绍顺序表的链式表示

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

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

相关文章

有趣的CSS - 弹跳的圆

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用css写一个好玩的不停弹跳变形的圆。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页…

亿道丨三防平板电脑厂家丨三防平板PDA丨三防工业平板:数字时代

在当今数字化时代&#xff0c;我们身边的世界变得越来越依赖于智能设备和无线连接。其中&#xff0c;三防平板PDA&#xff08;Personal Digital Assistant&#xff09;作为一种功能强大且耐用的数字工具&#xff0c;正在引领我们进入数字世界的全新征程。 三防平板PDA结合了平板…

LeetCode 0235.二叉搜索树的最近公共祖先:用搜索树性质(不遍历全部节点)

【LetMeFly】235.二叉搜索树的最近公共祖先&#xff1a;用搜索树性质&#xff08;不遍历全部节点&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/ 给定一个二叉搜索树, 找到该树中两个指定节点的最近公…

2024全国水科技大会暨减污降碳协同增效创新与实践论坛(八)

召集人&#xff1a;王洪臣 中国人民大学环境学院教授 姚 宏 北京交通大学教授 为大会征集“绿色低碳污水厂案例”&#xff0c;欢迎各相关单位积极报名&#xff01; 一、会议背景 生态环境部、国家发展和改革委员会等七部门印发《减 污降碳协同增效实施方案》中明确提出推进水…

【C++】C++对C语言的关系,拓展及命名空间的使用

文章目录 &#x1f4dd;C简述C融合了3种不同的编程方式&#xff1a;C和C语言关系是啥呢&#xff1f;C标准 &#x1f320;C应用&#x1f320;C语言优点第一个C程序 &#x1f320;命名空间&#x1f320;命名空间的使用命名空间的定义 &#x1f320;怎么使用命名空间中的内容呢&am…

测试C#使用ViewFaceCore实现图片中的人脸遮挡

基于ViewFaceCore和DlibDotNet都能实现人脸识别&#xff0c;准备做个遮挡图片中人脸的程序&#xff0c;由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系&#xff0c;最终决定使用ViewFaceCore实现图片中的人脸遮挡。   新建Winform项目&#xff0c;在Nuget包管理器中…

【深度学习】微调ChatGlm3-6b

1.前言 指令微调ChatGlm3-6b。微调教程在github地址中给出&#xff0c;微调环境是Qwen提供的docker镜像为环境。 镜像获取方式&#xff1a;docker pull qwenllm/qwen:cu117 github地址&#xff1a;https://github.com/liucongg/ChatGLM-Finetuning 2.微调过程 github地址中的教…

Excel工作表控件实现滚动按钮效果

实例需求&#xff1a;工作表中有多个Button控件&#xff08;工作表Form控件&#xff09;和一个ScrollBar控件&#xff08;工作表ActiveX控件&#xff0c;名称为ScrollBar2&#xff09;&#xff0c;需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果&#xff0c;实际…

2024.2.25 在centos8.0安装docker

2024.2.25 在centos8.0安装docker 安装过程比较简单&#xff0c;按顺序安装即可&#xff0c;简要步骤&#xff1a; 一、更新已安装的软件包&#xff1a; sudo yum update二、安装所需的软件包&#xff0c;允许 yum 通过 HTTPS 使用存储库&#xff1a; sudo yum install -y …

飞天使-k8s知识点22-kubernetes实操7-ingress

文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;它管理外部访问集群内部服务的规则。你可以将其视为一个入口&#xff0c;它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…

静态时序分析:SDC约束命令set_load详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_load命令用于指定端口(port)或线网(net)的负载电容&#xff0c;该指令的BNF范式&#xff08;有关BNF范式&#xff0c;可以参考以往文章&#xff09;为&#…

Java核心-核心类与API(4)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;最后介绍一下Object类以及与数学、日期/时间有关的类&#xff0c;就结束该部分的学习了&#xff0c;其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类…

linux-并发通信

一.linux-tcp通信框架 1.基础框架 1.1 tcp 服务器框架 1.套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol);
 返回的文件描述符可以指向当前的socket&#xff0c;后续通过对文件描述符的访问就可以配置这个socket 成功时返回文件…

nccl2安装指南

https://developer.nvidia.com/nccl/nccl-download 旧版本安装: https://developer.nvidia.com/nccl/nccl-legacy-downloads 找到你对应的CUDA版本 我这里选择 deb 文件安装了 sudo dpkg -i nccl-local-repo-ubuntu2004-2.16.5-cuda11.8_1.0-1_amd64.debsudo cp /var/nccl-lo…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

政安晨:【机器学习基础】(二)—— 评估机器学习模型改进

根据前面我的文章看来&#xff0c;咱们只能控制可以观察到的东西。因为您的目标是开发出能够成功泛化到新数据的模型&#xff0c;所以能够可靠地衡量模型泛化能力是至关重要的&#xff0c;咱们这篇文章将正式介绍评估机器学习模型的各种方法。 政安晨的个人主页&#xff1a;政安…

Hikvision SPON IP网络对讲广播系统命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1.漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视&a…

低功耗设计——门控时钟

1. 前言 芯片功耗组成中&#xff0c;有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟buffer&#xff0c;而且为了最小化时钟延时&#xff0c;它们通常具有很高的驱动强度。此外&…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…

力扣--动态规划1027.最长等差数列

思路分析&#xff1a; 使用动态规划的思想&#xff0c;定义二维数组dp&#xff0c;其中dp[i][j]表示以nums[i]为结尾&#xff0c;公差为(j-1000)的等差数列长度。为了适应负数的情况&#xff0c;将公差的范围设为[-1000, 1000]&#xff0c;并且加上1000作为数组索引。 初始化r…