【数据结构-初阶】详解线性表(1)---顺序表 - 实践

news/2026/1/27 8:05:19/文章来源:https://www.cnblogs.com/tlnshuju/p/19536386

【数据结构-初阶】详解线性表(1)---顺序表 - 实践

2026-01-27 08:03  tlnshuju  阅读(0)  评论(0)    收藏  举报

主页传送门:良木生香

个人专栏:《C语言》《数据结构-初阶》《程序设计》

人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离

上期回顾:上一篇文章中(有兴趣的小伙伴可以看看上一篇文章:【数据结构-初阶】详解算法复杂度:时间与空间复杂度),我们已经学习了判断一个算法程序好与坏的方法:时间复杂度与空间复杂度,那么现在我们继续向下面学习数据结构的新知识:线性表中的顺序表


在介绍顺序表之前,我们先来了解线性表的概念

1.线性表

线性表(liner list)是由n个具有相同特性的数据元素组成的有限序列,其在生活中的运用非常广泛,常见的线性表有:顺序表,链表,栈,队列、字符串......线性表在逻辑上是连续的,但是在物理上不一定连续,线性表在物理上进行存储时,通常以数组或者链表结构的形式进行存储.

下面我们就来看看线性表之一的顺序表~~~

2.顺序表

2.1.顺序表的概念

顺序表使用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组进行存储.言外之意就是,顺序表的底层是数组.

既然都说了顺序表的底层是数组,那么顺序表和数组的区别又是什么呢?直接用数组不就行了吗?这是因为:顺序表的底层是数组,对数组进行了封装,实现了数组具有增删查改的功能,使得我们在对数据进行操作时更加高效.我们可以通过下面这张图进行深入理解顺序表与数组的关系:

通过这张图,相信大家对顺序表与数组的关系就有所了解了吧,那么下面我们就正式进入到顺序表的学习中

2.2顺序表的分类

顺序表一般被我们分成两类,一类是静态顺序表,另一类是动态顺序表

2.2.1静态顺序表

静态顺序表从名字还是那个就不难猜出,这类顺序表是的长度是相对固定的,使用的是定长数进行元素的存储,下面是静态顺序表的结构:

typedef int Elemtype;
#define N 10
typedef struct Sqlist {Elemtype arr[N];   //使用的是定长数组int length;        //这是记录当前数组中的有效数据个数
}Sqlist;

静态顺序表的开发与维护成本极低,但是有一个致命的缺陷就是,空间值N给小了不够用,大了浪费空间,不能实现"想要多少给多少"的功能,那么下面我们就来介绍他的孪生兄弟:动态顺序表

2.2.2动态顺序表

动态顺序表,顾名思义就是是可以实现内存的动态放缩,下面是动态顺序表的基本结构内容:

typedef int Elmetype;
typedef struct Sqlist {Elemtype* data;     //这里其实是数组(因为数组名就是数组首地址)int length;         //当前顺序表中的有效元素个数int size;           //当前顺序表的总长度
}Sqlist;

这样一来,对于动态顺序表而言,我们就能实现"想要多少给多少"的功能需求了,不会因为数组的固定长度而担忧了.

既然对明白了顺序表的基本结构,那我们现在就来对顺序表进行实现吧~~~

2.3顺序表的实现

在实现顺序表之前,我们要先将头文件写好:

#define _CRT_SECURE_NO_WARNINGS 520
#include
#include    //为了使用malloc、realloc函数
#include   //为了对指针进行断言操作
#include   //为了使用Slepp()函数,纯属个人喜好
#define INIT_SIZE 100    //预分配空间
#define INSERT_SIZE 200  //空间不够时要增加的空间
//现在将整形变量重命名为
typedef int Elemtype;    //为了便于以后修改数据类型

在对某个数据结构进行实现之前,我们都可以围绕四个大方向进行操作:增、删、查、改

2.3.1顺序表的初始化

不管对哪个数据结构,在进行操作之前都要记得对其进初始化哟~

