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

手把手教你怎么写顺序表

目录

一、顺序表有什么功能?

二、实现顺序表的各个功能

1.前置准备

2.初始化顺序表

3.顺序表扩容

4.打印顺序表

5.增加顺序表成员

5.1尾增

5.2头增

 6.删除顺序表中成员的内容

6.1尾删

6.2头删

 7.查找成员

 8.修改(替换)

9.插入(在目标位置插入成员)

10.定向删除(将目标位置的成员删除)

三、全部代码

1.函数头文件

2.函数实现


一、顺序表有什么功能?

这就像是大纲一样,只要我们明确了要实现的功能,之后就是努力地实现它们就好了,众所周知,顺序表是在计算机内存中以数组的形式保存我们需要的数据。既然数据被保存了,那么我们接下来就是对这些保存好的数据进行对应的操作,增删改查是必须要有的,接着,我们想将顺序表中的内容打印出来,看看到底有没有正确的存储我们需要的数据,我们可以再设计一个打印函数,想对顺序表的内容排序也可以再设计一个排序函数,反正根据自己所需设计,但是增删改查是最基本的,必须要有的。

二、实现顺序表的各个功能

1.前置准备

在实现顺序表的各个功能之前我们得先有点前置准备内容,顺序表的成员类型,顺序表这个结构体的设计,头文件的引用......这些操作笔者推荐都放在一个头文件中进行,这样在调用的时候仅需引用一个头文件即可完成我们需要的功能。

// SeqList.h
//将所需函数和所需头文件的引用放在一个头文件中,那么在使用的时候就只用引用一个头文件
#pragma once//防止头文件被重复引用
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>//可能要用到的头文件
typedef int SlDateType;
//将int typedef成SlDateType这样就可以区分int和顺序表成员
// 虽然它们的类型本质上都是int但是它们的字面含义已经不同
//当然了,可以把int换成别的类型
//这样子设计其实更多的是为了到时顺序表成员类型想更换直接从这换就全换了,不用一个一个换
typedef struct seqlist
{SlDateType* a;//创建一个指针类型的顺序表成员数据,为什么是指针?//这样做是为了到时能够使用malloc和realloc对空间的大小进行开辟与修改//相当于柔性数组int sz;//已经存放了多少个成员int capacity;//容量大小,以后判定空间是否够用可以通过这个来判定
}seqlist;//将结构体名字命名为seqlist,使用时更加方便

2.初始化顺序表

记得在书写代码之前将之前的顺序表头文件引用进来,这样就可以用到顺序表头文件的内容。

//顺序表.c
#include"顺序表.h"
void init_seqlist(seqlist* s1)//通过指针的形式访问,便能够对内容进行修改
{s1->capacity = 3;//将容量大小初始化为3,为了更好地测试到时的扩容效果s1->sz = 0;//将成员数量初始化为0,代表着此时没有存放成员s1->a = (SlDateType*)malloc(sizeof(SlDateType) * s1->capacity);//将顺序表的成员数组大小初始化和容量一样的大小if (s1->a == NULL)//开辟失败的话直接退出程序{exit(-1);}
}

在顺序表.c中书写完函数的内容后别忘了在顺序表.h中引用它,这样别人才能够只引用一个头文件就能够使用对应函数。

3.顺序表扩容

在存放顺序表成员之前我们应该要注意的一点就是,我们的容量是有限的,那么在触及容量的时候,也就是顺序表已经被装满的时候,我们应该要扩容处理,避免出现装不下内容的情况出现。

void if_enough(seqlist* s1)
{if (s1->sz == s1->capacity)//当容量和成员个数相当时,显然就已经存满了,需要扩容{s1->a = realloc(s1->a,sizeof(SlDateType)*s1->capacity*2);//将容量扩大到原来容量的两倍if (s1->a == NULL){perror("if_enough");//错误提示return;//中止程序}s1->capacity *= 2;//扩容成功,容量翻倍printf("扩容成功,当前容量为%d\n",s1->capacity);//扩容成功给个提示}
}

4.打印顺序表

