当前位置: 首页 > news >正文

数据结构(3)— 线性表之顺序存储详解介绍(含代码)

(1)博客代码在数据结构代码---GitHub仓库;

线性表介绍

线性表的基础概念

(1)甲骨文表示:线性表是零个或多个数据元素的有限序列
(2)线性表,顾名思义,就是说这个数据存储是线性的。而线性的东西具有什么特征呢?
<1>数据是一对一的排列的,中间的数据都有且仅有一个前面数据前面的数据叫做前驱和一个后面的数据后面的数据叫做后继。而数据表的最前面的数据叫做表头,最尾端的数据叫做表尾表头无前驱,表尾无后继
<2>线性表是有限的。因为计算机的存储空间是有限的,所以线性表必然有限。
<3>线性表中的元素必须是相同类型。这个就像是我们在定义数组,一个数组中的元素,要么都是int型数据,要么都是char型数据,不可能数组中,第一个元素是int型数据,第二个元素变成了char型数据了。
(3)线性表的元素个数n(n>=0)表示线性表的长度,当n=0时,我们将这个表称之为空表
(4)在非空表中,每个数据元素都有一个确定的位置,比如a1就是第一个数据元素,a2就是第二个数据元素,ai就是第i个数据元素。所以我们将i称为数据元素的位序

一个数据元素可以拥有多个数据项

(1)我们上面看到,一个数据元素只有一个数据项。在数据结构(1)前言中我说了,一个数据元素可以有多个数据项,在研究数据结构时,我们都是着眼于数据元素。那有没有一个数据元素拥有多个数据项的线性表呢?有,我们常见的就是花名册。
(2)我们看到如下花名册里面,有姓名,性别,文化程度等等一些元素。这些元素就是数据项。而人具有这些元素,所以人这个个体就是数据元素。我们将这些人进行按照顺序排列,最后形成了花名册,这也叫做线性表。

线性表种类

(1)常见的线性表有:顺序存储(说白了就是数组),是链式存储,栈,队列。
(2)链式存储中又分为四种,单链表静态链表循环链表双向链表

线性表顺序存储介绍

顺序存储定义

定义

(1)定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
(2)将上面这段话用白话文来说就是,线性表的顺序存储就是一个数组,不过与数组有些许不同,数据结构中的顺序存储定义需要增加一个length用于显示线性表的当前长度。
(3)这个时候可能会有人有疑惑了。为什么需要一个length呢?假设我们在排队买东西,由于空间的限制,只能来20个人(MAXSIZE)。而这个时候,排队的有5个人,如果有第6个人也要来排队,因为人很聪明,知道排到第五个人后面就可以了,但是在写程序的时候,你怎么知道需要将新来的数据放在哪里呢?如果不小心放在了第4个空间中,那么数据会被覆盖,出问题。放在第7位,那么第6位空着,浪费空间。
(4)线性表的顺序存储就是一个排队的过程,MAXSIZE用于定义这个队伍最大多长,而length用于指示当前位置排到哪里了。如果中间一个人突然走了,从这个人开始的后面所有人都要往前面移动,同时length要马上自减一次。如果有一个人因为紧急事件,不得不插队,从插队的位置往后移动,所有人都需要往后移动,length需要马上自增一次。
(5)因为按照编程习惯,我们的数组首元素下标为0。所以当线性表为空的时候,last为-1,而last=1时候,线性表长度=last+1=1!!!
#define success 0
#define fail  -1
#define MAXSIZE 20          /* 存储空间初始分配量 */typedef int ElemType;       /* ElemType类型根据实际情况而定,这里假设为int */typedef struct
{ElemType data[MAXSIZE]; /* 数组,存储数据元素 */int last;             /* 线性表当前位置,last+1=length */
}SqList,*SqLink;     /*SqList是定义线性表,SqLink是定义线性表的结构体指针*/

顺序存储方式和地址计算

其实如果学了C语言数组了,这部分没有什么可以说的。就是跟数组那样存储,是连续的。不清楚的自行去重新学习数组的知识。

数组长度与线性表长度区别

