图的操作算法详解

news2024/10/6 16:20:39

一.图

基础概念:

  1. 有向图 - 图中每个边都有一个方向,例如社交媒体网站上的关注关系图就是有向图。
  2. 无向图 - 图中每个边都没有方向,例如朋友之间的相互认识关系图可以是无向图。
  3. 简单图 - 没有自环和重复边的无向图或有向图,例如一张不允许两个人之间有多个好友关系的朋友关系图就是简单图。
  4. 多重图 - 允许存在重复边的无向图或有向图,例如同一个用户在不同时间对同一篇文章进行多次评论的评论关系图就是多重图。
  5. 完全图 - 任意两个顶点之间都存在一条边的图,例如五个节点的完全图就具有10条边。
  6. 子图 - 从原图中选取一部分节点和它们之间的边形成的图,例如从一张社交网络上选取几个用户和他们之间的好友关系形成的子图。
  7. 连通图和联通分量 - 在无向图中,如果任意两个节点之间都存在至少一条路径,则该图为连通图。如果将连通图中所有连通的子图都提取出来,得到的每个连通的子图称为联通分量。
  8. 强连通图 - 在有向图中,如果任意两个节点之间都存在至少一条有向路径,则该图为强连通图。
  9. 生成树 - 连通图中的一棵树,它包含了原图中所有节点,并且只有最少的边被保留,例如一个城市的道路系统可以被看做是一张无向图,其最小生成树表示了连接城市的最短路径。
  10. 度 - 节点拥有的边的数量,对于无向图而言就是与该节点相邻的节点的数量,对于有向图而言则分为入度和出度。
  11. 权和网 - 图中边具有的权重或者是节点之间的关联程度,例如一个城市之间的距离可以被看做是一张加权无向图。
  12. 稠密图和稀疏图 - 用来描述图中边的数量相对于节点数量的性质,如果边数接近节点数的平方,那么图就是稠密图;反之,则为稀疏图。
  13. 路径和路径长度 - 从起始节点到结束节点所经过的边的序列称为路径,路径上经过的边的数量称为路径长度。
  14. 距离 - 两个节点之间的最短路径长度。
  15. 回路 - 从起始节点到结束节点的路径,且起始节点和结束节点是同一个节点。在无向图中也被称为环。

二.图的存储

1.邻接矩阵

邻接矩阵是一种用二维数组表示图的数据结构,其中矩阵中的每个元素表示两个节点之间是否存在边。对于无向图而言,邻接矩阵是对称的;对于有向图而言,则不一定对称。

在C语言中,可以使用二维数组来实现邻接矩阵,例如:

#define MAX_NODES 100
int graph[MAX_NODES][MAX_NODES];

其中,graph[i][j] 表示从节点 i 到节点 j 是否存在一条边。如果存在,则该值为1,否则为0。

2.邻接表

邻接表是由顶点和与之相连的边组成的链表,在链表中存储了每个节点的邻居节点信息。对于稀疏图而言,邻接表比邻接矩阵更加节省空间,但查询某个节点的邻居节点需要遍历整个链表。

在C语言中,可以使用结构体和指针来实现邻接表,例如:

#define MAX_NODES 100
struct AdjNode {
    int dest;
    struct AdjNode* next;
};
typedef struct AdjNode AdjNode;

struct Graph {
    AdjNode* adjLists[MAX_NODES];
};
typedef struct Graph Graph;

其中,Graph 结构体包含了一个数组 adjLists,每个元素都是一个指向 AdjNode 结构体的指针。在 AdjNode 结构体中,dest 表示目标节点的编号,next 则是指向下一个邻居节点的指针。

3.关联矩阵

关联矩阵是一种用二维数组表示图的数据结构,其中矩阵中的每个元素表示一个顶点和一条边之间的关系。在关联矩阵中,行代表顶点,列代表边,如果该顶点与该边相连,则值为1,否则为0。

在C语言中,可以使用二维数组来实现关联矩阵,例如:

#define MAX_NODES 100
#define MAX_EDGES 200
int matrix[MAX_NODES][MAX_EDGES];