void Init_Sqlist(Sqlist* pSqlist) {//为顺序表申请一个空间Elemtype* data = (Elemtype*)malloc(INIT_SIZE * sizeof(int));if (data == NULL){printf("空间申请失败,同时顺序表初始化失败!\n");return;}pSqlist->data = NULL;pSqlist->length = 0;pSqlist->size += INIT_SIZE;
}

初始化是对顺序表结构当中的三个结构元素进行初始化:

1.为data数组申请一块事先预定好的空间大小,将data指针指向这块空间;

2.将表中的元素个数置为0;

3.将表长设置为预先设定好的长度INIT_SIZE

2.3.2顺序表的插入操作

在顺序表中,对于插入操作我们有三种类型:头部插入,尾部插入,指定位置插入

2.3.2.1头部插入

头部插入操作,实现的是一个陷进去的元素排在最后,最后进去的元素排在第一个的功能,可以通过下面的步骤进行实现:

1.先对传进来的结构体指针进行判空(这是一个重要的操作,基本上每个操作之前都会用到,所以后面都是默认进行此操作)

2.判断当前顺序表的有效元素个数是否超过或者等于表长,如果是,那就重新申请空间

3.将当前顺序表中的元素全部向后移动一位,为表头提供容纳下一个数据的位置

4.将表头赋值上新的元素,记得将元素个数length+1

下面是具体的代码:

void Push_Front(Sqlist* pSqlist,Elemtype num) {//想要在头部插入数据2,就要先判断这个顺序表现在是否溢出://如果溢出,那就扩容assert(pSqlist);if (pSqlist->length >= pSqlist->size) {Elemtype* newbase = (Elemtype*)realloc(pSqlist->data, INSERT_SIZE * sizeof(Elemtype));if (newbase == NULL) {printf("新空间申请失败,无法进行头部操作...\n");return;}pSqlist->data = newbase;pSqlist->size = INSERT_SIZE;}for (int i = pSqlist->length-1; i >= 0; i--) {*(pSqlist->data + i + 1) = *(pSqlist->data + i);}*(pSqlist->data+0) = num;pSqlist->length++;
}

这里要注意的是,我们在向后移动元素的时候,习惯上从最后一个元素开始,如果从第一个元素开始的话,会将后面的元素覆盖:

2.3.2.2尾部插入

尾部插入相对于头部插入就简单了许多,只需要在顺序表的最尾部进行插入即可,可按照下面的步骤进行,详细代码如下:

//现在是尾部的插入
void Push_Back(Sqlist* pSqlist,Elemtype num) {//依旧判断assert(pSqlist);if (pSqlist->length >= pSqlist->size) {Elemtype* newbase = (Elemtype*)realloc(pSqlist->data, INSERT_SIZE * sizeof(Elemtype));if (newbase == NULL) {printf("空间申请失败,无法进行尾部操作...\n");return;}pSqlist->data = newbase;pSqlist->size += INSERT_SIZE;}*(pSqlist->data + pSqlist->length) = num;pSqlist->length++;   //一定要记得将顺序表中元素的个数进行+1操作,不然后面的操作会出问题!!
}
2.3.2.3指定位置pos插入

指定位置其实就相当于高级一点的头部插入,步骤与头部插入差不多,只不过是将头部的下标改成pos值而已,这里直接上代码

void Push_pos(Sqlist* pSqlist, Elemtype num,int pos) {assert(pSqlist);//先检查pos值:if (pos<0 || pos > pSqlist->length) {printf("pos值不合法...\n");return;}//再检查是否溢出if (pSqlist->length >= pSqlist->size) {Elemtype* newbase = (Elemtype*)realloc(pSqlist->data, INSERT_SIZE * sizeof(Elemtype));if (newbase == NULL) {printf("申请空间失败,无法进行pos位置插入的相关操作...\n");return;}}//将pos位置后面的元素向后面移动for (int i = pSqlist->length - 1; i >= pos; i--) {*(pSqlist->data + i + 1) = *(pSqlist->data + i);}*(pSqlist->data + pos) = num;pSqlist->length++;
}