(1)我们上面说了,MAXSIZE是数组长度,这个规定了能够放进来多少数据,他的值是固定的。而length是线性表长度,他的长度是会随着线性表的删除,插入等操作发生改变,是动态的。任意时刻length<=MAXSIZE。
(2)至于为什么数组不改成动态分配,是因为这会带来性能上的消耗。我查了一些资料,以及问了bingAI,剥去关于没有及时释放不用的内存以外,更多的是malloc和free会造成资源消耗。

顺序存储实操

这里需要说的是,如果是操作成功了,返回0,操作失败返回-1。
#define success 0
#define fail  -1
#define MAXSIZE 20          /* 存储空间初始分配量 */typedef int ElemType;       /* ElemType类型根据实际情况而定,这里假设为int */typedef struct
{ElemType data[MAXSIZE]; /* 数组,存储数据元素 */int last;             /* 线性表当前位置,last+1=length */
}SqList,*SqLink;     /*SqList是定义线性表,SqLink是定义线性表的结构体指针*/

创建顺序存储线性表

(1)我们先申请一个结构体指针,然后分配一个空间过来,如果没有分配成功,将会打印提示。
(2)如果创建成功之后,因为刚刚申请的空间中存放的值是未知的。所以按照习惯,我们一般都会将其设置为0。
(3)注意:memset函数必须写在 L -> length = -1; 前面,因为memset这一步,会将 L -> length 变成0。因为按照数组下标的习惯,0表示首元素地址,所以当线性表为空的时候,length==-1。(可能在部分教材里面length=0表示线性表为空,所以下面关于length部分代码会有所差异,需要注意)
/*作用:   创建线性表*传入参数:无*返回参数:创建失败打印错误报告,创建成功返回创建线性表的结构体指针*/
SqLink list_create(void)
{//建立线性表SqLink L;L = (SqLink)malloc(sizeof(SqList));//确认线性表是否存在if(L == NULL){printf("list malloc failed!\n");return L;}//线性表存在,将其内容清空//注意,这两句别写反了,否则last会变成0。memset(L , 0 , sizeof(SqList));L -> last = -1;  //last表示线性表的指向位置,因为在C语言中,下标是从0开始,所以当为空表是last=-1//返回线性表return L;
}

判断线性表是否存在

判断线性表是否存在,我们可以检测他指向的地址是否有问题。
/*作用:   判断线性表是否存在*传入参数:*    @L: 线性表的结构体指针*返回参数:线性表不存在返回fail,线性表存在返回success*/
int list_if_exist(SqLink L)
{if(L==NULL){printf("list is not exist!\n");return fail;}return success;
}

删除线性表

(1)如果线性表为NULL,表示传入线性表不存在,打印提示。
(2)如果线性表存在,将释放内存,同时将指针指向NULL。
/*作用:   删除线性表*传入参数:*    @L: 线性表的结构体指针*返回参数:线性表不存在返回fail,线性表成功删除返回success*/
int list_delete(SqLink L)
{if(L==NULL){printf("list is not exist!\n");return fail;}free(L);L=NULL;return success;
}

清空线性表

解析看创建顺序存储线性表。
/*作用:   清空线性表*传入参数:*    @L: 线性表的结构体指针*返回参数:成功返回succes,失败返回fail*/
int list_clear(SqLink L)
{//确认线性表是否存在if(L == NULL){printf("list is not exist!\n");return fail;}//线性表存在,将其内容清空//注意,这两句别写反了,否则last会变成0。memset(L , 0 , sizeof(SqList));L -> last = -1;  //last表示线性表的指向位置,因为在C语言中,下标是从0开始,所以当为空表是last=-1return success;
}

判断线性表是否为空

(1)先判断线性表是否存在
(2)我们只需要判断length即可。如果对于length是什么依旧不清楚的,看下图。
/*作用:   判读线性表是否为空(因为使用者并不知道函数实现具体细节,所以需要加上这个)*传入参数:*    @L: 线性表的结构体指针*返回参数:线性表为空返回succes,否则返回fail*/
int list_if_empty(SqLink L)
{//确认线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}if(L -> last ==-1){printf("list is empty!\n");return success;}return fail;
}

获取当前线性表长度

获取线性表长度就看length+1即可。
/*作用:   查看当前线性表长度*传入参数:*    @L: 线性表的结构体指针*返回参数:返回当前线性表的长度*/
int list_get_length(SqLink L)
{//确认线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}return (L->last+1);
}