在增加之前,我们就会意识到这样一个问题,倘若我增加了顺序表成员,但我又该如何分辨出我成功增加了顺序表成员呢,听着是不是很绕?其实就是我们不能够直接的看到顺序表的内容,因此我们可以使用打印的方式将顺序表的内容打印出来。

void print_seqlist(const seqlist* s1)
//将内容打印出来,但内容是不会被改变的,因此用const修饰,避免内容被修改
{if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}int i = 0;for (i = 0; i < s1->sz; i++){printf("%d ", s1->a[i]);//将内容通过循环的方式打印出来}printf("\n");//打印完所有内容之后最好换行
}

5.增加顺序表成员

5.1尾增

什么是尾增?顾名思义,就是从最后面开始增加,即在顺序表的最后进行成员的添加,注意:在进行增加之前我们需要判断顺序表是否被放满,这个时候就可以使用我们之前创建的if_enough函数来判断是否需要进行扩容处理,如果需要则扩容,不需要则无事发生。

void seqlist_pushback(seqlist*s1,SlDateType x)
{if_enough(s1);s1->a[s1->sz] = x;//在顺序表的最后插入一个数据xs1->sz++;
}

创建一个新的文件,测试一下我们之前写的代码 

//test.c
#include"顺序表.h"
int main()
{seqlist s1;init_seqlist(&s1);//初始化顺序表print_seqlist(&s1);//将顺序表内容打印,但此时是空,故不能打印seqlist_pushback(&s1, 1);//依次将1,2,3放入顺序表中seqlist_pushback(&s1, 2);seqlist_pushback(&s1, 3);print_seqlist(&s1);//打印顺序表seqlist_pushback(&s1, 2);//依次将2,3放入顺序表中seqlist_pushback(&s1, 3);print_seqlist(&s1);//打印顺序表
}

5.2头增

顾名思义,在顺序表的最开始进行成员的增加,我们不难想象,若是这个顺序表中已经有成员了这么办?难不成直接将这个成员替换成我们的目标?如果这样做就会少一个成员,根据数组的经验,我们只能够通过覆盖的方式先将所有的成员往后挪一个单位,再将最前面的成员替换成我们需要的成员。同样在开始之前我们应该要判断容量是否足够。

这里挪动是核心,同样也是一门学问,笔者在这画副图给大家,大家就懂得如何挪动了

 由图可知,我们要先将最后面的成员往后挪动到下一个空间中,也就是sz对应的空间内容,得是sz-1的空间内容,sz-1的内容得是sz-2的内容,那么就可以通过循环的方式实现,sz-i指向的内容等于sz-i-1指向的内容,i实现一步步的覆盖,这里面比较难想的就是i的范围,由目标分析可知,当sz-i-1=0的时候结束循环,为什么?,因为当sz-i-1=0的时候,sz-i等于1,也就是1对应的目标,等于0对应的目标,完成这一步之后,所有的覆盖就已经结束,根据计算可知,i=sz-1,故i<sz便可以实现所有的覆盖。

void seqlist_pushfront(seqlist* s1, SlDateType x)
{if_enough(s1);int i = 0;for (i=0;i<s1->sz;i++)//通过循环从后往前覆盖{s1->a[s1->sz - i] = s1->a[s1->sz-i-1];}s1->a[0] = x;//将首元素替换成xs1->sz++;
}

 同样可以测试一下

//test.c
#include"顺序表.h"
int main()
{seqlist s1;init_seqlist(&s1);//初始化顺序表print_seqlist(&s1);//将顺序表内容打印,但此时是空,故不能打印seqlist_pushback(&s1, 1);//依次将1,2,3放入顺序表中seqlist_pushback(&s1, 2);seqlist_pushback(&s1, 3);print_seqlist(&s1);//打印顺序表seqlist_pushfront(&s1,520);//在最前面放入520print_seqlist(&s1);//打印顺序表
}

 6.删除顺序表中成员的内容

6.1尾删