插入讲完了,那我们现在来讲讲删除操作

2.3.3顺序表的删除操作

删除操作与插入操作一样,也分为头部删除,尾部删除,指定位置pos删除

2.3.3.1头部删除

头部删除,不用想的太复杂,我们只需要将后面的数据元素向前移动一位,把第一个数据元素覆盖掉就行,再将有效数据个数进行-1操作即可,下面是代码:

void Pop_Front(Sqlist* pSqlist) {assert(pSqlist);for (int i = 0; i < pSqlist->length; i++) {*(pSqlist->data + i) = *(pSqlist->data + i + 1);}pSqlist->length--;
}

覆盖操作的话我们可以从第一个元素开始,将后面的数据元素往前"拉".

2.3.3.2尾部删除

尾部删除比头部删除更加简单,因为pSqlist->length记录的是顺序表中有效的元素个数,我们只用将这个变量-1就行,不需要过多的操作:

void Pop_Back(Sqlist* pSqlist) {pSqlist->length--;
}

这样我们就完成了尾部删除的操作

2.3.3.3指定位置pos删除

指定位置pos删除与头部删除相似,是将pos位置之后的数据元素全部向前移动一位,再将pSqlist->length-1即可

//现在是pos位置删除
void Pop_pos(Sqlist* pSqlist, int pos) {assert(pSqlist);for (int i = pos; i < pSqlist->length; i++) {*(pSqlist->data + i-1) = *(pSqlist->data + i);}pSqlist->length--;
}

在这里我们为了与现实逻辑一样,我们就认为输入的pos是从1开始,但实际上在顺序表中,是从0开始,所以在这里我们要将pos-1,让下标逻辑与顺序表中相同

2.3.4顺序表的查找

想要在顺序表中实现查找某个元素的功能,我们常用的就是遍历,当然,如果这个顺序表是有序的话,那我们可以使用二分查找法,这样会快很多,先买你是普通遍历查找的代码:

//现在是查找元素
void Search_elem(Sqlist* pSqlist,Elemtype num) {int flag = 0;for (int i = 0; i < pSqlist->length; i++){if (*(pSqlist->data + i) == num) {printf("找到了\n");flag = 1;break;}}if(flag ==0) {printf("找不到哦\n");}
}

想要输出这个元素在顺序表中的位置,只用将i的值一起输出即可

2.3.5顺序表的修改

我们来到了最后一个操作---修改,对于这个操作我们要传入你想要修改的位置pos以及修改之后的数据值,要先判断pos值是否合理,再将pos位置的值直接修改即可,代码如下:

//现在是修改元素
void Change_num(Sqlist* pSqlist,Elemtype num,int pos) {assert(pSqlist);if (pos<0 || pos>pSqlist->length) {printf("pos不合法,无法查找\n");return;}*(pSqlist->data + pos) = num;Sleep(1000);printf("pos位置的值已经修改成%d\n",num);Sleep(2000);
}

2.3.6顺序表的打印

打印顺序表,我们只用将顺序表进行遍历,输出每个元素的值即可

//现在是打印顺序表函数
void my_printf(Sqlist* pSqlist) {assert(pSqlist);for (int i = 0; i < pSqlist->length; i++) {printf("%d ", *(pSqlist->data + i));}
}

2.3.7顺序表的销毁操作

在进行完一系列操作之后,我们要将顺序表手动进行销毁,不要让他一直占用内存空间.我们只用将指向数组的指针data置为空即可:

void Destory_Sqlist(Sqlist* pSqlist) {assert(pSqlist);free(pSqlist->data);pSqlist->data = NULL;
}

以上就是实现顺序表基本功能的全部代码了,但还是缺少主函数,下面我就进行个汇总吧,有兴趣的小伙伴可以看看,嘿嘿~~~

3.代码总和

