2.2线性表的顺序表

2.2.1线性表的顺序表示和实现------顺序映像

【顺序存储】在【查找时】的时间复杂度为【O(1)】,因为它的地址是连续的,只要知道首元素的地址,根据下标可以很快找到指定位置的元素
【插入和删除】操作由于可能要在插入前或删除后对元素进行移动,所以顺序存储的时间复杂度为【O(n)】。

1)初始化操作
思想:构造一个空表
设置表起始位置、表长及可用空间

#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef struct
{
ElemType *elem;   //定义个地址变量,使其后面能指向线性表占用的数组空间
int length;  // 线性表的长度
int listsize;  // 当前分配的存储容量
}SqList;//初始化操作
Status InitList_Sq(SqList &L)  //初始化
{ //构造一个空表
L.elem=(ElemType)malloc(LIST_INIT_SIZE*size of(ElemType));
if(!L.elem)  exit(OVERFLOW);  //存储分配失败
L.length=0;   //空表长度为0
L.listsize=LIST_INIT_SIZE;  //初始存储容量
return OK;}

2.2.3顺序表的插入

2)顺序插入操作

目的:在线性表L第i个元素前插入一个元素e

【基本思想
1)判断i是否在允许范围
2)存储空间是否已满
3)将第i个元素和后面的所有元素向后移动
4)新元素写在空出的第i个位置
5)线性表长度加1

【注意】
长度为n的顺序表第i个位置插入移动n-i+1个元素


Status ListInsert_Sq(SqList&L,int i,ElemType e){if(i<1||i>1.lenth+1)
return ERROR;   //插入位置不合法if(L.length>=L.listsize)
{}     //判断空间足够q=&(L.elem[i-1]);   //q指向插入位置for(p=&(L.elem[L.elem-1]);p>-q;--q)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}

2.2.4顺序表的删除和插入

【基本思路
1)判断i是否在允许范围
2)将线性表的第i个元素给e
3)将第i个元素和后面的所有元素向前移动一个位置
4)线性表长度减1


Status ListDelete_Sq(SqList&L,int i,ElemType e){//删除第i个元素并用e返回值if(i<1||i>1.lenth+1)
return ERROR;   //删除位置不合法p=&(L.elem[i-1]);   //q指向插入位置
e=*p;
q=L.elem+L.length-1; //表尾元素位置
for(++p;p<=q;++p)
*(p-1)=*p;    //p-1指向p--L.length;
return OK;
}

【图】:平均移动次数

【查找操作】11:42

int LocateElem_Sq(SqList,ElseType e)
{
//查询第一个 满足条件的元素,若存在,返回位序,否则返回0;
int i;
i=1;
while (i<=L.length&&L.elem[i-1]!=e)
++i;
if(i<=L.length)
return i;
else return 0;
}// locateElem_Sqi<=L.length&&L.elem[i-1]!=e
i>L.length

【顺序结构优缺点14:15
【优点:
逻辑相邻,物理相邻
可随机存取一元素
存储空间使用紧凑
【缺点:
插入,删除需要移动大量元素
预先分配空间需按最大空间分配,利用不充分表难以扩充

【】线性表的合并问题
【图:例1】
基本思路:
1)初始化Lc为空表
2)分别从La和Lb取得当前元素ai和bi
3)若ai<bj,则将ai插入到Lc中,否则
bj插入到Lc中

代码:


Viod MergeList(SqList La,SqList lb,SqList &Lc)
{
Pa=La,elem;
Pb=Lb.elem;
Lc.listsize=Lc.length=La,elem+Lb.elem;
Pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem)
exit(overflow);
Pa_last=La.elem+La.length-1;
Pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<=*pb)
*pc++=*pa++;
else
*pa++=*pb++;
}
while(pa<=pa_last)
*pa++=*pa++;
while (pb<=pb_last)
*pc++=*pb++;
}

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

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

相关文章

TVM:交叉编译和RPC

TVM&#xff1a;交叉编译和RPC 之前我们介绍了 TVM 的安装、本机demo和树莓派远程demo。本文将介绍了在 TVM 中使用 RPC 进行交叉编译和远程设备执行。 通过交叉编译和 RPC&#xff0c;我们可以在本地机器上编译程序&#xff0c;然后在远程设备上运行它。 当远程设备资源有限…

2.3单链表的基本使用及其cpp示例

2.3线性表的链式表现与实现 2.3.1.1单链表 【特点&#xff1a; *用一组任意的存储单元存储线性表的数据元素 *利用指针实现用不同相邻的存储单元存放逻辑上相邻的元素 *每个元素ai&#xff0c;除存储本身信息外&#xff0c;还存储其直接后继的元素&#xff08;后一个元素的地址…

TVM:简介

TVM&#xff1a;简介概述 Apache TVM 是一个用于 CPU、GPU 和机器学习加速器的开源机器学习编译器框架。它旨在使机器学习工程师能够在任何硬件后端上高效地优化和运行计算。本教程的目的是通过定义和演示关键概念&#xff0c;引导您了解 TVM 的所有主要功能。新用户应该能够从…

2.3.3单链表的双向链表

2.3.3双向链表 插入、删除 指在前驱和后驱方向都能游历&#xff08;遍历&#xff09;的线性链表 双向链表的每个结点有两个指针域 【结构】&#xff1a;prior data next 双链表通常采用带头结点的循环链表形式 可理解为首位相接的数据“圈”&#xff0c;每个结点都可以向前…

nvidia-smi 命令详解

