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

【数据结构】顺序表(附源码)

数据结构之顺序表

  • 1、线性表
  • 2、顺序表
    • 2.1 概念与结构
    • 2.2 顺序表的分类
  • 3、动态顺序表
    • 3.1 结构
    • 3.2 初始化
    • 3.3 容量检查
    • 3.4 尾部插入数据
    • 3.5 删除尾部数据
    • 3.6 头部插入数据
    • 3.7 头部删除数据
    • 3.8 任意位置pos插入数据
    • 3.9 任意位置pos删除数据
    • 3.10 查找
  • 4、动态顺序表实现的源码

1、线性表

首先,在讲解顺序表之前呢,我们首先了解一下线性表,我们本期博客要讲解的顺序表就属于线性表。
定义线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

2、顺序表

2.1 概念与结构

概念顺序表是用一段物理地址连续的储存单元依次存储数据元素的线性结构,一般情况下采用数组存储。
结构
在这里插入图片描述

2.2 顺序表的分类

既然顺序表一般是用数组来实现的,那我们知道数组分为在初始化时长度固定的数组,和用动态内存开辟出的长度可变的数组两种类型,顺序表也自然而然存在两种。
顺序表又分为静态顺序表动态顺序表

静态顺序表就是使用定长数组储存元素的顺序表,它有很明显的缺陷,就是空间给少了不够用,空间给多了造成空间浪费。

所以我们本篇博客着重讲解动态顺序表!

3、动态顺序表

动态顺序表的开辟首先要定义结构体。
上面提到动态顺序表是用动态开辟的数组来储存数据的,那为什么我们不直接动态开辟一个数组来储存数据,而要先定义一个结构体呢?我们实现顺序表不只是拿顺序表动态开辟一个空间,我们还要用顺序表进行一系列操作,例如插入数据、删除数据、查找数据、修改数据等等,我们需要知道储存的元素个数size,还要知道顺序表目前的空间大小capacity,才能进行这些操作。它们之间的联系如下图
在这里插入图片描述

3.1 结构

//定义动态顺序表的结构
typedef int SLDataType;//取别名
typedef struct SeqList
{SLDataType* arr;int size;      //有效数据个数int capacity;  //空间容量
}SL;

上面的代码部分就是我封装的顺序表,我们可以看到在结构体中定义了一个未初始化的数组、未初始化的两个变量。
在代码中我还把 int 命名成了 SLDataType ,为什么要这样命名呢?
这是因为数组类型有很多种类,int 、char 等等,当我们有这样一个取别名的过程,到时候要修改时就可以将int改成你想要的类型,实现一键修改,省去了很多不必要的麻烦。

3.2 初始化

void SLInit(SL* ps)//初始化
{assert(ps);//判断是不是NULLps->arr = (SLDataType*)malloc(4 * sizeof(SLDataType));if (ps->arr == NULL){perror("malloc");//报出错误信息return 1;}ps->size = 0;ps->capacity = 4;
}

注意:定义完成这个函数后,形参用指针接收,所以在传参时要传结构体类型的地址,不能传递实参。

3.3 容量检查

我们在向数组增添数据或者插入数据的时候,总需要检查空间容量capacity是否足够,如果不够的话,需要进行扩容,顺序表也是一样。

void SLCheckCapacity(SL* ps)//检查容量
{assert(ps);//判断是不是NULLif (ps->size == ps->capacity){SLDataType newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return 1;}ps->arr = tmp;ps->capacity *= 2;}
}

之后的代码在检查容量的时候,我们就直接可以使用函数SLCheckCapacity
realloc函数是扩容函数,有关它的用法如果忘了的兄弟可以看看我之前发布的博客:【C语言】动态内存管理

3.4 尾部插入数据

void SLPushBack(SL* ps, SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);//进行容量检查ps->arr[ps->size] = x;ps->size++;
}

我们这里就直接使用到了SLCheckCapacity函数,检查容量是不是满了,size是数据个数,同时也表示顺序表最后一个元素后一个位置的下标,成功插入后,有效数据个数size要加1。
示例

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPushBack(&pa, 4);SLPushBack(&pa, 5);SLPrint(&pa);
}int main()
{test1();return 0;
}