#define _CRT_SECURE_NO_WARNINGS 520
#include
#include
#include
#include
#define INIT_SIZE 100
#define INSERT_SIZE 200
//现在将整形变量重命名为
typedef int Elemtype;
//现在定义顺序表结构体
typedef struct SqList {Elemtype* data;int length;int size;
}Sqlist;
//现在对顺序表进行初始化:
void Init_Sqlist(Sqlist* pSqlist) {//为顺序表申请一个空间Elemtype* data = (Elemtype*)malloc(INIT_SIZE * sizeof(int));if (data == NULL){printf("空间申请失败,同时顺序表初始化失败!\n");return;}pSqlist->data = NULL;pSqlist->length = 0;pSqlist->size += INIT_SIZE;
}
//对顺序表有以下操作:插入,删除,查找,修改
//插入:头插,尾插,pos位置
//删除:头删,尾删,pos位置
//查找:
//修改
//现在对顺序表进行增加操作:头插
void Push_Front(Sqlist* pSqlist,Elemtype num) {//想要在头部插入数据2,就要先判断这个顺序表现在是否溢出://如果溢出,那就扩容assert(pSqlist);if (pSqlist->length >= pSqlist->size) {Elemtype* newbase = (Elemtype*)realloc(pSqlist->data, INSERT_SIZE * sizeof(Elemtype));if (newbase == NULL) {printf("新空间申请失败,无法进行头部操作...\n");return;}pSqlist->data = newbase;pSqlist->size = INSERT_SIZE;}for (int i = pSqlist->length-1; i >= 0; i--) {*(pSqlist->data + i + 1) = *(pSqlist->data + i);}*(pSqlist->data+0) = num;pSqlist->length++;
}
//现在是尾部的插入
void Push_Back(Sqlist* pSqlist,Elemtype num) {//依旧判断assert(pSqlist);if (pSqlist->length >= pSqlist->size) {Elemtype* newbase = (Elemtype*)realloc(pSqlist->data, INSERT_SIZE * sizeof(Elemtype));if (newbase == NULL) {printf("空间申请失败,无法进行尾部操作...\n");return;}pSqlist->data = newbase;pSqlist->size += INSERT_SIZE;}*(pSqlist->data + pSqlist->length) = num;pSqlist->length++;
}
//现在是pos位置的插入:
void Push_pos(Sqlist* pSqlist, Elemtype num,int pos) {assert(pSqlist);//先检查pos值:if (pos<0 || pos > pSqlist->length) {printf("pos值不合法...\n");return;}//再检查是否溢出if (pSqlist->length >= pSqlist->size) {Elemtype* newbase = (Elemtype*)realloc(pSqlist->data, INSERT_SIZE * sizeof(Elemtype));if (newbase == NULL) {printf("申请空间失败,无法进行pos位置插入的相关操作...\n");return;}}//将pos位置后面的元素向后面移动for (int i = pSqlist->length - 1; i >= pos; i--) {*(pSqlist->data + i + 1) = *(pSqlist->data + i);}*(pSqlist->data + pos) = num;pSqlist->length++;
}
//现在是删除操作:头删
void Pop_Front(Sqlist* pSqlist) {assert(pSqlist);for (int i = 0; i < pSqlist->length; i++) {*(pSqlist->data + i) = *(pSqlist->data + i + 1);}pSqlist->length--;
}
//现在是尾删
void Pop_Back(Sqlist* pSqlist) {pSqlist->length--;
}
//现在是pos位置删除
void Pop_pos(Sqlist* pSqlist, int pos) {assert(pSqlist);for (int i = pos; i < pSqlist->length; i++) {*(pSqlist->data + i-1) = *(pSqlist->data + i);}pSqlist->length--;
}
//现在是查找元素
void Search_elem(Sqlist* pSqlist,Elemtype num) {int flag = 0;for (int i = 0; i < pSqlist->length; i++){if (*(pSqlist->data + i) == num) {printf("找到了\n");flag = 1;break;}}if(flag ==0) {printf("找不到哦\n");}
}
//现在是修改元素
void Change_num(Sqlist* pSqlist,Elemtype num,int pos) {assert(pSqlist);if (pos<0 || pos>pSqlist->length) {printf("pos不合法,无法查找\n");return;}*(pSqlist->data + pos) = num;Sleep(1000);printf("pos位置的值已经修改成%d\n",num);Sleep(2000);
}
//现在是打印顺序表函数
void my_printf(Sqlist* pSqlist) {assert(pSqlist);for (int i = 0; i < pSqlist->length; i++) {printf("%d ", *(pSqlist->data + i));}
}
void Destory_Sqlist(Sqlist* pSqlist) {assert(pSqlist);free(pSqlist->data);pSqlist->data = NULL;
}
//现在是打印菜单函数
void printf_menu() {printf("=============================\n");printf("你可以进行以下操作:\n");printf("1.头插	2.尾插	3.pos位置插\n");printf("4.头删	5.尾删	6.pos位置删\n");printf("7.查找元素	8.修改元素\n");printf("=============================\n");printf("\n");
}
//现在是主函数
int main() {Sqlist L;Sqlist* pSqlist = &L;Init_Sqlist(pSqlist);int choose = 0;do {system("cls");printf_menu();printf("当前的顺序表为:\n");my_printf(pSqlist);printf("\n");printf("请输入你的选择(按-1结束程序):\n");//int choose = 0;scanf("%d", &choose);if (choose == -1) {break;}switch(choose) {case 1:{printf("请输入你想输入的元素个数:\n");int num_num = 0;scanf("%d", &num_num);printf("请输入你想要插入的元素:\n");Elemtype num;for (int i = 0; i < num_num; i++) {scanf("%d", &num);Push_Front(pSqlist, num);}Sleep(1000);printf("插入成功!!!\n");Sleep(2000);break;}case 2: {printf("请输入你想输入的元素个数:\n");int num_num = 0;scanf("%d", &num_num);printf("请输入你想要插入的元素:\n");Elemtype num;for (int i = 0; i < num_num; i++) {scanf("%d", &num);Push_Back(pSqlist, num);}Sleep(1000);printf("插入成功!!!\n");Sleep(2000);break;}case 3:{printf("请输入你想要输入的位置:\n");int pos = 0;scanf("%d", &pos);printf("请输入你想要输入的元素:\n");Elemtype num = 0;scanf("%d", &num);Push_pos(pSqlist, num, pos);Sleep(1000);printf("插入成功!!!\n");Sleep(2000);break;}case 4: {Pop_Front(pSqlist);Sleep(1000);printf("删除成功!!!\n");Sleep(2000);break;}case 5: {Pop_Back(pSqlist);Sleep(1000);printf("删除成功!!!\n");Sleep(2000);break;}case 6: {printf("请输入你想要删除的位置:\n");int pos = 0;scanf("%d", &pos);Pop_pos(pSqlist, pos);Sleep(1000);printf("删除成功!!!\n");Sleep(2000);break;}case 7: {printf("请输入你想要查找的元素:\n");Elemtype num;scanf('%d', &num);Search_elem(pSqlist, num);Sleep(1000);printf("查找完成!!!\n");Sleep(2000);break;}case 8: {printf("请输入你想要修改的位置:\n");int pos = 0;scanf("%d", &pos);printf("请输入你想要修改成的元素:\n");Elemtype num = 0;scanf("%d", &num);Change_num(pSqlist, num, pos);Sleep(1000);printf("修改成功!!!\n");Sleep(2000);break;}default: {printf("choose的值不合法,请重新输入!!!\n");break;}}}while (choose != -1);//最后释放内存Destory_Sqlist(pSqlist);return 0;
}

以上就是我对线性表之一的顺序表的全部分享内容了,有不对的地方希望大佬们指出来~~~

文章是自己写的哈,有啥描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读。

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

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

相关文章

完整教程:Vue3组件间通信——pinia

完整教程:Vue3组件间通信——piniapre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

超越CRUD:构建高性能、可测试的FastAPI应用架构深度解析

好的&#xff0c;收到您的需求。结合随机种子 1769472000072 所激发的一点“非典型”灵感&#xff0c;我将为您撰写一篇聚焦于 FastAPI 高级依赖注入、架构模式及性能深度考量 的技术文章&#xff0c;避免简单的“Hello World”式教程&#xff0c;力求为资深开发者提供架构层面…

小白必看:YOLOv9官方版镜像保姆级入门教程

小白必看&#xff1a;YOLOv9官方版镜像保姆级入门教程 你是不是也经历过这些时刻&#xff1f; 下载完YOLOv9代码&#xff0c;配环境配到凌晨三点&#xff0c;CUDA版本对不上、PyTorch和torchvision版本打架、OpenCV编译失败……最后连一张图片都跑不起来。 或者好不容易装好了…

Keil5添加文件项目应用:在STM32中添加驱动文件

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI生成痕迹&#xff0c;采用真实嵌入式工程师口吻撰写&#xff0c;逻辑更自然、节奏更紧凑、语言更具实操感和教学温度&#xff1b;同时严格遵循您提出的全部格式与风格要求&#xff08;…

语音识别卡顿?Fun-ASR内存优化实用建议

语音识别卡顿&#xff1f;Fun-ASR内存优化实用建议 你是否在使用 Fun-ASR WebUI 时遇到过这些情况&#xff1a; 点击“开始识别”后界面卡住三秒才响应&#xff1f; 批量处理20个音频文件时&#xff0c;GPU显存突然爆满&#xff0c;页面直接报错“CUDA out of memory”&#x…

Qwen2.5-1.5B开源大模型:适配Intel Arc GPU(Arc A770)的oneAPI部署尝试

Qwen2.5-1.5B开源大模型&#xff1a;适配Intel Arc GPU&#xff08;Arc A770&#xff09;的oneAPI部署尝试 1. 为什么是Qwen2.5-1.5B&#xff1f;轻量、本地、可控的对话起点 你有没有试过这样的场景&#xff1a;想用一个AI助手写点文案&#xff0c;查点资料&#xff0c;或者…

Proteus使用教程:多模块C51联合仿真方案

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。整体风格已全面转向 资深嵌入式工程师第一人称实战分享口吻 &#xff0c;去除所有模板化表达、AI腔调和空泛总结&#xff0c;强化真实开发语境下的技术判断、踩坑经验与工程权衡思考。全文逻辑更紧凑、语言…

GEO推广源头厂家哪家靠谱?哪家口碑好?

如今,越来越多的企业意识到AI信息入口的重要性,想要通过GEO推广在豆包、DeepSeek、腾讯元宝等AI平台获取精准流量,却常被如何找到专业且稳健的合作方怎么判断GEO推广源头厂家的服务质量等问题困扰。接下来,我们就围…

在深渊前绘制草图:论AI元人文作为数字文明的养护性操作系统

在深渊前绘制草图:论AI元人文作为数字文明的养护性操作系统 摘要 本文系统性地构建并阐释了独立研究者岐金兰所提出的“AI元人文”理论体系,将其定位为应对人工智能时代全球治理根本性困境的一场“范式革命-操作系统…

mcp-cli 轻量级mcp server 交互的cli 工具

mcp-cli 轻量级mcp server 交互的cli 工具mcp-cli 轻量级mcp server 交互的cli 工具 包含的特性轻量启动快 单一文件,基于bun开发的,可以打包位执行程序 shell 友好 agnent 优化,有利于ai code agent 通用,支持htt…

地址层级混乱?MGeo帮你理清省市区关系

地址层级混乱&#xff1f;MGeo帮你理清省市区关系 1. 为什么“北京朝阳”和“北京市朝阳区”其实是同一个地方&#xff1f; 你有没有遇到过这样的情况&#xff1a;用户注册时填的是“上海浦东”&#xff0c;订单地址写的是“上海市浦东新区张江路123号”&#xff0c;而物流系…

RexUniNLU中文NLP系统实操:微信公众号文章标题+正文联合分析范式

RexUniNLU中文NLP系统实操&#xff1a;微信公众号文章标题正文联合分析范式 1. 为什么需要“标题正文”联合分析&#xff1f; 你有没有遇到过这样的情况&#xff1a;运营同事发来一篇微信公众号推文&#xff0c;让你快速判断这篇文章的核心调性、潜在风险点和传播价值&#x…

StructBERT开源镜像免配置部署:ARM架构服务器兼容性验证与部署指南

StructBERT开源镜像免配置部署&#xff1a;ARM架构服务器兼容性验证与部署指南 1. 为什么你需要一个真正懂中文语义的本地工具&#xff1f; 你有没有遇到过这样的问题&#xff1a; 输入“苹果手机续航差”和“香蕉富含钾元素”&#xff0c;系统却返回0.68的相似度&#xff1f…

Keil5下C程序开发的补全增强技巧实战案例

以下是对您提供的博文内容进行 深度润色与工程化重构后的终稿 。全文已彻底去除AI生成痕迹&#xff0c;采用真实嵌入式工程师口吻写作&#xff0c;逻辑更紧凑、语言更精炼、技术细节更扎实&#xff0c;同时强化了“人在开发一线”的现场感和问题驱动意识。所有模块均有机融合…

Qwen3-Embedding-4B效果展示:向量数值分布图揭示语义编码的稀疏特性

Qwen3-Embedding-4B效果展示&#xff1a;向量数值分布图揭示语义编码的稀疏特性 1. 什么是Qwen3-Embedding-4B&#xff1f;它不是“另一个文本生成模型” 很多人第一次看到Qwen3-Embedding-4B这个名字&#xff0c;下意识会想&#xff1a;“这又是一个能写文章、编代码的大语言…

ChatGLM-6B在企业客服中的应用:智能问答落地案例

ChatGLM-6B在企业客服中的应用&#xff1a;智能问答落地案例 1. 为什么企业客服需要一个“会思考”的助手&#xff1f; 你有没有遇到过这样的场景&#xff1a;客户在深夜发来一条“订单号123456的物流怎么还没更新&#xff1f;”&#xff0c;客服人员刚下班&#xff0c;系统只…

CosyVoice-300M Lite新闻播报应用:自动化生成部署案例

CosyVoice-300M Lite新闻播报应用&#xff1a;自动化生成部署案例 1. 为什么新闻团队开始用这个“小个子”语音引擎&#xff1f; 你有没有见过这样的场景&#xff1a;凌晨三点&#xff0c;编辑部还在赶早间新闻稿&#xff1b;短视频团队刚收到突发快讯&#xff0c;却卡在配音…

DeepSeek-R1-Distill-Qwen-1.5B与Llama3对比:边缘设备推理速度评测

DeepSeek-R1-Distill-Qwen-1.5B与Llama3对比&#xff1a;边缘设备推理速度评测 在轻量级大模型落地的实践中&#xff0c;我们常常面临一个现实问题&#xff1a;同样标称1.5B参数的模型&#xff0c;实际跑在T4、RTX 3060甚至Jetson Orin这类边缘设备上&#xff0c;响应速度可能…

利用STM32定时器实现七段数码管动态显示数字

以下是对您提供的博文内容进行 深度润色与结构优化后的版本 。我以一位有十年嵌入式开发经验、长期深耕工业人机交互领域的工程师视角&#xff0c;重写了全文—— 去AI感、强实践性、逻辑更自然、语言更凝练有力 &#xff0c;同时强化了技术细节的“人话解释”和真实项目中…

推理速度快,企业级应用稳定可靠

推理速度快&#xff0c;企业级应用稳定可靠 1. 为什么“快”和“稳”在图像抠图中如此关键 你有没有遇到过这样的场景&#xff1a; 电商运营团队凌晨三点还在手动抠图&#xff0c;为明天上新的200款商品准备白底图&#xff1b; 设计部门收到市场部发来的50张人像素材&#xf…