其中,matrix[i][j] 表示顶点 i 是否与边 j 相连。如果相连,则该值为1;否则为0。

4.十字链表

十字链表是在邻接表的基础上进一步扩展的数据结构,它可以表示有向图的结构,同时避免了邻接表中查询源点和目标点的缺点。在十字链表中,每个节点都有两个域,分别指向以该节点为起点的出边和以该节点为终点的入边。

在C语言中,可以使用结构体和指针来实现十字链表,例如:

#define MAX_NODES 100

struct Edge {
    int from;
    int to;
    struct Edge* nextOut;
    struct Edge* nextIn;
};
typedef struct Edge Edge;

struct Graph {
    Edge* edges[MAX_NODES];
};
typedef struct Graph Graph;

其中,Graph 结构体包含了一个数组 edges,每个元素都是一个指向 Edge 结构体的指针。在 Edge 结构体中,from 表示边的起点,to 表示边的终点,nextOut 则是指向下一条以该节点为起点的出边的指针,nextIn 则是指向下一条以该节点为终点的入边的指针。

5.前向星

前向星也是在邻接表的基础上进行扩展,它可以同时支持有向图和无向图,同时也解决了在邻接表中查询某个节点的所有出边或入边的效率问题。在前向星中,每个节点不再只存储一个指向第一个邻居节点的指针,而是存储一组指向所有邻居节点的指针,这些指针按照一定的顺序排列成一个链表。

在C语言中,可以使用结构体和数组来实现前向星,例如:

#define MAX_NODES 100
#define MAX_EDGES 200

struct Edge {
    int to;
    int weight; // 可选
    int next; // 指向下一条出边或入边
};
typedef struct Edge Edge;

struct Graph {
    Edge edges[MAX_EDGES];
    int head[MAX_NODES]; // 存储每个节点的第一条边的编号
    int edgeCount;
};
typedef struct Graph Graph;

其中,Graph 结构体包含了两个数组,edges 数组存储所有边的信息,head 数组存储每个节点的第一条边的编号,edgeCount 表示边的数量。在 Edge 结构体中,to 表示边的终点,weight 表示边的权值(可选),next 表示与该边起点相同的下一条边的编号。

6.邻接多重表

邻接多重表是一种用于表示无向图的数据结构,它将每条边都存储为两个顶点之间的一条边,并且对于每个节点存储所有与该节点相连的边的信息。在邻接多重表中,每个节点都有一个指向第一条与该节点相连的边的指针,而每条边则包含了指向其起点和终点下一条边的指针。

在C语言中,可以使用结构体和指针来实现邻接多重表,例如:

#define MAX_NODES 100
#define MAX_EDGES 200

struct Edge {
    int from;
    int to;
    int nextFrom; // 指向起点相同的下一条边
    int nextTo; // 指向终点相同的下一条边
};
typedef struct Edge Edge;

struct Graph {
    Edge edges[MAX_EDGES];
    int head[MAX_NODES]; // 存储每个节点的第一条边的编号
    int edgeCount;
};
typedef struct Graph Graph;

其中,Graph 结构体包含了两个数组,edges 数组存储所有边的信息,head 数组存储每个节点的第一条边的编号,edgeCount 表示边的数量。在 Edge 结构体中,fromto 分别表示边的起点和终点,nextFromnextTo 则分别指向与该边起点相同和终点相同的下一条边的编号。

三.图的基本操作

在考研范围内,需要掌握以下图的基本操作:

  1. 创建图:根据实际需求创建一个空的图数据结构,并初始化各个节点和边的相关信息。
  2. 添加节点:向图中添加一个新的节点,并更新与该节点相连的所有边的信息。
  3. 添加边:向图中添加一条新的边,并更新相应节点的邻居节点列表。
  4. 删除节点:从图中删除一个节点,并将其所有与之相连的边移除。
  5. 删除边:从图中删除一条边,并更新相应节点的邻居节点列表。
  6. 查找节点:查找图中是否包含某个特定的节点,并返回其相关信息。
  7. 查找边:查找图中是否包含某条特定的边,并返回其相关信息。
  8. 遍历图:遍历图中的所有节点和边,以便进行进一步的分析和处理。
  9. 拓扑排序:对有向无环图进行拓扑排序,以确定所有节点的执行顺序。
  10. 最短路径:计算两个节点之间的最短路径,以便找到最优解决方案。
  11. 最小生成树:寻找无向图的最小生成树,以获得最小成本的连接方式。