我刚才写的函数都在SeqList.c中,在博客最后我会公布源码其中SLPrint是设计的打印函数,这里就不再展示,源码在博客末尾。
运行结果
在这里插入图片描述

3.5 删除尾部数据

void SLPopBack(SL* ps)//尾删
{assert(ps->size);//判断数据个数是否为0ps->size--;
}

在删除尾部数据的时候,我们只需要将存储的元素个数size减1即可,当再次在尾部增添数据时,新数据会把原来的数据覆盖掉,不影响顺序表的操作。
示例:

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPushBack(&pa, 4);SLPushBack(&pa, 5);SLPrint(&pa);SLPopBack(&pa);SLPopBack(&pa);SLPopBack(&pa);SLPrint(&pa);
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

3.6 头部插入数据

void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);SLCheckCapacity(ps);//检查容量for (int i = ps->size;i > 0;i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}

头插先检查容量,然后,将原顺序表中的元素依次向后挪动一位,最后进行插入,再将储存的数据容量size加1即可。
示例

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPrint(&pa);SLPushFront(&pa, -1);SLPushFront(&pa, -2);SLPrint(&pa);
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

3.7 头部删除数据

void SLPopFrant(SL* ps)//头删
{assert(ps && ps->size);for (int i = 0;i < ps->size - 1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

头删只需要判断一下储存的数据个数size大于0,之后从第二个元素开始把后面的元素都往前移,储存的数据个数size减一即可。
示例

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPrint(&pa);SLPopFrant(&pa);SLPopFrant(&pa);SLPrint(&pa);
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

3.8 任意位置pos插入数据

void SLInsert(SL* ps, int pos, SLDataType x)//在pos位置插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size;i > pos;i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

只需要判断一下,无误后将pos位置即之后的元素整体后移一位,最后size加1即可。
示例

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPrint(&pa);SLInsert(&pa, 2, 15);SLInsert(&pa, 2, 35);SLPrint(&pa);
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

3.9 任意位置pos删除数据

void SLErase(SL* ps, int pos)//删除pos位置数据
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = pos;i < ps->size - 1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

判断无误后,将pos+1位置即之后元素前移,最后size减一即可。
示例

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPrint(&pa);SLInsert(&pa, 2, 15);SLInsert(&pa, 2, 35);SLPrint(&pa);SLErase(&pa, 1);SLErase(&pa, 2);SLPrint(&pa);
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

3.10 查找

int SLFind(SL* ps, SLDataType x)//查找
{assert(ps);for (int i = 0;i < ps->size;i++){if (ps->arr[i] == x){return i;}}return -1;
}

示例:

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPrint(&pa);SLInsert(&pa, 2, 15);SLInsert(&pa, 2, 35);SLPrint(&pa);SLErase(&pa, 1);SLErase(&pa, 2);SLPrint(&pa);int h = SLFind(&pa, 15);if (h != -1){printf("找到了\n");}else printf("没找到\n");
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

4、动态顺序表实现的源码

SeqList.h

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>//定义动态顺序表的结构
typedef int SLDataType;//取别名
typedef struct SeqList
{SLDataType* arr;int size;      //有效数据个数int capacity;  //空间容量
}SL;//初始化
void SLInit(SL* ps);//检查空间容量
void SLCheckCapacity(SL* ps);//打印
void SLPrint(SL* ps);//尾插
void SLPushBack(SL* ps, SLDataType x);//尾删
void SLPopBack(SL* ps);//头插
void SLPushFront(SL* ps, SLDataType x);//头删
void SLPopFrant(SL* ps);//在pos位置插入
void SLInsert(SL* ps, int pos, SLDataType x);//删除pos位置的数据
void SLErase(SL* ps, int pos);//查找
int SLFind(SL* ps, SLDataType x);

SeqList.c

#include "SeqList.h"void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}void SLPrint(SL* ps)
{assert(ps);int i = 0;for (i = 0;i < ps->size;i++){printf("%d ", ps->arr[i]);}printf("\n");
}void SLCheckCapacity(SL* ps)//检查容量
{assert(ps);//判断是不是NULLif (ps->size == ps->capacity){SLDataType newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return 1;}ps->arr = tmp;ps->capacity *= 2;}
}void SLPushBack(SL* ps, SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);//进行容量检查ps->arr[ps->size] = x;ps->size++;
}void SLPopBack(SL* ps)//尾删
{assert(ps->size);//判断数据个数是否为0ps->size--;
}void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);SLCheckCapacity(ps);//检查容量for (int i = ps->size;i > 0;i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}void SLPopFrant(SL* ps)//头删
{assert(ps && ps->size);for (int i = 0;i < ps->size - 1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}void SLInsert(SL* ps, int pos, SLDataType x)//在pos位置插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size;i > pos;i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)//删除pos位置数据
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = pos;i < ps->size - 1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}int SLFind(SL* ps, SLDataType x)//查找
{assert(ps);for (int i = 0;i < ps->size;i++){if (ps->arr[i] == x){return i;}}return -1;
}