判断指定数值是否在线性表中

(1)先判断线性表是否存在
(2)我们只需要将线性表中的值一个一个的与value对比即可。
/*作用:   判断value是否在线性表中*传入参数:*  @L:线性表的结构体指针*  @value:需要查看线性表中是否存在的值*        @可输入值范围受到ElemType决定*返回参数:value在线性表中存在返回succes,value不在线性表中或线性表不存在返回fail*/
int list_value_if_locate(SqLink L,ElemType value)
{int i;//确认线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}//逐个判断线性表中的值for(i = 0;i<=L->last;i++){if(L->data[i]==value){return success;}}return fail;
}

在线性表指定位置插入数据

(1)判断线性表是否存在
(2)先判断线性表是否已经满了
(3)判断插入位置是否合理
(4)将要插入的位置元素都向后移动,腾出空间,让新数据插入
(5)插入新数据,last自增
/*作用:   插入数据,在线性表L的pos处插入数据value*传入参数:*  @L: 线性表的结构体指针*  @value: 需要插入线性表的值*        @可输入值范围受到ElemType决定*  @pos:需要插入的位置*        @插入位置范围受到MAXSIZE限制*返回参数:返回当前线性表的长度*/
int list_insert(SqLink L,ElemType value,int pos)
{int i; //确认线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}//如果线性表满了if(L->last == MAXSIZE-1){printf("list is full\n");return fail;}//判断插入的位置是否合法if(pos<0 || pos > L->last+1){printf("pos is invaild\n");}//向后移动for(i = L -> last;i >= pos;i--){L->data[i+1]=L->data[i];}//更新last和插入部分数值L->data[pos]=value;L->last++;return success;
}

删除指定位置元素

(1)检查线性表是否存在
(2)是否为空表
(4)删除位置是否合理
(5)将所有数据向前移动(此时原来pos位置的数据会被pos+1处覆盖)
(6)last自减
/*作用:   删除指定位置的元素*传入参数:*  @L: 线性表的结构体指针*  @pos: 需要删除的数据的位置*        @插入位置范围受到MAXSIZE限制*返回参数:删除失败返回fail,成功删除返回success*/
int list_delete_pos_value(SqLink L,int pos)
{int i;//确认线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}//检测是否为空表if(L->last==-1){printf("list is empty!\n");return fail;}//检测删除位置是否合理if(pos < 0 || pos > L->last){printf("pos is invalid!\n");return fail;}//向前移动for(i=pos+1;i<=L->last;i++){L->data[i-1]=L->data[i];}//更改lastL->last--;return success;
}

获取两个线性表的并集

(1)判断三个线性表是否存在
(2)判断他们是否为空
(3)先将L1的值存入L3中
(4)然后将L2中拥有,但是L1中没有的值存入L3中
/*作用: L1和L2并集,将并集值给到L3*传入参数:*  @L1,L2: 两个不同的线性表*  @L3: L1和L2并集*返回参数:失败返回fail,成功返回success*/
int list_merge(SqLink L1,SqLink L2,SqLink L3)
{int i;//判断L1,L2,L3是否存在list_if_exist(L1);list_if_exist(L2);list_if_exist(L3);//判断L1,L2,是否为空list_if_empty(L1);list_if_empty(L2);//将L1中的所有元素存放到L3中for(i = 0; i <= L1->last;i++){list_insert(L3, L1->data[i],L3->last+1);}for(i = 0; i <= L2->last;i++){//判读L2中的每一个元素是否在L1中,如果不在,就存入到L3中if(list_value_if_locate(L1,L2->data[i])==-1){//如果L3满了,提前结束if(list_insert(L3,L2->data[i],L3->last+1)==fail){return fail;}}}return success;
}

删除线性表中重复元素

(1)判断线性表是否存在
(2)如果只有一个元素就不需要判断
(3)我们选择从第二个元素开始(建立变量i),判断i位置的元素是否与i前面元素有重复,如果重复了,那么就删除i位置的元素。此时可以跳出循环。
(4)因为删除位置i的元素之后,原来位置i+1的元素会替补到位置i处。所以我们需要先将位置i自减一次,然后在for语句中自增一次,为了保持位置i不变,所以我们需要i自减一次抵消。
(5)如果没有重复元素,那么i就自增。