四.核心功能实现

1.创建图

// 创建邻接矩阵表示的无向图
void CreateGraph(Graph *G) {
	int i, j, k, weight;
	
	printf("请输入图的顶点数和边数(用空格隔开): ");
	scanf("%d %d", &G->vertex_num, &G->edge_num);
	
	printf("请输入%d个顶点的信息: ", G->vertex_num);
	for (i = 0; i < G->vertex_num; ++i)
		scanf("%s", &G->vertex[i]);
	
	for (i = 0; i < G->vertex_num; ++i)
		for (j = 0; j < G->vertex_num; ++j)
			G->edge[i][j] = 0;  // 初始化邻接矩阵
	
	printf("请输入%d条边的信息(起点 终点 权值):\n", G->edge_num);
	for (k = 0; k < G->edge_num; ++k) {
		scanf("%d %d %d", &i, &j, &weight);
		// 因为是无向图,所以需要对称赋值
		G->edge[i][j] = weight;
		G->edge[j][i] = weight;  
		//如果这里是创建有向图,那么就需要我们应该会改
	}
}

2.插入顶点

// 在图G中插入顶点x
void InsertVertex(Graph *G, char x){
	if(G->vertex_num == MAX_VERTEX_NUM){  // 图已满
		printf("Error: 超出最大结点范围\n");
		return;
	}
	G->vertex[G->vertex_num] = x;
	G->vertex_num++;
	//更新边信息
	for(int i=0;i<G->vertex_num-1;++i){
		G->edge[i][G->vertex_num-1] = 0; //初始化新顶点的出边
		G->edge[G->vertex_num-1][i] = 0; //初始化新顶点的入边
	}
}

3.删除顶点

// 将数组中从 start 开始的元素向前移动一位
void moveArray(char arr[], int start, int end) {
	for (int i = start; i < end; ++i) {
		arr[i] = arr[i+1];
	}
}

// 在图G中删除顶点x
void DeleteVertex(Graph *G,char x){
	int n = -1;      //待删除结点在数组里的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n=i;
			break;
		}
	}
	if(n == -1){  // 如果节点不存在
		printf("Error: 结点不存在\n");
		return;
	}
	// 删除该节点对应的行和列
	for(int i=n;i<G->vertex_num-1;++i){
		moveArray(G->vertex, i, G->vertex_num - 1); // 将后面的节点前移
		for(int j=0;j<G->vertex_num;++j){
			G->edge[i][j] = G->edge[i+1][j]; // 前移一位
			G->edge[j][i] = G->edge[j][i+1];
		}
	}
	G->vertex_num--;
	// 更新最后一行和最后一列
	for(int i=0;i<G->vertex_num;++i){
		G->edge[G->vertex_num][i] = 0; // 删除最后一列
		G->edge[i][G->vertex_num] = 0; // 删除最后一行
	}
}

4.求第一个邻接点

//求图G中顶点x的第一个邻接点
char FirstNeighbor(Graph *G,char x){
	int n = -1;      //待查询结点在数组里的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n=i;
			break;
		}
	}
	if(n == -1){  // 如果查询节点不存在
		printf("Error: 结点不存在\n");
	}
	int count=0;
	int nx;        //第一个邻接点在数组里的下标
	//现在知道了他在第n个,所以我们查询边矩阵第n行中第一个1在哪就知道第一个邻接点是谁
	for(int j=0;j<G->vertex_num;j++){
		if(G->edge[n][j]==1) count++;
		if(count==1){
			nx=j;
			break;
		}
	}
	return G->vertex[nx];
}

5.求其余邻接点