test.c:

#include "SeqList.h"void test1()
{SL pa;SLInit(&pa);//初始化SLPushBack(&pa, 1);//尾部插入数据SLPushBack(&pa, 2);SLPushBack(&pa, 3);SLPrint(&pa);SLInsert(&pa, 2, 15);SLInsert(&pa, 2, 35);SLPrint(&pa);SLErase(&pa, 1);SLErase(&pa, 2);SLPrint(&pa);int h = SLFind(&pa, 15);if (h != -1){printf("找到了\n");}else printf("没找到\n");
}int main()
{test1();return 0;
}

总结:
以上就是本期博客分享的全部内容啦!技术的探索永无止境。
道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~

相关文章:

【数据结构】顺序表(附源码)

数据结构之顺序表 1、线性表2、顺序表2.1 概念与结构2.2 顺序表的分类 3、动态顺序表3.1 结构3.2 初始化3.3 容量检查3.4 尾部插入数据3.5 删除尾部数据3.6 头部插入数据3.7 头部删除数据3.8 任意位置pos插入数据3.9 任意位置pos删除数据3.10 查找 4、动态顺序表实现的源码 1、…...

java使用Apache POI 操作word文档

项目背景&#xff1a; 当我们对一些word文档&#xff08;该文档包含很多的标题比如 1.1 &#xff0c;1.2 &#xff0c; 1.2.1.1&#xff0c; 1.2.2.3&#xff09;当我们删除其中一项或者几项时&#xff0c;需要手动的对后续的进行补充。该功能主要是对标题进行自动的补充。 具…...

【Linux网络编程】网络基础

目录 1、OSI分层思想2、数据的封装3、ip地址ipv4的ip地址分类&#xff1a;为什么这样划分&#xff1f;举例 4、端口号5、tcp三次握手为什么需要三次握手&#xff1f;tcp连接的标识为什么 IP 地址不能单独标识一条连接&#xff1f; 6、tcp四次挥手为什么需要四次挥手为什么需要三…...

国内首家,百度智能云千帆AppBuilder全面兼容MCP协议

百度智能云千帆 AppBuilder 已兼容 MCP 协议&#xff01;作为国内首家支持 MCP 协议的大模型应用开发平台&#xff08;Claude、LangGraph、Cursor、Cline、N8N等海外平台已支持&#xff09;&#xff0c;千帆 AppBuilder 完成兼容后&#xff0c;用户可通过千帆 AppBuilder 轻松调…...

eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true