/*作用:删除线性表中重复元素*传入参数:*    @L1 : 线性表的结构体指针*返回参数:删除成功返回success*/
int list_purge(SqLink L)
{int i,j;//确认线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}//如果当前线性表只有一个元素,就没有必要判断了if(L->last==0){return success;}//让i不断向后移动for(i=1;i<=L->last;i++){//将位置i之前的元素与i处元素进行判断,相同就删除for(j=i-1;j>=0;j--){//如果发现前面有与位置i相同的元素,删除,保持i不动if(L->data[i]==L->data[j]){//位置i与前面有重复,就删除位置i的值list_delete_pos_value(L,i);//因为需要保持位置i不动,而for语句中有i++,所以这里用i--抵消i--;break;}}}return success;
}

获取指定位置元素

(1)判断线性表是否存在
(2)判断是否为空表
(3)判断获取数据的位置是否合理
(4)返回指定位置值
/*作用: 返回指定位置的值*传入参数:*  @L: 线性表的结构体指针*  @pos:指定位置*        @插入位置范围受到MAXSIZE限制*返回参数:线性表为空,返回fail。成功打印返回success*/
int list_pos_value(SqLink L,int pos)
{//判断线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}//判断是否为空表if(L->last==-1){printf("list is empty!\n");}//判断获取数据的位置是否合法if(pos<0 || pos > L->last+1){printf("pos is invaild\n");}//返回指定位置值return (L->data[pos]);
}

显示线性表中的值

(1)线性表是否存在
(2)是否为空表
(3)逐个打印线性表中的元素
/*作用: 显示线性表中的值*传入参数:*    @L: 线性表的结构体指针*返回参数:线性表为空,返回fail。成功打印返回success*/
int list_show(SqLink L)
{int i;//判断线性表是否存在if(L==NULL){printf("list is not exist!\n");return fail;}//判断是否为空表if(L->last==-1){printf("list is empty!\n");}//将线性表中的值打印出来for(i=0;i<=L->last;i++){printf("%d ",L->data[i]);}printf("\n");return success;
}

线性表顺序结构优缺点

优点

(1)存储密度高
(2)查找线性表中元素也方便

缺点

(1)需要提供一大片较大的连续存储空间。
(2)插入,删除等运算耗时,存在元素在存储空间成片移动的现象

总结

如果我们需要插入删除操作比较多,比如游戏开发中的装备经常会更换,这个用线性存储就非常不合适,链式存储就比较好。但是如果我们需要频繁查找元素,比如查找游戏ID,查看用户性别等等用顺序存储就很方便。

相关文章:

数据结构(3)— 线性表之顺序存储详解介绍(含代码)

&#xff08;1&#xff09;博客代码在数据结构代码---GitHub仓库&#xff1b;线性表介绍线性表的基础概念&#xff08;1&#xff09;甲骨文表示&#xff1a;线性表是零个或多个数据元素的有限序列。&#xff08;2&#xff09;线性表&#xff0c;顾名思义&#xff0c;就是说这个…...

ChatGPT正当时,让我们一起深耕智能内容生成和智能内容增强领域

ChatGPT以其强大的信息整合和对话能力惊艳了全球&#xff0c;在自然语言处理上面表现出了惊人的能力。很多人都预测 2023 年将是 AI 生成之年&#xff0c;也许我们将迎来继农业革命、工业革命以来的第三种通用技术的普及。 信必优长期专注于人工智能领域&#xff0c;拥有产品研…...

天梯赛训练L1-019 (谁先倒)

目录 1、L1-019 谁先倒 2、如果帮到大家&#xff0c;请大家一键三连&#xff01;&#xff01;&#xff01; 3、读书吧&#xff0c;在落幕无光时找到方向&#xff01;&#xff01;&#xff01; 1、L1-019 谁先倒 分数 15 题目通道 划拳是古老中国酒文化的一个有趣的组成部分…...

MySQL DQL语句基础(一)

目录 DQL 基本语法 基础查询 1、查询多个字段 2、字段设置别名 3、去除重复记录 条件查询 语法 条件 案例 聚合函数 常见的聚合函数 语法 DQL DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 基…...