//返回图G中顶点x除顶点y的下一个邻接点
char NextNeighbor(Graph *G,char x,char y){
	int n = -1;      //待查询结点在数组里的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n=i;
			break;
		}
	}
	if(n == -1){  // 如果查询节点不存在
		printf("Error: 结点不存在\n");
	}
	int count=0;
	int nx;   //存放返回邻接点数组下标
	for(int j=0;j<G->vertex_num;j++){
		if(G->edge[n][j]==1){
			if(G->vertex[j]!=y){
				j=nx;
			}
		}	
	}
	return G->vertex[nx];
}

6.判断边

//判断图G中x和y之间是否有边
int Adjacent(Graph *G,char x,char y){
	int n1,n2;   //分别存储x和y的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n1=i;
			break;
		}
	}
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n2=i;
			break;
		}
	}
	if(G->edge[n1][n2]==0 && G->edge[n2][n1]==0)
		return -1;
	else
		return 1;
}

以上部分均选取第三部分比较难 的算法进行实现

五.C语言完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_VERTEX_NUM 20  // 最大顶点数

typedef struct {
	char vertex[MAX_VERTEX_NUM];  // 存放顶点信息
	int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  // 存放边信息
	int vertex_num;  // 顶点数
	int edge_num;  // 边数
} Graph;

// 创建邻接矩阵表示的无向图
void CreateGraph(Graph *G) {
	int i, j, k, weight;
	
	printf("请输入图的顶点数和边数(用空格隔开): ");
	scanf("%d %d", &G->vertex_num, &G->edge_num);
	
	printf("请输入%d个顶点的信息: ", G->vertex_num);
	for (i = 0; i < G->vertex_num; ++i)
		scanf("%s", &G->vertex[i]);
	
	for (i = 0; i < G->vertex_num; ++i)
		for (j = 0; j < G->vertex_num; ++j)
			G->edge[i][j] = 0;  // 初始化邻接矩阵
	
	printf("请输入%d条边的信息(起点 终点 权值):\n", G->edge_num);
	for (k = 0; k < G->edge_num; ++k) {
		scanf("%d %d %d", &i, &j, &weight);
		// 因为是无向图,所以需要对称赋值
		G->edge[i][j] = weight;
		G->edge[j][i] = weight;  
		//如果这里是创建有向图,那么就需要我们应该会改
	}
}

// 在图G中插入顶点x
void InsertVertex(Graph *G, char x){
	if(G->vertex_num == MAX_VERTEX_NUM){  // 图已满
		printf("Error: 超出最大结点范围\n");
		return;
	}
	G->vertex[G->vertex_num] = x;
	G->vertex_num++;
	//更新边信息
	for(int i=0;i<G->vertex_num-1;++i){
		G->edge[i][G->vertex_num-1] = 0; //初始化新顶点的出边
		G->edge[G->vertex_num-1][i] = 0; //初始化新顶点的入边
	}
}

// 将数组中从 start 开始的元素向前移动一位
void moveArray(char arr[], int start, int end) {
	for (int i = start; i < end; ++i) {
		arr[i] = arr[i+1];
	}
}

// 在图G中删除顶点x
void DeleteVertex(Graph *G,char x){
	int n = -1;      //待删除结点在数组里的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n=i;
			break;
		}
	}
	if(n == -1){  // 如果节点不存在
		printf("Error: 结点不存在\n");
		return;
	}
	// 删除该节点对应的行和列
	for(int i=n;i<G->vertex_num-1;++i){
		moveArray(G->vertex, i, G->vertex_num - 1); // 将后面的节点前移
		for(int j=0;j<G->vertex_num;++j){
			G->edge[i][j] = G->edge[i+1][j]; // 前移一位
			G->edge[j][i] = G->edge[j][i+1];
		}
	}
	G->vertex_num--;
	// 更新最后一行和最后一列
	for(int i=0;i<G->vertex_num;++i){
		G->edge[G->vertex_num][i] = 0; // 删除最后一列
		G->edge[i][G->vertex_num] = 0; // 删除最后一行
	}
}

