嵌入式培训之数据结构学习(二)顺序表与单向链表
目录
一、顺序表
(一)顺序表的基本操作
1、创建顺序表
2、销毁顺序表
3、遍历顺序表
4、尾插,在顺序表的最后插入元素
5、判断表是否满
6、判断表是否空
7、按指定位置插入元素
8、查找元素,根据名字
9、根据名字修改指定元素
10、根据名字删除指定元素
11、清空表,清空表中已有的元素
12、获得表中有效元素的个数
13、获得指定下标的元素本身
(二)顺序表优缺点
二、链表
(一)链表基础概念
(二)单向链表(重点)
(三)单向链表的基本操作
1、创建链表
2、判断链表是否为空
3、获取链表长度
4、头插,在链表的前面插入一个结点
5、遍历打印链表
6、根据名字查找链表中的结点
7、根据名字删除链表中的结点
一、顺序表
(一)顺序表的基本操作
1、创建顺序表
SeqList *CreateSeqList(int len)
{
SeqList *sl = malloc(sizeof(SeqList)); // 分配顺序表结构体空间
if (NULL == sl) {
fprintf(stderr, "CreateSeqList malloc error\n"); // 分配失败报错
return NULL;
}
sl->head = malloc(sizeof(DATATYPE) * len); // 分配数据存储数组空间
if (NULL == sl->head) {
fprintf(stderr, "CreateSeqList malloc2 error\n"); // 数组分配失败报错
return NULL;
}
sl->tlen = len; // 存储总长度(最大容量)
sl->clen = 0; // 初始元素个数为0
return sl; // 返回顺序表指针
}
2、销毁顺序表
int DestroySeqList(SeqList *list)
{
if(NULL == list){
return 1; // 空指针返回错误码1
}
//先检查顺序表指针是否为空
free(list->head); // 释放数据存储区(动态分配的数组)
free(list); // 释放顺序表结构体本身
return 0; // 销毁成功,返回0
//先释放数据区内存,再释放顺序表结构体内存,避免内存泄漏}
3、遍历顺序表
int ShowSeqList(SeqList *list)
{
int len = GetSizeSeqList(list); // 获取当前元素个数
int i = 0;
for (i = 0; i < len; ++i) {
// 打印每个元素的成员(DATATYPE包含name、sex、age、score)
printf("%s %c %d %d\n",
list->head[i].name,
list->head[i].sex,
list->head[i].age,
list->head[i].score);
}
return 0;
}
4、尾插,在顺序表的最后插入元素
int InsertTailSeqList(SeqList *list, DATATYPE *data)
{
if (IsFullSeqList(list)) { // 检查是否已满
fprintf(stderr, "seqlist full\n");
return 1;
}
// 方式1:直接赋值 *data 到当前末尾位置
// list->head[list->clen] = *data;
// 方式2:使用memcpy复制数据(适用于结构体中有指针成员的情况,避免浅拷贝)
memcpy(&list->head[list->clen], data, sizeof(DATATYPE));
list->clen++; // 元素个数+1
return 0; // 成功返回0
}
5、判断表是否满
int IsFullSeqList(SeqList *list)
{
if (NULL == list) {
fprintf(stderr, "IsFullSeqList parameter error\n"); // 空指针检查
return 1; // 返回非0表示错误或已满(此处逻辑为:错误按"满"处理,可能需优化)
}
return list->clen == list->tlen; // 元素个数等于总长度时返回1(满),否则0
}
6、判断表是否空
int IsEmptySeqList(SeqList *list)
{
// 正确写法:判断元素个数是否为0
return 0 == list->clen;
// return list->clen = 0; // 会将clen置0并返回0,逻辑错误
}
7、按指定位置插入元素
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{
if (IsFullSeqList(list)) return 1; // 判满
int len = GetSizeSeqList(list);
if (pos < 0 || pos > len) { // 位置合法性检查(允许pos==len,即尾插)
return 1;
}
// 从末尾开始,将[pos, len-1]的元素后移一位
int i = 0;
for (i = list->clen; i > pos; i--) {
// 方式1:直接赋值
// list->head[i] = list->head[i-1];
// 方式2:使用memcpy复制结构体
memcpy(&list->head[i], &list->head[i-1], sizeof(DATATYPE));
}
// 在pos位置插入新元素
memcpy(&list->head[pos], data, sizeof(DATATYPE));
list->clen++; // 元素个数+1
return 0;
}
8、查找元素,根据名字
int FindSeqList(SeqList *list, char *name)
{
int i = 0;
int len = GetSizeSeqList(list);
for (i = 0; i < len; ++i) {
if (0 == strcmp(list->head[i].name, name)) { // 字符串比较,相等时返回下标
return i;
}
}
return -1; // 未找到返回-1
}
9、根据名字修改指定元素
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata)
{
//参数: old 为旧名称, newdata 为新数据指针
if (IsEmptySeqList(list)){
return 1; // 空表返回错误码1
}
//先检查顺序表是否为空
int ret = FindSeqList(list, old);
if (-1 == ret){
return 1; // 未找到旧元素,返回错误码1
}
//查找旧名称 old 的位置,未找到则返回错误
memcpy(&list->head[ret], newdata, sizeof(DATATYPE));// 直接替换目标位置的数据
return 0; // 修改成功,返回0
}
10、根据名字删除指定元素
int DeleteSeqList(SeqList *list, char *name) //参数: list 为顺序表指针, name 为待删除元素的名称
{
if (IsEmptySeqList(list)) {
return 1; // 空表返回错误码1
}
//先检查顺序表是否为空,空表无法删除元素,返回错误码
int ret = FindSeqList(list, name);
if (-1 == ret){
return 1; // 未找到目标元素,返回错误码1
}
//调用 FindSeqList 查找 name 的位置,返回下标 ret
//若 ret=-1 ,说明元素不存在,返回错误码
int i = 0;int len = GetSizeSeqList(list);
// 获取当前元素总数
//初始化循环变量 i ,获取顺序表当前长度
for (i = ret; i < len - 1; ++i){
memcpy(&list->head[i], &list->head[i + 1], sizeof(DATATYPE));
}
//核心逻辑:从目标位置 ret 开始,将后续元素向前移动一位(覆盖删除)
//memcpy 用于按数据类型大小批量复制内存,实现元素前移
list->clen--; // 元素总数减1
return 0; // 删除成功,返回0}
11、清空表,清空表中已有的元素
int ClearSeqList(SeqList *list)
{
list->clen = 0; // 直接将当前长度置0,不释放内存
return 0;
}
//重置顺序表长度为0,逻辑清空(物理内存未释放)
12、获得表中有效元素的个数
int GetSizeSeqList(SeqList *list)
{
return list->clen; // 直接返回当前元素个数
}
13、获得指定下标的元素本身
DATATYPE *GetItemSeqList(SeqList *list, int ind)
{
if (NULL == list) return NULL; // 空指针检查
int len = GetSizeSeqList(list);
if (ind < 0 || ind > len) {
return NULL;
}
return &list->head[ind]; // 返回指定索引处的元素地址
}
(二)顺序表优缺点
1、优点:
(1)无需为表中的逻辑关系增加额外的存储空间;
(2)可以快速随机访问元素O(1)。
2、缺点:
(1)插入,删除元素需要移动元素o(n);
(2)无法动态存储//链表可以动态存储,来一个输一个,大小不需要事先定,内存使用
率高,顺序表大小是事先定好的。
二、链表
(一)链表基础概念
1、作用:解决顺序存储的缺点,插入和删除,动态存储问题。
2、特点:线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,
存储单元可以是连续的,也可以不连续;
可以被存储在任意内存未被占用的位置上。
3、注:所以前面的顺序表只需要存储数据元素信息就可以了,但在链式结构中还需要
一个元素存储下一个元素的地址。
4、为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,
除了存储其本身的信息外,还需要存一个指示器直接后续的信息;
把存储数据元素信息的域叫数据域,把存储直接后继位置的域叫指针域;
这两部分信息组成数据元素ai的存储映像,叫结点(Node)。
(二)单向链表(重点)
单向链表的链式结构:
注:表头结构可要可不要
(三)单向链表的基本操作
1、创建链表
LinkList* CreateLinkList()
{
LinkList* ll = malloc(sizeof(LinkList)); // 分配链表头结点内存
if (NULL == ll) { // 检查内存分配失败
fprintf(stderr, "CreateLinkList malloc"); // 错误输出
return NULL;
}
ll->head = NULL; // 初始化头指针为空
ll->clen = 0; // 初始化链表长度为0
return ll; // 返回链表头指针
}
2、判断链表是否为空
int IsEmptyLinkList(LinkList* ll)
{
return 0 == ll->clen; // 直接通过长度判断空链表
}
3、获取链表长度
int GetSizeLinkList(LinkList* ll)
{
return ll->clen; // 直接返回链表长度
}
4、头插,在链表的前面插入一个结点
(1)图解
第一种情况(第一个放进去)
第二种情况(放在第二个)
第一步:
第二步:
(2)算法实现
int InsertHeadLinkList(LinkList* ll, DATATYPE* data)
{
LinkNode* newnode = malloc(sizeof(LinkNode)); // 分配新结点内存
if (NULL == newnode) { // 检查内存分配失败
fprintf(stderr, "InsertHeadLinkList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE)); // 复制数据到新结点
newnode->next = NULL; // 新结点初始next为空if (IsEmptyLinkList(ll)) { // 若链表为空
ll->head = newnode; // 新结点作为头结点
} else { // 若链表非空
newnode->next = ll->head; // 新结点指向原头结点
ll->head = newnode; // 新结点成为头结点
}
ll->clen++; // 链表长度+1
return 0; // 成功返回0
}
5、遍历打印链表
(1)图解
定义临时指针tmp
循环tmp = tmp->next
(2)算法实现
int ShowLinkList(LinkList* ll)
{
int len = GetSizeLinkList(ll); // 获取链表长度
LinkNode* tmp = ll->head; // 临时指针指向头结点
int i = 0;for (i = 0; i < len; ++i) { // 循环遍历每个结点
// 打印节点数据(假设DATATYPE包含name、sex、age、score字段)
printf("%s %c %d %d\n",
tmp->data.name,
tmp->data.sex,
tmp->data.age,
tmp->data.score);
tmp = tmp->next; // 移动临时指针到下一个结点
}
return 0;
}
6、根据名字查找链表中的结点
DATATYPE* FindLinkList(LinkList* ll, char* name)
{
//参数:- ll :指向链表头节点的指针;
- name :待查找的目标姓名(字符串);
- 返回值:若找到匹配节点,返回该节点的 DATATYPE 数据指针;否则 返回 NULL 。
//初始化临时指针
LinkNode* tmp = ll->head;
//作用:创建临时指针 tmp ,指向链表的头节点,用于遍历链表。
//循环遍历链表
while (tmp)
{
//条件: tmp 不为空时继续循环(即未遍历到链表末尾)。
// 逻辑:从头部开始逐个访问节点,直到 tmp 为 NULL (遍历结束)。
//字符串匹配检查
if (0 == strcmp(tmp->data.name, name))
{
return &tmp->data;
}
//strcmp 函数:比较两个字符串( tmp->data.name 和 name )。
//若相等,返回 0 ,进入条件分支。
//若不等,返回非零值,跳过分支。
//返回数据指针:若匹配成功,返回当前节点数据域的地址 &tmp->data (类型为 DATATYPE* )。
//移动临时指针
tmp = tmp->next;
//作用:将 tmp 指向下一个结点,继续遍历。
//遍历结束,返回空指针
return NULL;
}
7、根据名字删除链表中的结点
(1)图解:
情况一:不是头删
定义tmp指向头结点
tmp指向待删结点的前一个
情况二头删:
(2)算法实现:
int DeleteLinkList(LinkList* ll, char* name)
{
//参数:
ll :链表头指针(指向 LinkList 结构体,包含头结点 head 和 长度 clen )。
name :待删除结点的姓名(字符串)。
返回值:成功删除返回 0 ,失败(链表为空或未找到结点)返回 1 。//初始化临时指针
LinkNode* tmp = ll->head;
//作用:创建临时指针 tmp ,指向链表头结点,用于遍历和定位结点。
//检查链表是否为空if (IsEmptyLinkList(ll))
{
return 1;//空链表无法删除,直接返回错误
}
//处理头结点匹配的情况
if (0 == strcmp(tmp->data.name, name))
{
ll->head = ll->head->next; // 头结点后移一位
free(tmp); // 释放原头结点内存
ll->clen--; // 链表长度减1
return 0; // 返回成功}
// 条件:若头结点的 name 与目标 name 相等( strcmp 返回 0 )。
//操作:将头指针 ll->head 指向原头结点的下一个结点;
用 free 释放原头结点的内存(避免内存泄漏);
链表长度 clen 减 1 ;
返回 0 表示删除成功.//遍历查找后续结点
while (tmp->next)
{
//循环条件: tmp->next 不为空(即当前结点后还有结点,未到链表末尾);
目的:从第二个结点开始,逐个检查后续结点是否匹配目标姓名;
检查当前结点的下一个结点是否匹配.if (0 == strcmp(tmp->next->data.name, name))
{
//当前结点的下一个结点( tmp->next )的 name 与目标 name 相等
LinkNode* tmp2 = tmp->next; // 记录待删除结点
tmp->next = tmp->next->next; // 跳过待删除结点,连接前后结点
free(tmp2); // 释放待删除结点内存
ll->clen--; // 链表长度减1
return 0; // 返回成功}
tmp = tmp->next;//将 tmp 指向下一个结点,继续向后遍历链表
}
return 1;//未找到目标结点,返回删除失败
}
8、指定位置插入
(1)图解
(2)算法实现
int InsertPosLinkList(LinkList* ll, DATATYPE* data, int pos) // 定义按位置插入函数,参数为链表指针、数据指针和位置pos
{
int len = GetSizeLinkList(ll); // 获取链表当前长度
if(pos<0 || pos>len) // 检查插入位置是否越界(pos不能小于0或大于长度)
{
return 1; // 越界返回错误码1
}
if(0==pos) // 位置为0时(头节点位置)
{
return InsertHeadLinkList(ll, data); // 调用头插法插入
}
else if(pos == len) // 位置为链表长度时(尾部位置)
{
return InsertTailLinkList(ll, data); // 调用尾插法插入
}
else
{
LinkNode* newnode = malloc(sizeof(LinkNode)); // 申请新节点内存
if (NULL == newnode) // 检查内存申请是否失败
{
fprintf(stderr, "InsertPosLinkList malloc"); // 输出错误信息
return 1; // 返回错误码1
}
memcpy(&newnode->data, data, sizeof(DATATYPE)); // 复制数据到新节点数据域
newnode->next = NULL; // 初始化新节点next指针(后续会修改)
int i = 0 ; // 循环计数器
LinkNode* tmp = ll->head; // 临时指针指向头节点
for(i = 0 ;i<pos-1;++i) // 循环移动tmp到插入位置的前一个节点(pos-1次)
{
tmp = tmp->next; // 移动tmp指针
}
newnode->next = tmp->next; // 新节点的next指向原位置节点(tmp的下一个节点)
tmp->next = newnode; // 前一个节点的next指向新节点
ll->clen++; // 链表长度加1
}
return 0; // 插入成功返回0
}
9、尾插
int InsertTailLinkList(LinkList* ll, DATATYPE* data) // 定义尾插法函数,参数为链 表指针和数据指针
{
if (IsEmptyLinkList(ll)) // 检查链表是否为空
{
return InsertHeadLinkList(ll, data); // 若为空,调用头插法插入第一个节点
}
else
{
LinkNode* newnode = malloc(sizeof(LinkNode)); // 申请新节点内存
if (NULL == newnode) // 检查内存申请是否失败
{
fprintf(stderr, "InsertTailLinkList malloc"); // 向标准错误输出错误信息
return 1; // 返回错误码1
}
memcpy(&newnode->data, data, sizeof(DATATYPE)); // 复制数据到新节点的数据域
newnode->next = NULL; // 新节点的next指针置空(作为尾节点)
LinkNode* tmp = ll->head; // 临时指针指向头节点
while(tmp->next) // 循环找到当前尾节点(tmp的next不为空时继续移动)
{
tmp = tmp->next; // 移动tmp到下一个节点
}
tmp->next = newnode; // 尾节点的next指向新节点
ll->clen++; // 链表长度加1
}
return 0; // 插入成功返回0
}
相关文章:
嵌入式培训之数据结构学习(二)顺序表与单向链表
目录 一、顺序表 (一)顺序表的基本操作 1、创建顺序表 2、销毁顺序表 3、遍历顺序表 4、尾插,在顺序表的最后插入元素 5、判断表是否满 6、判断表是否空 7、按指定位置插入元素 8、查找元素,根据名字 9、根据名字修改指…...
PyInstaller 打包后 Excel 转 CSV 报错解决方案:“excel file format cannot be determined“
一、问题背景 在使用 Python 开发 Excel 转 CSV 工具时,直接运行脚本(python script.py)可以正常工作,但通过 PyInstaller 打包成可执行文件后,出现以下报错: excel file format cannot be determined, you must specify an engine manually 该问题通常发生在使用pandas…...
鸿蒙 PC 发布之后,想在技术上聊聊它的未来可能
最近鸿蒙 PC 刚发布完,但是发布会没公布太多技术细节,基本上一些细节都是通过自媒体渠道获取,首先可以确定的是,鸿蒙 PC 本身肯定是无法「直接」运行 win 原本的应用,但是可以支持手机上「原生鸿蒙」的应用,…...
HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(一、开篇,项目介绍)
诗词,作为中国传统文化的瑰宝,承载着中华民族几千年的思想智慧和审美情趣。然而,在现代社会快节奏的生活压力下,诗词文化却逐渐被忽视,更多的人感到诗词艰涩深奥,难以亲近。与此同时,虽然市场上…...
实物工厂零件画图案例(上)
文章目录 滑台气缸安装板旋转气缸安装板张紧调节块长度调节块双轴气缸安装板步进电机安装板梯形丝杆轴承座 简介:案例点击此处下载,这次的这几个案例并没有很大的难度,练习这几个案例最为重要的一点就是知道:当你拿到一个实物的时…...
js中的同步方法及异步方法
目录 1.代码说明 2.async修饰的方法和非async修饰的方法的区别 3.不使用await的场景 4.总结 1.代码说明 const saveTem () > {// 校验处理const res check()if (!res) {return}addTemplateRef.value.openModal() } 这段代码中,check方法返回的是true和fal…...
C 语言_基础语法全解析_深度细化版
一、C 语言基本结构 1.1 程序组成部分 一个完整的 C 程序由以下部分组成: 预处理指令:以#开头,在编译前处理 #include <stdio.h> // 引入标准库 #define PI 3.14159 // 定义常量全局变量声明:在所有函数外部定义的变量 int globalVar = 10; // 全局变量函数定义…...
【Linux系列】dd 命令的深度解析与应用实践
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
ETL背景介绍_1:数据孤岛仓库的介绍
1 ETL介绍 1.1 数据孤岛 随着企业内客户数据大量的涌现,单个数据库已不再足够。为了储存这些数据,公司通常会建立多个业务部门组织的数据库来保存数据。比如,随着数据量的增长,公司通常可能会构建数十个独立运行的业务数据库&am…...
【周输入】510周阅读推荐-1
本号一年了,有一定的成长,也有很多读者和点赞。自觉更新仍然远远不够,需要继续努力。 但是还是要坚持2点: 在当前这个时代,信息大爆炸,层次不齐,不追加多, 信息输入可以很多&#x…...
Games101作业四
作业0到作业3的代码 这次是实现 de Casteljau 算法,以及绘制 Bezier 曲线,比上次简单 核心思想就是递归,原理忘了就去看第十一节课,从15:00开始的 GAMES101-现代计算机图形学入门-闫令琪 代码 先实现贝塞尔曲线 cv::Point2f recursive_bezier(const std::…...
从Aurora 架构看数据库计算存储分离架构
单就公有云来说,现在云数据面临的挑战有以下 5 个: 跨 AZ 的可用性与数据安全性。 现在都提多 AZ 部署,亚马逊在全球有 40 多个 AZ, 16 个 Region,基本上每一个 Region 之内的那些关键服务都是跨 3 个 AZ。你要考虑整个…...
ElasticSearch深入解析(十一):分页
在Elasticsearch中,常用的分页方案有from size、search_after和scroll三种,适用于不同场景。from size基于偏移量分页,是全局排序后的切片查询,适用于小数据量、浅分页场景,但深度分页性能差,且有默认上限…...
【MySQL】MySQL数据库结构与操作
目录 一. 数据库的概念 二. 数据库的分类 三. 初始MySQL数据库 四. 数据库操作 1)创建数据库 2) 查看数据库 3)选中数据库 4)删除数据库 五. SQL数据类型 1)整型和浮点型 2)字符串类型 3)时间…...
Vue框架的基本介绍
目录 一.Vue 1.概述 2.三大主流框架 3.优点: 二.Vue搭建 三.语法 1.基本框架 2.插值表达式 3.Vue指令 1.v-text: 2.v-html: 编辑3.v-model: 4.v-on: 5.v-show: 6.v-if: 7.v-else: 8.v-bind: 9.v-for: 一.Vue 1.概述 Vue是一款用于构建用户界面的渐进式的…...
Web 架构之攻击应急方案
文章目录 一、引言二、常见 Web 攻击类型及原理2.1 SQL 注入攻击2.2 跨站脚本攻击(XSS)2.3 分布式拒绝服务攻击(DDoS) 三、攻击检测3.1 日志分析3.2 入侵检测系统(IDS)/入侵防御系统(IPS&#x…...
xss-labs靶场基础8-10关(记录学习)
前言: 内容: 第八关 关卡资源网站,html编码网站(两个网站,一个是实体编号转义(只对特殊字符有效,字母无效)、实体符号转义) 在线Html实体编码解码-HTML Entity Encodi…...
arctanx 导数 泰勒展开式证明
你提供的推导内容非常清晰,条理分明。下面是对 d d x arctan x 1 1 x 2 \frac{d}{dx} \arctan x \frac{1}{1 x^2} dxdarctanx1x21 的总结与适当补充: ✅ 结论 d d x arctan x 1 1 x 2 \frac{d}{dx} \arctan x \frac{1}{1 x^2} dxda…...
基于Java的家政服务平台设计与实现(代码+数据库+LW)
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本家政服务平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…...
SpringBoot的外部化配置
一、什么是外部化配置 外部化配置是指把应用程序中各种可配置的参数、属性等信息,从代码内部提取出来,放置在外部的配置文件、数据库或配置中心等地方(比如使用.properties、.yml 或.xml 等格式的文件)进行管理。提高应用程序的可…...
Java鼠标事件监听器MouseListener、MouseMotionListener和MouseWheelListener
Java鼠标事件监听器MouseListener、MouseMotionListener和MouseWheelListener java中创建鼠标,键盘的事件行为监听器的几种方法 这里以鼠标点击事件监听器为例,其他也是一样创建。 常用的消息监听器对象 1:点击事件监听器 ActionListener 2:按键事件监…...
第三方支付公司如何代付和入账?
通俗来说,就是企业把钱打到第三方公司账户上,再由第三方公司把钱打入客户指定账户。 那么第三方支付入账流程是怎样的呢? 第一,企业向第三方支付公司指定账户充值打款;第二,企业提交代付银行卡信息后台操…...
.NET8关于ORM的一次思考
文章目录 前言一、思路二、实现ODBC>SqlHelper.cs三、数据对象实体化四、SQL生成SqlBuilder.cs五、参数注入 SqlParameters.cs六、反射 SqlOrm.cs七、自定义数据查询八、总结 前言 琢磨着在.NET8找一个ORM,对比了最新的框架和性能。 框架批量操作性能SQL控制粒…...
LlamaIndex 第八篇 MilvusVectorStore
本指南演示了如何使用 LlamaIndex 和 Milvus 构建一个检索增强生成(RAG)系统。 RAG 系统将检索系统与生成模型相结合,根据给定的提示生成新的文本。该系统首先使用 Milvus 等向量相似性搜索引擎从语料库中检索相关文档,然后使用生…...
记录为什么LIst数组“增删慢“,LinkedList链表“查改快“?
数组(Array) 增删慢:对于数组来说,增加或删除元素的操作可能会比较慢,特别是当你需要在数组的开头或中间进行这些操作时。这是因为这些操作通常需要移动数组中的其他元素以保持连续性。例如,如果你想要在数…...
【论文阅读】Dip-based Deep Embedded Clustering with k-Estimation
摘要 近年来,聚类与深度学习的结合受到了广泛关注。无监督神经网络,如自编码器,能够自主学习数据集中的关键结构。这一思想可以与聚类目标结合,实现对相关特征的自动学习。然而,这类方法通常基于 k-means 框架&#x…...
ARFoundation 图片识别,切换图片克隆不同的追踪模型
场景搭建: 你可以把我的代码发给AI,去理解 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; using TMPro; using Unit…...
鸿蒙next播放B站视频横屏后的问题
(此文讨论范围为b站视频链接,且不包括b站直播链接;android/iOS的webview播放b站视频完全没有这么多问题) 1、竖屏播放没问题 从一个竖屏页p1点击进入视频页p2,p2页仍为竖屏; p2页有一Web组件,…...
华为0507机试
题目二 建设基站 有一棵二叉树,每个节点上都住了一户居民。现在要给这棵树上的居民建设基站,每个基站只能覆盖她所在与相邻的节点,请问信号覆盖这棵树最少需要建设多少个基站 #include <bits/stdc.h> using namespace std;const int …...
apache2的默认html修改
使用127.0.0.1的时候,默认打开的是index.html,可以通过配置文件修改成我们想要的html vi /etc/apache2/mods-enabled/dir.conf <IfModule mod_dir.c>DirectoryIndex WS.html index.html index.cgi index.pl index.php index.xhtml index.htm <…...
EXCEL下拉菜单与交替上色设置
Excel/WPS 表格操作教程(双功能整合) 目录 功能一:交替行上色 Excel 操作WPS 操作 功能二:下拉菜单设置 Excel 操作WPS 操作 组合效果示例注意事项 功能一:交替行上色 Excel 操作 选中数据区域 拖动鼠标选择需要设置…...
list基础用法
list基础用法 1.list的访问就不能用下标[]了,用迭代器2.emplace_back()几乎是与push_back()用法一致,但也有差别3.insert(),erase()的用法4.reverse()5.排序6.合并7.unique()(去重)8.splice剪切再粘贴 1.list的访问就不能用下标[]了,用迭代器…...
鸿蒙PC版体验_画面超级流畅_具备terminal_无法安装windows、linux软件--纯血鸿蒙HarmonyOS5.0工作笔记017
鸿蒙NEXT和开源鸿蒙OpenHarmony现在已经开发实现统一,使用鸿蒙ArkTS开发的应用,可以直接 在开源鸿蒙上. 鸿蒙的terminal是使用的linux的语法,但是有很多命令,目前还不能使用,常用的ifconfig等是可以用的. 鸿蒙终于出来PC版了,虽然,不像Windows以及mac等,开放的命令那么多,但…...
Spring 集成 SM4(国密对称加密)
Spring 集成 SM4(国密对称加密)算法 主要用于保护敏感数据,如身份证、手机号、密码等。 下面是完整集成步骤(含工具类 使用示例),采用 Java 实现(可用于 Spring Boot)。 一、依赖引…...
deepseek梳理java高级开发工程师微服务面试题
Java微服务高级面试题与答案 一、微服务架构设计 1. 服务拆分原则 Q1:微服务拆分时有哪些核心原则?如何解决拆分后的分布式事务问题? 答案: 服务拆分五大原则: 1. 单一职责原则(SRP)- 每个…...
人事管理系统8
员工管理(分页查询、查看详情页、修改): 1. 分页查询 Staff.java 中加入部门名和岗位名两个属性以及对应的 get 和 set 方法。这两个属性没有数据库字段对应, 仅供前端显示用: private String departname; //部门名属…...
Stapi知识框架
一、Stapi 基础认知 1. 框架定位 自动化API开发框架:专注于快速生成RESTful API 约定优于配置:通过标准化约定减少样板代码 企业级应用支持:适合构建中大型API服务 代码生成导向:显著提升开发效率 2. 核心特性 自动CRUD端点…...
第三章 初始化配置(一)
我们首先介绍配置Logback的方法,并提供了许多示例配置脚本。在后面的章节中,我们将介绍Logback所依赖的配置框架Joran。 初始化配置 在应用程序代码中插入日志请求需要大量的规划和努力。观察表明,大约4%的代码用于记录。因此,即…...
WebGIS 开发中的数据安全与隐私保护:急需掌握的要点
在 WebGIS 开发中,数据安全与隐私保护是绝对不能忽视的问题!随着地理信息系统的广泛应用,越来越多的敏感数据被存储和传输,比如个人位置信息、企业地理资产等。一旦这些数据泄露,后果不堪设想。然而,很多开…...
C语言 ——— 函数栈帧的创建和销毁
目录 寄存器 mian 函数是被谁调用的 通过汇编了解函数栈帧的创建和销毁 转汇编后(Add函数之前的部分) 转汇编后(进入Add函数之前的部分) 转汇编后(正式进入Add函数的部分) 编辑 总结 局部变量…...
2025年真实面试问题汇总(二)
jdbc的事务是怎么开启的 在JDBC中,事务的管理是通过Connection对象控制的。以下是开启和管理事务的详细步骤: 1. 关闭自动提交模式 默认情况下,JDBC连接处于自动提交模式(auto-commit true),即每条SQL语…...
【用「概率思维」重新理解生活】
用「概率思维」重新理解生活:为什么你总想找的「确定答案」并不存在? 第1层:生活真相——所有结果都是「综合得分」 现象:我们总想找到“孩子生病是因为着凉”或“伴侣生气是因为那句话”的单一答案现实:每个结果背后…...
Redis——线程模型·
为什么Redis是单线程却仍能有10w/秒的吞吐量? 内存操作:Redis大部分操作都在内存中完成,并且采用了高效的数据结构,因此Redis的性能瓶颈可能是机器的内存或者带宽,而非CPU,既然CPU不是瓶颈,自然…...
APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)
APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)是一种基于供应链管理和约束理论的智能生产管理工具,旨在通过动态优化资源分配和生产流程,解决制造业中的复杂计划问题。以下是其核心要点解析&…...
首个窗口级无人机配送VLN系统!中科院LogisticsVLN:基于MLLM实现精准投递
导读 随着智能物流需求日益增长,特别是“最后一公里”配送场景的精细化,传统地面机器人逐渐暴露出适应性差、精度不足等瓶颈。为此,本文提出了LogisticsVLN系统——一个基于多模态大语言模型的无人机视觉语言导航框架,专为窗户级别…...
仓颉Magic亮相GOSIM AI Paris 2025:掀起开源AI框架新热潮
巴黎,2025年5月6日——由全球开源创新组织GOSIM联合CSDN、1ms.ai共同主办的 GOSIM AI Paris 2025 大会今日在法国巴黎盛大开幕。GOSIM 作为开源人工智能领域最具影响力的年度峰会之一,本届大会以“开放、协作、突破”为核心,汇聚了来自华为、…...
《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符数据类型(bytes 与 str)的差异
引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的总结与延伸。在 Python 编程中,字符串处理是几乎每个开发者都会频繁接触的基础操作。然而,Python 中的…...
windows 强行终止进程,根据端口号
步骤1:以管理员身份启动终端 右键点击开始菜单 → 选择 终端(管理员) 或 Windows PowerShell(管理员)。 步骤2:检测端口占用状态 # 查询指定端口(示例为1806) netst…...
PHP-FPM 调优配置建议
1、动态模式 pm dynamic; 最大子进程数(根据服务器内存调整) pm.max_children 100 //每个PHP-FPM进程大约占用30-50MB内存(ThinkPHP框架本身有一定内存开销)安全值:8GB内存 / 50MB ≈ 160,保守设置为100 ; 启动时创建的进程数&…...
我喜欢的vscode几个插件和主题
主题 Monokaione Monokai Python 语义高光支持 自定义颜色为 self 将 class , def 颜色更改为红色 为装饰器修复奇怪的颜色 适用于魔法功能的椂光 Python One Dark 这个主题只在python中效果最好。 我为我个人使用做了这个主题,但任何人都可以使用它。 插件 1.Pylance Pylanc…...