这个就很简单了,我们只需要将此时顺序表的成员数量往回拨一位就行。为什么?举个例子,成员中已经有了1,2,3,4,5那么不难得出sz此时是5,指向的是5后面的空间,而当我们把数量往回拨的话,sz就指向了4,那么此时sz就指向了5对应的空间,下次你在再增加内容的时候这个空间就会被自动覆盖掉,同样,打印的话也是根据sz来打印的,会直接略过。唯一需要注意的一点就是,当顺序表的成员为空的时候,也就是没有成员的时候,强行删除的话就会造成越界问题的发生。因为没有成员的时候,sz为0,你对它强行进行删除,那么就会导致sz=-1,下一次再增加元素的时候,就会越界访问。

void seqlist_popback(seqlist* s1)
{if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}s1->sz--;
}

6.2头删

头删相对于尾删麻烦一些,我们通过从前往后覆盖的方式将前面的内容覆盖成后面的内容

void seqlist_popfront(seqlist* s1)
{if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}int i = 0;for (i = 1; i < s1->sz; i++){s1->a[i-1] = s1->a[i];//从前往后覆盖}s1->sz--;
}

同样,我们可以测试一下 

 7.查找成员

目标很简单,就是查找到目标成员然后打印出来,找不到就打印找不到,通过一次遍历就可以搞定

void seqlist_fine(const seqlist* s1,const SlDateType x)
//查找的目标是x,用const修饰是因为只是查找,不用修改
{if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}int i = 0;for (i = 0;i<s1->sz; i++){if (s1->a[i] == x)//相等意味着找到了{printf("找到%d了,下标为%d\n",x,i);return;}}printf("目标不存在\n");
}

同样可以测试一下 

 8.修改(替换)

给对应的下标,和被修改的结果,对目标下标的内容进行修改,要注意的是,我们修改下标的范围只能是在成员组中进行修改,什么意思?就是说,我们不能对还没放成员的下标进行修改

void seqlist_modify(seqlist* s1, int pos, const SlDateType x)
{if (pos >= s1->sz)//当pos=sz时就已经是对还不是成员的空间进行操作了,更别说后面的了{printf("当前空间还不是成员的一部分,操作失败\n");return;}s1->a[pos] = x;
}

同样可以测试一下

9.插入(在目标位置插入成员)

需要注意的便是,我们插入的范围是多少,很显然0~sz-1都是可以插入的,这里面已经是有内容的了,那么sz可不可以呢?可以,因为在sz这个位置插入就相当于尾插,还有一点需要注意,那便是插入成员,成员的数量是会增加的,那么也就是说,我们一样要在插入前判断是否需要扩容。

void seqlist_insert(seqlist* s1, int pos, const SlDateType x)
{if_enough(s1);if (pos > s1->sz)//比sz还大,意味着插入的位置会导致连续性被破坏{printf("插入位置出错,操作失败\n");return;}int i = 0;for (i = 0;i<s1->sz-pos; i++){s1->a[s1->sz-i] = s1->a[s1->sz-i-1];//从后向前覆盖}s1->a[pos] = x;s1->sz++;
}

测试一下

10.定向删除(将目标位置的成员删除)

有了之前插入的经验,这个就显得很简单,但要注意的一点则是,它的删除范围只能是0~sz-1,sz不被包括在内,因为sz显而易见还不是成员。

void seqlist_erase(seqlist* s1, int pos)
{if (pos >= s1->sz)//等于sz时就已经是在删除未被定义的内容了{printf("删除位置出错,操作失败\n");return;}int i = 0;for (i=0;pos+i+1<s1->sz;i++){s1->a[pos+i] = s1->a[pos+i+1];//从前向后覆盖}s1->sz--;
}

测试一下

 当我们完成了插入和定向删除,其实之前的头插头删,尾插尾删都可以通过这两个函数来替换,这里就不再一一展示,升级版直接放在全部代码里面。

三、全部代码

1.函数头文件