//求图G中顶点x的第一个邻接点
char FirstNeighbor(Graph *G,char x){
	int n = -1;      //待查询结点在数组里的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n=i;
			break;
		}
	}
	if(n == -1){  // 如果查询节点不存在
		printf("Error: 结点不存在\n");
	}
	int count=0;
	int nx;        //第一个邻接点在数组里的下标
	//现在知道了他在第n个,所以我们查询边矩阵第n行中第一个1在哪就知道第一个邻接点是谁
	for(int j=0;j<G->vertex_num;j++){
		if(G->edge[n][j]==1) count++;
		if(count==1){
			nx=j;
			break;
		}
	}
	return G->vertex[nx];
}

//返回图G中顶点x除顶点y的下一个邻接点
char NextNeighbor(Graph *G,char x,char y){
	int n = -1;      //待查询结点在数组里的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n=i;
			break;
		}
	}
	if(n == -1){  // 如果查询节点不存在
		printf("Error: 结点不存在\n");
	}
	int count=0;
	int nx;   //存放返回邻接点数组下标
	for(int j=0;j<G->vertex_num;j++){
		if(G->edge[n][j]==1){
			if(G->vertex[j]!=y){
				j=nx;
			}
		}	
	}
	return G->vertex[nx];
}

//判断图G中x和y之间是否有边
int Adjacent(Graph *G,char x,char y){
	int n1,n2;   //分别存储x和y的下标
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n1=i;
			break;
		}
	}
	for(int i=0;i<G->vertex_num;i++){
		if(G->vertex[i]==x) {
			n2=i;
			break;
		}
	}
	if(G->edge[n1][n2]==0 && G->edge[n2][n1]==0)
		return -1;
	else
		return 1;
}

int main() {
	Graph G;
	CreateGraph(&G);
	return 0;
}



六.运行结果

9HRC.jpg

刚好最近复习数据结构与算法,顺便参加了英杰的新星计划,这是本周第一篇投稿。

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

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

相关文章

025.【树形结构算法】

1. 树的定义 树形结构是由n个元素组成的有限集合&#xff0c;如果n0&#xff0c;那么就称为空树&#xff1b;如果n>0&#xff0c;树形结构应该满足以下条件&#xff1a; 有一个特定的结点&#xff0c;称为根结点或根。 除根结点外&#xff0c;其余结点被分成m(m≥0)个互不…

面试官:一个 TCP 连接可以发多少个 HTTP 请求?

目录 &#x1f914; 第一个问题 &#x1f914; 第二个问题 &#x1f914; 第三个问题 &#x1f914; 第四个问题 &#x1f914; 第五个问题 曾经有这么一道经典面试题&#xff1a;从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff1f; 相信大多数准备过的同…

产品经理面试常见的25个必问题(一)

1、你认为产品经理的工作职责是什么&#xff1f; ●需求阶段&#xff08;需求收集、需求管理、需求分析、需求评估&#xff09; ●设计阶段&#xff08;业务流程、功能模块、原型交互、需求文档&#xff09; ●开发阶段&#xff08;需求评审、项目管理、测试验收&#xff09…

centos版本的EDA虚拟机搭建1

0、参考博客 Centos镜像国内最全下载地址 VMware Workstation CPU如何设置才更加合理&#xff1f;如何才能发挥虚拟机最大性能 1、下载网站 http://mirrors.aliyun.com/centos/7/isos/x86_64/centos镜像文件下载完成。 2、vmware搭建centos 新建虚拟机。 选择自定义。 …

mysql中的索引

1、索引是什么&#xff1f; 在mysql当中&#xff0c; 内部系统它有两种查询方式&#xff0c; 一种是(全盘扫描查询)&#xff0c;另外一种是通过(索引检索查询)&#xff0c;通过添加了索引的字段进行查询&#xff0c; 可以大大提高查询效率 mysql中的索引相当于一本书中的目录&a…

java 物流配货管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 物流配货管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

centos7系统:HAProxy软件部署

目录 目 的&#xff1a; 硬件需求: ​编辑 实验环境配置&#xff1a; haproxy的服务器配置&#xff1a; nfsrps服务器部署&#xff1a; nginx服务器1部署: nginx服务器2部署&#xff1a; 目 的&#xff1a; 两台nginx服务器做web服务&#xff0c;haproxy服务器做调度负载均…