ccc-pytorch-LSTM(8)

文章目录一、LSTM简介二、LSTM中的核心结构三、如何解决RNN中的梯度消失/爆炸问题四、情感分类实战&#xff08;google colab&#xff09;一、LSTM简介 LSTM&#xff08;long short-term memory&#xff09;长短期记忆网络&#xff0c;RNN的改进&#xff0c;克服了RNN中“记忆…...

教育小程序开发解决方案

如今无论是国家还是家庭对于教育的重视性也越来越高&#xff0c;都希望自己的孩子能够赢在起跑线上&#xff0c;但是因为工作的缘故许多家长并没有过多的精力去辅导孩子学习&#xff0c;再加上许多家长对于教育也并没有经验与技巧。而这些都充分体现了正确教育的重要性。 那么一…...

动态规划之股票问题大总结

参考资料&#xff1a;代码随想录 (programmercarl.com)一、只能买卖一次题目链接&#xff1a;121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;算法思想&#xff1a;设置两种状态:0表示已持有股票&#xff0c;1表示未持有股票1.dp[i][0]表示第i天已持有股票时&…...

我来跟你讲vue进阶

一、组件&#xff08;重点&#xff09; 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。 组件系统让我们可以用独立可复用的小组件来构建大型应用&#xff0c;几乎任意类型的应用的界面都可以抽象…...

#847(Div3)E. Vlad and a Pair of Numbers

原题链接&#xff1a; E. Vlad and a Pair of Numbers 题意&#xff1a; 题目有公式 a⊕b(ab)/2xa ⊕ b (a b) / 2 xa⊕b(ab)/2x&#xff0c; 给你的是 xxx&#xff0c;让输出一组满足题目要求的 a&#xff0c;ba&#xff0c;ba&#xff0c;b&#xff0c;没有就输出−1-1…...

怎么把pdf转换成图片?这个方法你值得拥有

想要高效率的工作&#xff0c;除了需要大家合理安排时间之外&#xff0c;一些能够辅助高效工作的工具也是必不可少的。就拿要把一份pdf文件转换成若干图片来说&#xff0c;如果不知道方法&#xff0c;找不到合适的转换工具&#xff0c;那么想要完成这一任务&#xff0c;势必要花…...

go语言使用append向二维数组添加一维数组

var ans [][]int ans append(ans, append([]int(nil), nums...))&#xff08;正确写法&#xff09;需要注意的是&#xff0c;为了避免对原切片造成影响&#xff0c;代码在将当前排列追加到结果数组 ans 时&#xff0c;使用了 append(ans, append([]int(nil), nums…)) 的方式…...

YOLOv5训练大规模的遥感实例分割数据集 iSAID从切图到数据集制作及训练

最近想训练遥感实例分割&#xff0c;纵观博客发现较少相关 iSAID数据集的切分及数据集转换内容&#xff0c;思来想去应该在繁忙之中抽出时间写个详细的教程。 iSAID数据集下载 iSAID数据集链接 下载上述数据集。 百度网盘中的train和val中包含了实例和语义分割标签。 上述…...

js学习5(函数)

目录 定义函数 函数的特性 使用函数模拟类 模拟私有属性和方法 闭包 函数特性利用 箭头函数 定义函数 function func1(name) { console.log(name); } func2 function (name) { console.log(name); } func3 function func0(name) { console.log(name); } co…...

用Qt画一个仪表盘

关于Qt Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;通过使用Qt&#xff0c;可以快速开发出跨平台的多平台应用程序&#xff0c;包括Windows、Mac OS X、Linux和其他Unix系统。Qt提供了强大的图形操作界面&#xff08;GUI&#xff09;程序开发和移植的能力&#xf…...

linux 端口查询命令

任何知识都是用进废退&#xff0c;有段时间没摸linux&#xff0c;这大脑里的知识点仿佛全部消失了&#xff0c;就无语。 索性&#xff0c;再写一篇记录&#xff0c;加强一下记忆&#xff0c;下次需要就看自己的资料好了。lsof命令Linux端口查询命令可以通过lsof实现&#xff1a…...

C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()

C语言函数&#xff1a; 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用&#xff1a;字符串查找。在一串字符串中&#xff0c;查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char*的指针 原理&#xff1a;如果在str1中找到了str2&…...