nvidia-smi 命令详解 简介 nvidia-smi - NVIDIA System Management Interface program nvidia smi&#xff08;也称为NVSMI&#xff09;为来自 Fermi 和更高体系结构系列的 nvidia Tesla、Quadro、GRID 和 GeForce 设备提供监控和管理功能。GeForce Titan系列设备支持大多数…

2.4一元多项式的表示及相加,含cpp算法

2.4一元多项式的表示及相加 n阶多项式的表示&#xff1a; n阶多项式有n1项 指数按升幂排序 【 优点&#xff1a; 多项式的项数可以动态增长&#xff0c;不存在存储溢出的问题插入&#xff0c;删除方便&#xff0c;不移动元素 【表示&#xff1a; 有两个数据域&#xff0c;一…

TVM:使用Tensor Expression (TE)来处理算子

TVM&#xff1a;使用Tensor Expression (TE)来处理算子 在本教程中&#xff0c;我们将聚焦于在 TVM 中使用张量表达式&#xff08;TE&#xff09;来定义张量计算和实现循环优化。TE用纯函数语言描述张量计算&#xff08;即每个表达式都没有副作用&#xff09;。当在 TVM 的整体…

4-数据结构-串的学习

4.1串类型的定义 1.串&#xff1a;&#xff08;或字符串&#xff09; 串是由多个字符组成的有限序列&#xff0c;记作&#xff1a;S‘c1c2c3…cn’ (n>0) 其中S是串的名字&#xff0c;‘c1c2c3…cn’ 是串值 ci是串中字符 n是串的长度&#xff0c;表示字符的数目 空串&a…

Linux下rm误删恢复 extundelete

Linux下rm误删恢复 extundelete 误删之后要第一时间卸载&#xff08;umount&#xff09;该分区&#xff0c;或者以只读的方式来挂载&#xff08;mount&#xff09;该分区&#xff0c;否则覆写了谁也没办法恢复。如果误删除的是根分区&#xff0c;最好直接断电&#xff0c;进入…

5-数据结构-数组的学习

5.1数组的定义 定义&#xff1a; 由一组类型相同的数据元素构成的有序集合&#xff0c;每个数据元素称为一个数据元素&#xff08;简称元素&#xff09;&#xff0c;每个元素受n&#xff08;n>1&#xff09;个线性关系的约束&#xff0c;每个元素在n个线性关系中的序号i1、…

timm 视觉库中的 create_model 函数详解

timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷&#xff0c;在他们开源的代码中&#xff0c;大部分都用到了这样一个库&#xff1a;timm。各位炼丹师应该已经想必已经对其无比熟悉了&#xff0c;本文将介绍其中最关键的函数之…

C--数据结构--树的学习

6.2.1二叉树的性质 1.二叉树 性质&#xff1a; 1.若二叉树的层次从1开始&#xff0c;则在二叉树的第i层最多有2^(i-1)个结点 2.深度为k的二叉树最多有2^k -1个结点 &#xff08;k>1&#xff09; 3.对任何一颗二叉树&#xff0c;如果其叶结点个数为n0,度为2的非叶结点个数…

TVM:使用 Schedule 模板和 AutoTVM 来优化算子

TVM&#xff1a;使用 Schedule 模板和 AutoTVM 来优化算子 在本文中&#xff0c;我们将介绍如何使用 TVM 张量表达式&#xff08;Tensor Expression&#xff0c;TE&#xff09;语言编写 Schedule 模板&#xff0c;AutoTVM 可以搜索通过这些模板找到最佳 Schedule。这个过程称为…

TVM:使用 Auto-scheduling 来优化算子

TVM&#xff1a;使用 Auto-scheduling 来优化算子 在本教程中&#xff0c;我们将展示 TVM 的 Auto-scheduling 功能如何在无需编写自定义模板的情况下找到最佳 schedule。 与基于模板的 AutoTVM 依赖手动模板定义搜索空间不同&#xff0c;auto-scheduler 不需要任何模板。 用…

C语言—sort函数比较大小的快捷使用--algorithm头文件下

sort函数 一般情况下要将一组数从的大到小排序或从小到大排序&#xff0c;要定义一个新的函数排序。 而我们也可以直接使用在函数下的sort函数&#xff0c;只需加上头文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

散列的使用

散列 散列简单来说&#xff1a;给N个正整数和M个负整数&#xff0c;问这M个数中的每个数是否在N中出现过。 比如&#xff1a;N&#xff1a;{1,2,3,4}&#xff0c;M{2,5,7}&#xff0c;其中M的2在N中出现过 对这个问题最直观的思路是&#xff1a;对M中每个欲查的值x&#xff0…

关于C++中的unordered_map和unordered_set不能直接以pair作为键名的问题

关于C中的unordered_map和unordered_set不能直接以pair作为键名的问题 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于红黑树实现的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希实现的&#xff0c;在不要求容器内的键有序&#xff0c…

AI编译器与传统编译器的联系与区别

AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么&#xff1f;。 文中提到的答主的知乎主页&#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码&#xff0…

python学习1:注释\变量类型\转换函数\转义字符\运算符

python基础学习 与大多数语言不同&#xff0c;python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号 {} 。缩进的空格数是可变的&#xff0c;但是同一个代码块的语句必须包含相同的缩进空格数。 &#xff08;一个tab4个空格&#xff09; Python语言中常见的…

Python、C++ lambda 表达式

Python、C lambda 表达式 lambda函数简介 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函…