// SeqList.h
//将所需函数和所需头文件的引用放在一个头文件中,那么在使用的时候就只用引用一个头文件
#pragma once//防止头文件被重复引用
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>//可能要用到的头文件
typedef int SlDateType;
//将int typedef成SlDateType这样就可以区分int和顺序表成员
// 虽然它们的类型本质上都是int但是它们的字面含义已经不同
//当然了,可以把int换成别的类型
//这样子设计其实更多的是为了到时顺序表成员类型想更换直接从这换就全换了,不用一个一个换
typedef struct seqlist
{SlDateType* a;//创建一个指针类型的顺序表成员数据,为什么是指针?//这样做是为了到时能够使用malloc和realloc对空间的大小进行开辟与修改//相当于柔性数组int sz;//已经存放了多少个成员int capacity;//容量大小,以后判定空间是否够用可以通过这个来判定
}seqlist;//将结构体名字命名为seqlist,使用时更加方便
//初始化顺序表
void init_seqlist(seqlist*s1);
//打印顺序表
void print_seqlist(const seqlist* s1);
//尾增
void seqlist_pushback(seqlist* s1, SlDateType x);
//头增
void seqlist_pushfront(seqlist* s1, SlDateType x);
//尾删
void seqlist_popback(seqlist* s1);
//头删
void seqlist_popfront(seqlist* s1);
//查找成员
void seqlist_fine(const seqlist* s1,const SlDateType x);
//修改成员
void seqlist_modify(seqlist* s1, int pos, const SlDateType x);
//插入成员
void seqlist_insert(seqlist* s1, int pos, const SlDateType x);
//删除成员
void seqlist_erase(seqlist* s1, int pos);

2.函数实现