【学习笔记】人工智能哲学研究:《心智、语言和机器》

关于人工智能哲学&#xff0c;我曾在这篇文章里 【脑洞大开】从哲学角度看人工智能&#xff1a;介绍徐英瑾的《心智、语言和机器》 做过介绍。图片来源&#xff1a;http://product.dangdang.com/29419969.html在我完成了一些人工智能相关的工作以后&#xff0c;我再来分享《心智…...

设计模式之门面模式(外观模式)

目录 1.模式定义 2.应用场景 2.1 电源总开关例子 2.2 股民炒股场景 ​编辑 3. 实例如下 4. 门面模式的优缺点 传送门&#xff1a; 项目中用到的责任链模式 给对象讲工厂模式&#xff0c;必须易懂易会 策略模式&#xff0c;工作中你用上了吗&#xff1f; 1.模式定…...

MySQL - 多表查询

目录1. 多表查询示例2. 多表查询分类2.1 等/非等值连接2.1.1 等值连接2.1.2非等值连接2.2 自然/非自然连接2.3 内/外连接2.3.1 内连接2.3.2 外连接3.UNION的使用3.1 合并查询结果3.1.1 UNION操作符3.1.2 UNION ALL操作符4. 7种JOIN操作5. join 多张表多表查询&#xff0c;也称为…...

自定义报表是什么?

自定义报表是指根据用户的需求和要求&#xff0c;自行设计和生成的报表。自定义报表可以根据用户的具体需求&#xff0c;选择需要的数据和指标&#xff0c;进行灵活的排列和组合&#xff0c;生成符合用户要求的报表。自定义报表可以帮助用户更好地了解业务情况&#xff0c;发现…...

windows安装docker-小白用【避坑】【伸手党福利】

目录实操开启 Hyper-V 和容器特性下载docker安装dockercmd中&#xff0c;使用命令测试是否成功报错解决办法&#xff1a;下载linux模拟器wsl&#xff1a;双击打开docker重新打开cmd&#xff0c;输入命令&#xff0c;成功显示sever和clinet实操 开启 Hyper-V 和容器特性 控制面…...

环形链表相关的练习

目录 一、相交链表 二、环形链表 三、环形链表 || 一、相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据…...

C++ 提示对话框

头文件 #include<iostream>#include<cstdio> using namespace std; 函数格式 MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) 参数 hWnd &#xff1a;此参数代表消息框拥有的窗口。如果为NULL&#xff0c;则消息框没有拥有窗口。 lp…...

SprintBoot打包及profile文件配置

打成Jar包 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中&#xff0c;可以使用maven的package&#xff1b;运行: java -jar xxx(jar包名) 操作步骤 第一步: 引入Spring Boot打包插件 <!--打包的插件--> <build><!--修改jar的名字--><fi…...

java面试-java集合

说说你如何选用集合&#xff1f; 需要键值对选用 map 接口下的集合&#xff0c;需要排序用 TreeMap, 不需要排序用 HashMap 不需要键值对仅存放元素则选择 Collection 下实现的接口&#xff0c;保证元素唯一使用 Set, 不需要则选用 List Collection 和 Collections 有什么区别…...

Node.js简介

客户端访问网页时向服务器端发送请求要访问服务器中的页面&#xff0c;服务器收到请求后向数据库中进行搜索&#xff0c;搜索到相关数据然后返回结果给客户端显示&#xff1b; 这个过程就类似于&#xff1a;客人&#xff08;客户端&#xff09;去饭馆&#xff08;服务端&#…...

每天学一点之Lambda表达式

Lambda表达式 思想导入&#xff1a; 函数式编程思想&#xff1a; 在数学中&#xff0c;函数就是有输入量、输出量的一套计算方案&#xff0c;也就是“拿什么东西做什么事情”。编程中的函数&#xff0c;也有类似的概念&#xff0c;你调用我的时候&#xff0c;给我实参为形参赋…...

Raft分布式共识算法学习笔记

1. Raft算法 Raft算法属于Multi-Paxos算法&#xff0c;它是在Multi-Paxos思想的基础上&#xff0c;做了一些简化和限制&#xff0c;比如增加了日志必须是连续的&#xff0c;只支持领导者、跟随者和候选人三种状态&#xff0c;在理解和算法实现上都相对容易许多 从本质上说&am…...