(6.9-6.15)【大数据新闻速递】

【上海数交所将携手清华大学等举办首届数据资产入表研修班】 上海数据交易所获悉&#xff0c;数交所将联合清华大学五道口金融学院、上海市数商协会于6月28日至29日举办首届数据资产入表研修班。财政部印发《企业数据资源相关会计处理暂行规定&#xff08;征求意见稿&#xff…

前沿应用丨大规模无人机集群与“虚实结合”半实物仿真系统

一、应用背景 无人机集群在军事、安全、救援、航空监测、物流配送等领域具有广泛的应用前景。它可以提高任务执行的效率、灵活性和安全性&#xff0c;同时降低人力资源的需求和风险&#xff0c;无人机集群研究涉及多个学科领域&#xff0c;如机器人学、控制理论、通信技术和人工…

【算法与数据结构】383、LeetCode赎金信

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题的思路和242、有效的字母异位词的思路一样   程序如下&#xff1a; class Solution { public…

好好存钱,是成年人最顶级的自律

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 王尔德说&#xff1a;“在我年轻的时候&#xff0c;曾以为金钱是世界上最重要的东西。现在我老了&#xff0c;才知道的确如此。” 路遥说&#xff1a;“钱是好东西&#xff0c;它能使人不再心慌&#…

指纹识别工具WhatWeb使用教程,图文教程(超详细)

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 WhatWeb 一、扫描网站指纹二、扫描强度三、扫描内网…

ZeroQuant-V2 LLM权重与激活量化

ref ZeroQuant-V2: Exploring Post-training Quantization in LLMs from Comprehensive Study to Low Rank Compensation 4bit量化为什么重要 The case for 4-bit precision: k-bit Inference Scaling Laws 这篇文章研究表明4bit通常是最优的量化方法&#xff1a;同样的量化…

快速选择合适的GNSS模拟器,看这几个重点

为了正确测试GNSS接收器或其他任何依赖GNSS信号的系统或设备&#xff0c;工程师需要模拟与真实卫星广播相同的RF信号&#xff0c;而使用GNSS模拟器是实现这一工作的最佳选择。 假设正在开发一种需要集成GNSS接收器的新产品&#xff0c;想要验证接收器设备在不同条件下是否运行…

企业为什么要关注库存?因为那都是“钱”!

库存是企业管理的核心&#xff0c;公司必须提供足够的商品来满足客户需求&#xff0c;但又不能冒着浪费金钱和资源的风险&#xff0c;一味的增加库存。 不同的企业在库存管理这个问题上就“八仙过海各显神通”了&#xff0c;常见的处理方法有&#xff1a; 1. 经验法&#xff1a…

求两数之和

必应壁纸供图 题目描述 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不…

基于SpringBoot+Vue的学生毕业离校系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Sui x KuCoin Labs夏季黑客松首批入围项目公布

经过一段时间的共同努力&#xff0c;我们已经完成了对Sui x KuCoin Labs夏季黑客松第一批入围项目的审核&#xff0c;并宣布以下团队已入围最终demo day&#xff1a; 首批入围名单 Desig Protocol Desig协议提供了一种与区块链无关&#xff08;无智能合约&#xff09;的多重…

聚观早报|奔驰接入ChatGPT聊天机器人;极兔速递提交上市申请书

今日要闻&#xff1a;奔驰接入ChatGPT聊天机器人&#xff1b;极兔速递向港交所提交上市申请书&#xff1b;微软股价创历史新高&#xff1b;美电动卡车Nikola宣布裁员23%&#xff1b;马斯克&#xff1a;人工智能具有颠覆性 奔驰接入ChatGPT聊天机器人 梅赛德斯 - 奔驰表示&…

Doris 扩缩容和副本均衡

扩缩容和副本均衡 ​ 对于集群节点发生变化&#xff08;扩缩容&#xff09;时&#xff0c;集群内部的tablet是如何以一定的策略完成数据的重分布&#xff0c;从而达到每个be能够分布尽可能数量相同的tablet。同时&#xff0c;集群内部某些tablet由于某些原因发生损坏时&#x…