//顺序表.c
#include"顺序表.h"
void init_seqlist(seqlist* s1)//通过指针的形式访问,便能够对内容进行修改
{s1->capacity = 3;//将容量大小初始化为3,为了更好地测试到时的扩容效果s1->sz = 0;//将成员数量初始化为0,代表着此时没有存放成员s1->a = (SlDateType*)malloc(sizeof(SlDateType) * s1->capacity);//将顺序表的成员数组大小初始化和容量一样的大小if (s1->a == NULL)//开辟失败的话直接退出程序{exit(-1);}
}
void if_enough(seqlist* s1)
{if (s1->sz == s1->capacity)//当容量和成员个数相当时,显然就已经存满了,需要扩容{s1->a = realloc(s1->a,sizeof(SlDateType)*s1->capacity*2);//将容量扩大到原来容量的两倍if (s1->a == NULL){perror("if_enough");//错误提示return;//中止程序}s1->capacity *= 2;//扩容成功,容量翻倍printf("扩容成功,当前容量为%d\n",s1->capacity);//扩容成功给个提示}
}
void print_seqlist(const seqlist* s1)
//将内容打印出来,但内容是不会被改变的,因此用const修饰,避免内容被修改
{if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}int i = 0;for (i = 0; i < s1->sz; i++){printf("%d ", s1->a[i]);//将内容通过循环的方式打印出来}printf("\n");//打印完所有内容之后最好换行
}
void seqlist_pushback(seqlist*s1,SlDateType x)
{//if_enough(s1);//s1->a[s1->sz] = x;//在顺序表的最后插入一个数据x//s1->sz++;seqlist_insert(s1,s1->sz,x);
}
void seqlist_pushfront(seqlist* s1, SlDateType x)
{//if_enough(s1);//int i = 0;//for (i=0;i<s1->sz;i++)//通过循环从后往前覆盖//{//	s1->a[s1->sz - i] = s1->a[s1->sz-i-1];//}//s1->a[0] = x;//将首元素替换成x//s1->sz++;seqlist_insert(s1,0, x);
}
void seqlist_popback(seqlist* s1)
{/*if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}s1->sz--;*/seqlist_erase(s1,s1->sz-1);
}
void seqlist_popfront(seqlist* s1)
{//if (s1->sz == 0)//{//	printf("顺序表为空,操作失败\n");//	return;//}//int i = 0;//for (i = 1; i < s1->sz; i++)//{//	s1->a[i-1] = s1->a[i];//从前往后覆盖//}//s1->sz--;seqlist_erase(s1,0);
}
void seqlist_fine(const seqlist* s1,const SlDateType x)
//查找的目标是x,用const修饰是因为只是查找,不用修改
{if (s1->sz == 0){printf("顺序表为空,操作失败\n");return;}int i = 0;for (i = 0;i<s1->sz; i++){if (s1->a[i] == x)//相等意味着找到了{printf("找到%d了,下标为%d\n",x,i);return;}}printf("目标不存在\n");
}
void seqlist_modify(seqlist* s1, int pos, const SlDateType x)
{if (pos >= s1->sz)//当pos=sz时就已经是对还不是成员的空间进行操作了,更别说后面的了{printf("当前空间还不是成员的一部分,操作失败\n");return;}s1->a[pos] = x;
}
void seqlist_insert(seqlist* s1, int pos, const SlDateType x)
{if_enough(s1);if (pos > s1->sz)//比sz还大,意味着插入的位置会导致连续性被破坏{printf("插入位置出错,操作失败\n");return;}int i = 0;for (i = 0;i<s1->sz-pos; i++){s1->a[s1->sz-i] = s1->a[s1->sz-i-1];//从后向前覆盖}s1->a[pos] = x;s1->sz++;
}
void seqlist_erase(seqlist* s1, int pos)
{if (pos >= s1->sz)//等于sz时就已经是在删除未被定义的内容了{printf("删除位置出错,操作失败\n");return;}int i = 0;for (i=0;pos+i+1<s1->sz;i++){s1->a[pos+i] = s1->a[pos+i+1];//从前向后覆盖}s1->sz--;
}

好了,今天的分享到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

相关文章:

手把手教你怎么写顺序表

目录 一、顺序表有什么功能&#xff1f; 二、实现顺序表的各个功能 1.前置准备 2.初始化顺序表 3.顺序表扩容 4.打印顺序表 5.增加顺序表成员 5.1尾增 5.2头增 6.删除顺序表中成员的内容 6.1尾删 6.2头删 7.查找成员 8.修改(替换) 9.插入(在目标位置插入成员) 10.定…...

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解&#xff0c;搞脑子一片浆糊&#xff0c;反复推算&#xff0c;好不容易理清了思路&#xff0c;记录下来&#xff0c;防止忘记。开辟的RAM总容量为128bytes&#xff0c;数据的位宽为32位&#xff08;即一个单元有32bit…...

家庭用的无线洗地机到底好不好用?2023洗地机品牌排行榜前十名

无线洗地机在清洁使用的时候非常便捷&#xff0c;多功能于一体能够轻轻松松就拖扫完全家&#xff0c;不需要多余的先扫再拖&#xff0c;浪费时间还非常的劳累。那么有什么靠谱并且质量也有保障的无线洗地机推荐吗&#xff1f;为了给想要选购洗地机的小伙伴提供一些参考&#xf…...

[React]常见Hook实现之useUpdateEffect

useUpdateEffect是一个自定义的React Hook&#xff0c;用于在组件更新时执行副作用。它的实现原理如下&#xff1a; useEffect和useLayoutEffect&#xff1a;useUpdateEffect内部使用useEffect或useLayoutEffect来注册副作用函数。这两个Hook函数都接受一个回调函数和依赖项数…...

为什么视频画质会变差,如何提升视频画质清晰度。

在数字时代&#xff0c;视频已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着视频的传输和处理过程中的多次压缩&#xff0c;画质损失逐渐凸显&#xff0c;影响了我们对影像的真实感受。为了让视频画质更加清晰、逼真&#xff0c;我们需要采取一些措施来保护和修复视…...

【uni-app2.0】实现登录页记住密码功能

使用uni-app的uni.setStorageSync()和uni.getStorageSync()方法来存储和读取密码 在登录页中添加一个记住密码的u-checkbox选项&#xff0c;并在data里面添加一个rememberPwd的布尔值&#xff0c;在每次点击记住密码change的时候来记录用户的选择 <u-checkbox-group place…...

IDEA live templates

surround 在SQL的xml里 可以修改变量 官方文档 CDATA not null <if test"$SELECTION$ ! null and $SELECTION$ ! "> and $VAR1$ #{$SELECTION$} </if>not null like mysql <if test"$SELECTION$ ! null and $SELECTION$ ! "> and…...

电子鼻毕业论文

面向压埋探测的人体代谢气体识别方法的研究与应用 实现对非目标气体的检测 数据预处理 &#xff08;1a&#xff09;标准化 将采集到的数据先进行变换&#xff0c;统一数量级。其中&#xff0c;xij为第j个传感器的第i个采样值&#xff1b;xj为第 j 个气体传感器的所有采样值&…...

8 | 爬虫解析利器 PyQuery 的使用

文章目录 爬虫解析利器 PyQuery 的使用简介安装基本用法初始化查找元素遍历元素修改元素练习题练习题 1练习题 2答案练习题 1练习题 2总结爬虫解析利器 PyQuery 的使用 简介 PyQuery 是一个 Python 的库,它是 jQuery 的 Python 实现。PyQuery 可以让开发者使用类似于 jQuery…...

2023年 React 最佳学习路线

CSS CSS JavaScript JavaScript TypeScript 目前没有找到比其他文档好很多的文档地址 可以先看官网 React 新版 React 官方文档无敌 React React-router-dom V5 V6 Webpack webpack Antd antd...

使用 ChatGPT 进行研究的先进技术

在这篇文章中&#xff0c;您将探索改进您研究的先进技术。尤其&#xff0c; 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…...

Java-API简析_java.net.Proxy类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131881661 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…...

磁盘问题和解决: fsck,gdisk,fdisk等

错误: Resize inode not valid 对于gpt分区的硬盘一般fsck只能检查分区, 不能用于检查整个硬盘, 但是如果对硬盘设备运行时遇到这样的错误 $ sudo fsck -n /dev/sdc fsck from util-linux 2.37.2 e2fsck 1.46.5 (30-Dec-2021) GW1.5T was not cleanly unmounted, check force…...

基于深度学习的高精度六类海船检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度六类海船检测识别系统可用于日常生活中检测与定位海船目标&#xff08;散装货船&#xff08;bulk cargo carrier&#xff09;、集装箱船&#xff08;container ship&#xff09;、渔船&#xff08;fishing boat&#xff09;、普通货船&…...

【React Native】学习记录(一)——环境搭建

Expo是一套工具&#xff0c;库和服务&#xff0c;可让您通过编写JavaScript来构建原生iOS和Android应用程序。 一开始学习的时候直接使用的是expo。 npx create-expo-app my-appcd my-appnpm run start接下来需要搭建安卓和IOS端&#xff08;为此特意换成了苹果电脑&#xff09…...

Java 设计模式 - 简单工厂模式 - 创建对象的简便之道

简单工厂模式是一种创建型设计模式&#xff0c;它提供了一种简单的方式来创建对象&#xff0c;而无需暴露对象创建的逻辑。在本篇博客中&#xff0c;我们将深入了解简单工厂模式的概念、实现方式以及如何在Java中使用它来创建对象。 为什么使用简单工厂模式&#xff1f; 在软…...

C# 事件

C# 事件 1.事件概述 事件&#xff08;Event&#xff09; 基本上说是一个用户操作&#xff0c;如按键、点击、鼠标移动等等&#xff0c;或者是一些提示信息&#xff0c;如系统生成的通知。应用程序需要在事件发生时响应事件。例如&#xff0c;中断。 C# 中使用事件机制实现线程…...

网络:TCP/IP协议

1. OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2. TCP/IP模型 应用层 传输层 网络层 数据链路层 物理层 3. 各链路层对应的名称 应用层对应的是协议数据单元 传输层对应的是数据段 网络层对应的是数据包 链路层对应的是数据帧 物理层对应的是比特…...

在线阅读版:《2023中国软件供应链安全分析报告》全文

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 专栏供应链安全 数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会的根本性、基础性问题。 随…...

NLP_文本去重_附Python实现【MinHash和MinHashLSH】算法

NLP_文本去重_附Python实现【MinHash和MinHashLSH】算法 前言代码的实现【注释丰富】前言 大规模的文本去重是目前比较热门的一个技术,由于大模型的兴起,更多的高质量数据集也是大家迫切需要的。 关于如何进行文本去重? 直观的方法首先是利用Python正则表达式进行去重。 推…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...