中介者模式

介绍 Java中介者模式(Mediator Pattern)是一种行为设计模式,它可以降低多个对象之间的耦合性,通过一个中介者对象来协调这些对象的交互. 在中介者模式中,多个对象之间的交互不是直接进行的,而是通过一个中介者对象来进行的.这个中介者对象封装了对象之间的交互逻辑,每个对象只…...

Kaggle赛题解析:Google手语识别

文章目录一、比赛前言信息二、比赛背景三、比赛任务四、评价指标五、数据描述六、解题思路一、比赛前言信息 比赛名称&#xff1a;Google - Isolated Sign Language Recognition 中文名称&#xff1a;帮助用户从PopSign游戏学习美国手语 比赛链接&#xff1a;https://www.ka…...

什么是ChatGPT?

目录前言一、什么是GPT&#xff1f;二、什么是ChatGPT&#xff1f;三、ChatGPT应用场景四、ChatGPT未来展望五、OpenAI介绍前言 3月3号&#xff0c;早上6:30就有人发消息给我&#xff0c;来问我有关GPT API的事件。 那是因为3月2号&#xff0c;OpenAI 发布了ChatGPT 3.5的开放…...

深入理解Zookeeper的ZAB协议

ZAB是什么ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;&#xff1a;Zookeeper原子广播ZAB是为了保证Zookeeper数据一致性而产生的算法&#xff08;指的是Zookeeper集群模式&#xff09;。它不仅能解决正常情况下的数据一致性问题&#xff0c;还可以保证主节点发生宕…...

opencv-图像几何处理

缩放 缩放只是调整图像的大小。为此&#xff0c;opencv提供了一个cv2.resize()函数&#xff0c;可以手动指定图像大小&#xff0c;也可以指定缩放因子。你可以使用任意一种方法调整图像的大小&#xff1a; import cv2 from matplotlib import pyplot as pltlogo cv2.imread(…...

[前端笔记030]vue之hello、数据绑定、MVVM、数据代理、事件处理、计算属性和监视属性

前言 本笔记参考视频&#xff0c;尚硅谷:BV1Zy4y1K7SH p1 -p25官网文档完善&#xff0c;本文只做笔记使用&#xff0c;官网下载vue的开发版和生产版或者使用CDN&#xff0c;并去谷歌商店下载开发插件 简介 组件化模式&#xff0c;提高代码复用率&#xff0c;更好维护声明式编…...

每天学一点之注解、元注解

注解 1、注解概述 定义&#xff1a; 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说明&#xff0c;注释。 作用分类&#…...

STA环境

目录1. CMOS逻辑门2. 波形3. 时钟3.1. 指定时钟create_clock时钟延迟set_clock_latency 时钟不确定度set_clock_uncertainty 跨时钟域set_false_path3.2. 衍生时钟3.3. 虚拟时钟4. 时序路径2.1. 输入路径2.2. 输出路径2.3. 点对点约束本文介绍在执行静态时序分析&#xff08;St…...

嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板

物联网实验1 阿里云远程控制小灯 ///****************************************************************************** // * // * MSP432P401 // * ----------------- // * | | // * | |…...

【密码学篇】密码行业标准汇总(GM)

【密码学篇】密码行业标准汇总&#xff08;GM&#xff09; 截止到2023年03月10日&#xff0c;共130个密码行业标准&#xff0c;适用商用密码应用与安全性评估等密码行业&#xff0c;可点击链接预览或下载标准—【蘇小沐】 文章目录【密码学篇】密码行业标准汇总&#xff08;GM…...

桌面文件删除后没有在回收站原因和恢复方法

桌面误删文件回收站也没有怎么办&#xff1f;遇到电脑桌面文件误删了&#xff0c;重要数据回收站找不回这种情况不要慌&#xff01;如今数据恢复技术很成熟&#xff0c;许多文件丢失问题都能够成功解决。下面我们就一起来了解下桌面误删文件回收站没有的原因和相关文件恢复方法…...

什么是业务运营?关键组成部分有哪些?