eclipse虚拟机内存监控设置SHOW_MEMORY_MONITORtrue D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.ui.prefs (文件比较多&#xff0c;别找错了&#xff09; SHOW_MEMORY_MONITORtrue 重启 -xms 1024…...

k8s中的组件

1.namespace Namespace 用于将集群资源划分为不同的逻辑组&#xff0c;方便管理和隔离 kubectl get namespace 查看所有逻辑组 kubectl describe namespace <namespace-name> 查看某个逻辑组信息详情 kubectl create namespace ... 创建逻辑组 kubectl delete names…...

单目3d detection算法记录

1、centernet object as points 这篇文章的核心单目3d检测主要是利用中心点直接回归出3d模型的所有属性&#xff0c;head共享整个backbone&#xff0c;其中3d属性包括&#xff1a;2d目标中心点、2dw和h、2d offsets、3doffsets、3d dimmession、rot还有depth。 其中对应的dep…...

vue3二次封装tooltip实现el-table中的show-overflow-tooltip效果

开发过程中遇到需要根据后端返回的数据长度来判断是否需要使用el-tooltip的情况&#xff0c;想到el-table里面就有这种交互效果&#xff0c;如果不论文字是否超出容器长度都展示tooltip的话&#xff0c;交互效果难免会差很多&#xff0c;所以二次封装了这个组件&#xff1a; 给…...

STM32八股【1】-----启动流程和startup文件理解

启动流程 知识点 MCU 上电复位。MSP从向量表第0个地址读取一个32位&#xff08;2字节&#xff09;的值并保存&#xff0c;该值为栈顶地址。PC计数器从第1个地址读取一个两字节的值并保存&#xff0c;该值为程序入口&#xff0c;一般是Reset_Handler。想了解FLASH地址映射可以…...

Go语言中package的使用规则《二》

在 Go 语言中&#xff0c;包&#xff08;Package&#xff09; 是代码组织和复用的核心单元。以下是其定义、引用规则及使用习惯的详细说明&#xff1a; 一、包的定义规则 目录与包名 一个包对应一个目录&#xff08;文件夹&#xff09;&#xff0c;目录名通常与包名一致。 包名…...

初级:控制流程面试题精讲

一、引言 在Java开发中&#xff0c;控制流程语句是构建程序逻辑的基础。面试官通过相关问题考察候选人对if-else、switch、循环等语句的理解和运用能力&#xff0c;以及在复杂业务场景下合理选择控制流程语句的水平。本文将深入剖析常见的控制流程面试题&#xff0c;结合实际开…...

HTTP 失败重试(重发)方案

在 Qt 网络开发中&#xff0c;使用 QNetworkAccessManager 进行 HTTP 请求时&#xff0c;可能会遇到网络超时、服务器错误等情况。为了提高请求的可靠性&#xff0c;可以实现 HTTP 失败重试&#xff08;重发&#xff09; 机制。下面介绍几种常见的 失败重发方案&#xff1a; 单…...

TNNLS 2024 | 基于残差超密集网络的高光谱图像空间光谱融合方法

A Spatio-Spectral Fusion Method for Hyperspectral Images Using Residual Hyper-Dense Network IEEE Transactions on Neural Networks and Learning Systems 2024 这篇文章的研究背景是针对高光谱图像&#xff08;HS&#xff09;与全色图像&#xff08;PAN&#xff09;的…...

深入探究 JVM 堆的垃圾回收机制(二)— 回收

GC Roots 枚举需要遍历整个应用程序的上下文&#xff0c;而在进行可达性分析或者垃圾回收时&#xff0c;如果我们还是进行全堆扫描及收集&#xff0c;那么会非常耗时。JVM 将堆分为新生代及老生代&#xff0c;它们的回收频率及算法不一样。 1 回收算法 在进行可达性分析时&am…...

【ELK】节省存储 之 压缩存储方式调整

目录 集群版本&#xff1a; 7.17.6 解释几个概念&#xff1a; 段&#xff08;Segment&#xff09; 合并(Merge) 索引设置&#xff1a; 压缩方式(index.codec)&#xff1a; 测试设置前提条件 对比 在创建的时候指定压缩类型&#xff08;index.codec&#xff09; 对比 在…...

MATLAB 控制系统设计与仿真 - 26

状态空间控制系统概述 状态空间描述 现代控制理论是建立在状态空间基础上的控制系统分析和设计理论&#xff0c;它用状态变量来刻画系统的内部特征&#xff0c;用‘一节微分方程组’来描述系统的动态特性。系统的状态空间模型描述了系统输入/输出与内部状态之间的关系&#x…...

下载与快速上手 NVM:Node.js 版本管理工具

一、准备工作&#xff1a;卸载旧版 Node.js 重要提示&#xff1a;在安装 NVM 前&#xff0c;请先彻底删除已安装的 Node.js&#xff0c;避免路径冲突&#xff1a; 检查安装路径 bash where node常见路径&#xff1a; C:\Program Files\nodejs\C:\Users\用户名\AppData\Local\n…...

SQL Server Management Studio(SSMS)安装教程

目录 一、SSMS的下载 二、SSMS 的安装 三、连接服务器 四、卸载 SSMS 一、SSMS的下载 1.进入 SQL Server Management Studio 官方下载页面&#xff1a;SQL Server Management Studio点击进入下载页面 2.点击链接开始下载&#xff0c;浏览器右上角会显示下载进度&#xff1b;…...

运维知识:Linux下Vim编辑器使用详解

运维知识&#xff1a;Linux下Vim编辑器使用详解 引言 在Linux的世界里&#xff0c;Vim不仅仅是一个文本编辑器&#xff0c;更是程序员的「瑞士军刀」。从1991年Bram Moolenaar发布第一个版本至今&#xff0c;Vim以其高效的模态编辑、高度可定制性和跨平台兼容性&#xff0c;成…...

复习HCIA

一、网络基础概念 1. OSI七层模型与TCP/IP四层模型 OSI七层模型详解&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a; 功能&#xff1a;传输原始比特流&#xff08;0/1&#xff09;&#xff0c;定义电气、机械特性&#xff08;如电压、线缆类型&#…...

在QT中进行控件提升操作

目录 一、概述 二、功能需求 三、提升操作 1&#xff09;拖入标准控件 2&#xff09;自定义类 3&#xff09;提升控件 一、概述 QT中提供的标准控件能够满足我们大多数情况下的功能需求&#xff0c;但是在一些特殊应用场合&#xff0c;我们可能需要对控件的功能进行扩展&am…...

Linux下JDK1.8安装配置

目录 1.下载完上传到Linux系统中 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 5.查看环境变量是否配置成功 官网下载地址:Java Downloads | Oracle 1.下载完上传到Linux系统中 2.解压JDK压缩包 tar -zxvf jdk-8u151-linux-x64.tar.gz -C /usr/local (解压…...

JVM 知识点梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java开发工具包 JRE 开发命令工具&#xff08;运行java.exe、编译javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java运行环境 JVM Java核心类库&#xff08;l…...

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…...

拓展 Coco AI 功能 - 智能检索 Hexo 博客

在之前的文章中&#xff0c;我们成功让 Coco AI 检索 Hugo 博客&#xff0c;这对于博客作者来说是一大福音。然而&#xff0c;从 Hexo 迁移到 Hugo 的成本不容小觑&#xff0c;毕竟大多数开发者对 Node.js 更熟悉&#xff0c;而 Golang 相对陌生。那么&#xff0c;既然 Coco AI…...

深入解析 Java Stream API:从 List 到 Map 的优雅转换!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;从 List 到 Map 的优雅转换 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 将 List 转换为 Map。&#x1f389; 具体来说&#xff0c;我们将深入…...

【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现全局状态管理

前言 在现代应用程序开发中&#xff0c;状态管理是构建复杂且可维护应用的关键。随着应用程序规模的增长&#xff0c;组件之间共享和同步状态变得越来越具有挑战性。如果处理不当&#xff0c;状态管理可能会导致代码混乱、难以调试&#xff0c;并最终影响应用程序的性能和可扩…...

金桔网桥路由版3

上一集我们讲到了二层云交换机&#xff0c;我把在云上搭建的桥接模式的VPN服务器称为二层云交换机。 那么现在我家到办公室的网络结构就变成这样的&#xff0c; 这样的好处就是我的电视盒子通过网线看电视&#xff0c;走的是OpenWrt路由器通过二层云交换机由办公室的OpenWrt路由…...

前沿分享|处理LLM幻觉问题-CoN|笔记链:增强检索增强语言模型的鲁棒性

检索增强语言模型&#xff08;RALMs&#xff09;在大型语言模型的能力方面取得了重大进步&#xff0c;特别是在减少事实幻觉方面&#xff0c;这得益于外部知识来源的利用。 然而&#xff0c;检索到的信息的可靠性并不总是有保证。 检索到无关数据可能导致误导性回答&#xff…...

OpenWrt开发第4篇:设置开发板的IP-基于Raspberry Pi 4B开发板

文/指尖动听知识库-谷谷 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:Openwrt开发-基于Raspberry Pi 4B开发板 有时候开发过程中经常会使用其他路由器,很多时候固件烧上去之后板子IP基本都是192.168.1.1,这时就需要修改板子的IP,下面介绍一下板…...

浅谈跨平台框架的演变(H5混合开发->RN->Flutter)

引言 这里分为四个阶段&#xff1a; 第一阶段 &#xff1a; 原生开发 第二阶段 &#xff1a; H5混合开发 第三阶段&#xff1a; 跨平台RN 第四阶段&#xff1a; 跨平台Flutter 正文 第一阶段&#xff1a; 原生开发 开发成本比较大 &#xff1a; 需要Android 和ios 开发两…...

Android数据加密方案

Android数据加密方案 前言 在移动应用开发中,数据安全是一个永恒的话题。Android应用中往往需要存储和传输敏感数据,如用户密码、支付信息、个人隐私等。本文将深入介绍Android平台上的数据加密方案,帮助开发者构建安全可靠的数据保护机制。 基础知识 1. 加密算法分类 …...

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具&#xff08;Windows上叫tracert&#xff09;&#xff0c;用于显示数据包从本地主机到远程主机经过的路由&#xff08;跳数&#xff09;。它可以帮助您了解数据包在网络中的传输路径&#xff0c;以及每跳的延迟情况。这对于网络故障排除、分析网络…...

PostgreSQL_安装

目录 前置&#xff1a; 安装过程&#xff1a; 1 下载软件 2 创建安装文件夹和放置数据的文件夹 3 双击安装 4 连接服务 前置&#xff1a; PostgreSQL 15 windows 10 专业版 安装过程&#xff1a; 1 下载软件 PostgreSQL: Downloads 大小326MB 2 创建安装文件夹和放…...

leetcode684.冗余连接

依旧是并查集问题&#xff0c;这道题目正好给定顶点数目和边的数目相等&#xff0c;只要找到其中的一条边删除将图转化为树就行&#xff0c;而这个多余的边起始就是并查集的添加过程中二者是同一个根&#xff08;两个顶点早已经联通了&#xff09;&#xff0c;这时直接返回这条…...

Python学习第二十一天

爬虫 概念 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网络蜘蛛&#xff08;Web Spider&#xff09;&#xff0c;是一种自动化程序&#xff0c;用于从互联网上抓取数据。爬虫通过模拟浏览器行为&#xff0c;访问目标网站并提取所需的信息&#xff0c;然后…...

matlab近似计算联合密度分布

在 Matlab 中&#xff0c;当A和B是两个序列数据时&#xff0c;可以通过以下步骤来近似求出A大于B的概率分布&#xff1a;数据准备&#xff1a;确保序列A和B具有相同的长度。如果长度不同&#xff0c;需要进行相应的处理&#xff08;例如截取或插值&#xff09;。计算A大于B的逻…...

OpenCV图像处理基础2

接着上一篇OpenCV图像处理基础1继续说。 图像阈值处理 1、简单阈值处理 ret, thresholded_image = cv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)thresh 是阈值,maxval 是最大值。 2、自适应阈值处理 thresholded_image = cv2.adaptiveThreshold(image, maxv…...

Prometheus Exporter系列-Mysql_Exporter一键部署

新项目旧项目都需要给研发配置mysql监控&#xff0c;这里mysql监控对应aws 阿里云 腾讯云 华为云的云mysql产品或开源自建mysql。 exporter安装虽然简单&#xff0c;经常手动操作不免让人心烦&#xff0c;一键完成省去繁琐的常规操作。 配置信息对的情况下测试多次都可以正常安…...

A l密码学(Deepseek)

我&#xff1a;qwertyuiopasdfghjklzxcvbnm deepseek:深度思考中&#xff0e; Okay, lets see. The user input is "qwertyuiopasdfghjklzxcvbnm". At first glance, it looks like a jumbled sequence of letters with some spaces or maybe other characters in …...

​「Java-API帮助文档」

「Java-API帮助文档」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/d7ced3b48f33 java.applet提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。java.awt包含用于创建用户界面和绘制图形图像的所有类。java.awt.color提供用于颜色空间的类。java…...

卷积神经网络 - 梯度和反向传播算法

在卷积网络中&#xff0c;参数为卷积核中权重以及偏置。和全连接前馈网络类似&#xff0c;卷积网络也可以通过误差反向传播算法来进行参数学习。本文我们从数学角度&#xff0c;来学习卷积神经网络梯度的推导和其反向传播算法的原理。 一、梯度&#xff1a;损失函数 L 关于第 …...

ripro 主题激活 问题写入授权Token失败,可能无文件写入权限

ripro 主题激活 问题 写入授权Token失败&#xff0c;可能无文件写入权限 找到主题下面的functions.php文件&#xff0c;给其他写入权限。就好了。...

MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE和 EXPLAIN性能分析和优化

在 MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE 和 EXPLAIN 是性能分析和优化的核心工具。以下是它们的详细用法和高级语法: 一、查看 SQL 执行频次 通过 SHOW STATUS 命令可以查看 SQL 的执行频次,帮助定位高频查询。 1. 查看全局 SQL 执行频次 SHOW GLOBAL STATU…...

Springdoc 全部注解一文解释清楚

文章目录 **1. 核心注解****Tag-Class类上** **2. 方法级别注解****Operation-方法描述****ApiResponse 和 ApiResponses-方法的返回结果** **3. 参数相关注解****Parameter-方法参数****Parameters方法参数&#xff08;单个&#xff09;** **4. 实体模型相关注解****Schema-描…...

1.angular介绍

初級使用视频添加链接描述 angular工具 angular.module(‘名’, [依赖模块]) 模块 angular.bind(*) : 修改this指向 angualr.copy() // a angular.copy(a, b) —a完全覆盖了b,c就是a angular.extend(a, b) a里面集成了b属性 angular.isArray angular.isDate angular.isDefin…...

StarRocks vs Doris:深度剖析与选型分析

StarRocks vs Doris&#xff1a;深度剖析与选型分析 在大数据技术蓬勃发展的当下&#xff0c;企业对于高效的数据分析工具的需求日益增长。StarRocks 和 Doris 作为两款优秀的 MPP&#xff08;大规模并行处理&#xff09;数据库&#xff0c;在数据仓库和数据分析领域备受关注。…...

Ambari、Bigtop源码编译最新支持情况汇总

以下是目前的版本情况 支持了绝大部分的组件编译及安装 版本组件名称组件版本env 版本v1.0.5Ozone1.4.11.0.5Impala4.4.11.0.5Nightingale7.7.21.0.5Categraf0.4.11.0.5VictoriaMetrics1.109.11.0.5Cloudbeaver24.3.31.0.5Celeborn0.5.31.0.5v1.0.4Doris2.1.71.0.4v1.0.3Phoen…...

【sql靶场】第23、25,25a关过滤绕过保姆级教程

目录 【sql靶场】第23、25-28关过滤绕过保姆级教程 第二十三关 第二十五关 1.爆出数据库 2.爆出表名 3.爆出字段 4.爆出账号密码 【sql靶场】第23、25&#xff0c;25a关过滤绕过保姆级教程 第二十三关 从本关开始又是get传参&#xff0c;并且还有了对某些字符或字段的过…...

coding ability 展开第五幕(二分查找算法)超详细!!!!

. . 文章目录 前言二分查找搜索插入的位置思路 x的平方根思路 山脉数组的峰顶索引思路 寻找旋转排序数组中的最小值思路 总结 前言 本专栏上篇博客已经把滑动指针收尾啦 现在还是想到核心——一段连续的区间&#xff0c;有时候加上哈希表用起来很爽 今天我们来学习新的算法知识…...