企业领导者使用收入运营和智能软件等技术来分析买家的不同接触点。这些见解决定了客户互动的成败&#xff0c;从而改善了业务运营&#xff0c;从而带来了成功。 什么是业务运营&#xff1f; 业务运营包括企业为保持盈利而执行的一系列日常任务。虽然这些任务可能因业务类型或行…...

腾讯云新用户怎么配置服务器的方法教程

腾讯云新用户怎么配置服务器&#xff1f;腾讯云服务器配置选择攻略&#xff0c;先选择云服务器地域和可用区&#xff0c;然后根据用户使用场景需要平衡型、计算型或高IO型等特性来选择云服务器CVM实例规格&#xff0c;主机教程网来详细说下腾讯云服务器配置选择攻略。 1、腾讯云…...

windows 11系统,通过ip地址远程连接连接ubuntu 22.04系统(共同局域网下,另一台主机不需要联网)

windows 11系统&#xff0c;通过ip地址远程连接连接ubuntu 22.04系统&#xff08;不需要联网&#xff09;问题来源问题分析解决方案问题来源 自己搭建了一台ubuntu系统作为深度学习的机器&#xff0c;但是学校的网络问题&#xff0c;一个账号只能同时登录3台设备。通过远程连接…...

头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析

文章目录1 MyBatis中Controller层List集合接收数据&#xff0c;泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收&#xff1f;1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据&#xff1f;resultType是集合中的元素的类型&#xff0c;…...

vue-cropper 拖动图片和截图框

现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true&#xff0c;表示可以拖动截图框 can-move设置为true&#xff0c;表示可以拖动图片 *注意&#xff1a; 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高&#xff0c;否则移动不了…...

[Linux基础]history相关的环境变量设置

目录 背景 简介 命令操作 1. 语法&#xff1a; 2. 功能 3. 参数 环境变量设置 背景 工作中时常收到客户的反馈&#xff0c;我的系统什么也没干&#xff0c;就出现文件丢失&#xff0c;程序错误等等问题&#xff1b;我们在问题排查的时候查看history信息也是重要环节…...

怎么给电脑分盘与合并磁盘?教你三招

电脑只有一个C盘&#xff0c;想要再分出一个或多个分区&#xff0c;怎么办&#xff1f;电脑C盘的容量太小&#xff0c;太容易满了&#xff0c;想重新分盘&#xff0c;或者把其他盘跟它合并&#xff0c;但因为文件太多备份实在是太麻烦&#xff0c;怎么办&#xff1f;怎么给电脑…...

HCIP-5.4OSPF路由聚合、缺省路由

1、路由聚合 OSPF 是一种链路状态路由协议&#xff0c;因此 OSPF路由器不传输路由&#xff0c;而是传输链路状态信息。因此&#xff0c;OSPF 路由通过汇总 LSA 来控制链路状态信息的传输&#xff0c;从而减小 LSDB 数据库的大小&#xff0c;进而控制路由的汇总。 由于OSPF路由…...

【数据结构】——树与二叉树

文章目录树二叉树二叉树的性质完全二叉树二叉树的存储遍历二叉树和线索二叉树6.4 树和森林哈夫曼树应用树 树的定义&#xff1a;树是以分支关系定义的层次结构。 D; 树(Tree)是n(n≥0)个结点的有限集。 R 数据关系 有且仅有一个特定的称为根(Root) 的结点 当n>1时&…...

等离子纳秒高压脉冲电源维修HVP-20 P

等离子纳秒高压脉冲电源维修HVP-20 P;HVP-10B;HVP-05;HVP-02等型号均可维修 HVP-20 P(N)用于气体放电与低温等离子体的高性能纳秒高压脉冲电源。 HVP-20P(N)采用专有的marx电路&#xff0c;实现高压脉冲电源参数的便捷可调&#xff0c;包括峰值电压0 – 20 KV &#xff08;-2…...

JavaScript内改变this指向

之前我们说的都是代码内 this 的默认指向今天我们要来说一下如何能改变 this 指向也就是说, 你指向哪我不管, 我让你指向哪, 你就得指向哪开局在函数的原型( Function.prototype ) 上有三个方法callapplybind既然是在函数的原型上, 那么只要是函数就可以调用这三个方法&#xf…...