无向图G的邻接矩阵法和邻接表法以及遍历输出无向图G包括两种存储的FirstNeighbor和NextNeighbor两种基本操作

news2024/12/25 9:20:34

一.邻接矩阵法

将下列图G用邻接矩阵法进行存储

圆圈中的字符:是顶点的值

圆圈旁边的数字:是顶点的序号

边线上的值:是两个顶点之间的权值 

1.结构体

#define MaxVertexNum 10
typedef char VerTexType;//顶点的数据类型
typedef int EdgeType;//带权图中边上权值数据类型
typedef struct
{
  VerTexType Vex[MaxVertexNum];//顶点表
  EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
  int vexnum,arcnum;//图的当前顶点数和弧数
}MGraph;

 2.用邻接矩阵创造无向图G

//无向网的建立
void CreatMGraph(MGraph &G)
{
  printf("请输入图的顶点数和边数:");
  int m,n;
  scanf_s("%d %d",&m,&n);
  G.vexnum = m;
  G.arcnum = n;
  char val;
  for(int i = 0; i < G.vexnum; ++i)
  {
	  printf("第%d个顶点值为:",i);
	  scanf_s("%*c%c",&val);
	  G.Vex[i] = val;
  }
  for(int i = 0; i < G.vexnum; ++i)
  { 
	  for(int j = 0; j < G.vexnum; ++j)
	  {
		  G.Edge[i][j] = Max;
	  }
  }
  int i,j,w;
  for(int k = 0; k < G.arcnum; ++k)
  {
	printf("请输入顶点和权值\n");
	scanf_s("%d %d %d",&i,&j,&w);
    printf("(Vi,Vj)下表为(%d,%d)的权值为%d:\n",i,j,w);
	G.Edge[i][j] = w;
	G.Edge[j][i] = G.Edge[i][j];
  }

}

3.无向图G的遍历输出

//打印邻接矩阵存储的图
void PrintMGraph(MGraph G)																																																		
{
	for(int i = 0; i < G.vexnum; ++i)
	{
		printf("第%d个顶点的值为%c\n",i,G.Vex[i]);
	}
	for(int i = 0; i < G.vexnum; ++i)
	{
		for(int j = 0; j < G.vexnum; ++j)
		{
			printf("%d ",G.Edge[i][j]);
		}
		printf("\n");
	}
}

4.FirstNeighbor的操作:求图G中顶点编号x的第一个邻接点

//求图G中顶点编号x的第一个邻接点
int FirstNeighbor(MGraph G, int x)
{

	for(int j = 0; j < G.vexnum; ++j)
	{
		if(G.Edge[x][j] != -1)
			return j;
	}
	return -1;
}

5.NextNeighbor操作:假设图G中顶点y是顶点x的一个邻近点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1

//假设图G中顶点y是顶点x的一个邻近点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
int NextNeighbor(MGraph G, int x, int y)
{
  for(int j = y+1; j < G.vexnum; ++j)
  {
	  if(G.Edge[x][j] != -1)
		  return j;
  }
  return -1;
}

6.main函数:

int main(void)
{
  MGraph G;
  CreatMGraph(G);
  printf("%c",G.Vex[1]);
  PrintMGraph(G);
  printf("请输入你想查找顶点的编号:");
  int pos;
  scanf_s("%d",&pos);
  int FN = FirstNeighbor(G,pos);
  if(FN != -1)
	  printf("编号为%d顶点值为%c第一个临接的顶点的值为:%c\n",pos,G.Vex[pos],G.Vex[FN]);
  else
	  printf("编号为%d顶点值为%c的没有第一个邻接点",pos,G.Vex[pos]);
  int NN = NextNeighbor(G,pos,FN);
  if(NN == -1)
	  printf("编号为%d顶点值为%c且第一个邻接顶点值为%c没有下一个邻接点",pos,G.Vex[2],G.Vex[FN]);
  else
	  printf("编号为%d顶点值为%c且第一个邻接顶点值为%c的下一个邻接点值为%c",pos,G.Vex[2],G.Vex[FN],G.Vex[NN]);
  return 0;
}

 6.运行结果

 二.邻接表法

将下面无向图G用邻接表法进行存储

圆圈中的字符:是顶点的值

圆圈旁边的数字:是顶点的序号

边线上的值:是两个顶点之间的权值 

 1.结构体

#define MaxVertexNum 10//图中顶点数目的最大值
typedef char VertexType;
//定义边表结点
typedef struct ArcNode
{
  int adjvex;//该弧所指向的顶点的位置
  struct ArcNode *next;//指向下一条弧的指针
  int info;//网的边权值
}ArcNode;

//顶点表信息,用顺序结构存储顶点表的信息
typedef struct VNode
{
  VertexType data;//顶点信息
  ArcNode *first;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum];

//邻接表
typedef struct
{
  AdjList vertices;//邻接表
  int vexnum,arcnum;//图的顶点数和弧数
}ALGraph;//ALGraph是以邻接表存储图的类型

2.用邻接表法创建无向图G

//创建邻接表
void CreatALGraph(ALGraph &G)
{
  printf("请输入图G的顶点数和边数:\n");
  scanf_s("%d %d",&(G.vexnum),&(G.arcnum));
  //输入结点
  char val;
  for(int i = 0; i < G.vexnum; ++i)
  {
    printf("请输入第%d个结点的值:\n",i);
	scanf_s("%*c%c",&val);
	G.vertices[i].data = val;
	G.vertices[i].first = NULL;//最开始令每个顶点的第一条依附顶点的弧的指针为空
  }
  //输入边
  int i,j,w;
  for(int k = 0; k < G.arcnum; ++k)
  {
	ArcNode *m = (ArcNode*)malloc(sizeof(ArcNode));
	printf("请输入顶点的序号和权值\n");
	scanf_s("%d %d %d",&i,&j,&w);
    printf("(Vi,Vj)下表为(%d,%d)的权值为%d:\n",i,j,w);
	m->adjvex = j;
	m->info = w;
	//用头插法创造边表
	m->next = G.vertices[i].first;
	G.vertices[i].first = m;
	//这个是无向图,而且令k<G.arcnum,因为一个弧对应两个顶点,两个顶点都是顶点表中的,所以要同时将两个顶点表的边表都弄好
	ArcNode *n = (ArcNode*)malloc(sizeof(ArcNode));
	n->adjvex = i;
	n->info = w;
	//用头插法创建边表
	n->next = G.vertices[j].first;
	G.vertices[j].first = n;
  }

}

2.遍历输出无向图G

//打印邻接表存储的图
void PrintALGraph(ALGraph G)
{
	for(int i = 0; i < G.vexnum; ++i)
	{
		ArcNode *p = G.vertices[i].first;
		printf("顶点编号为%d的值为:%c\n",i,G.vertices[i].data);
		printf("顶点后面挂着的边表的值分别为:\n");
		while(p != NULL)
		{
			printf("序号为:%d; 顶点值为:%c; (%c,%c)之间权值为:%d\n",p->adjvex,G.vertices[p->adjvex].data,G.vertices[i].data,G.vertices[p->adjvex].data,p->info);
			p = p->next;
		}
	}
}

3.FirstNeighbor操作:求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1.

//求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1.
int FirstNeighbor(ALGraph G, int x)
{
	if(x >= G.vexnum)
	{
	  printf("图G不存在x\n");
	  return -1;
	}
	else if(G.vertices[x].first == NULL)
	{	
	  printf("图G中顶点x没有邻接点\n");
	  return -1;
	}
	else
	{
		ArcNode *p = G.vertices[x].first;//指向图G的顶点x的邻接点的指针
		int i = p->adjvex;//邻接点的序号
		int j = p->info;//两个顶点之间的权值
		printf("图G中顶点序号为%d的值为%c的邻接点的序号为%d值为%c且权值为%d\n",x,G.vertices[x].data,i,G.vertices[i].data,j);
		return i;
	}

}

4.NextNeighbor操作:假设图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1

//假设图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
int NextNeighbor(ALGraph G,int x,int y)
{
	ArcNode *p = G.vertices[x].first;
	while(p->adjvex != y)
	{
		p = p->next;
	}
	if(p->next == NULL)
	{
		printf("%c是图G中顶点%c的最后一个邻接点\n",G.vertices[x].data,G.vertices[y].data);
		return -1;
	}
	else
	{
		p = p->next;
		int j = p->adjvex;
		printf("%c是图G中除%c之外顶点%c的下一个邻接点\n",G.vertices[j].data,G.vertices[y].data,G.vertices[x].data);
		return j;
	}
}

5.main函数

int main(void)
{
  ALGraph G;
  CreatALGraph(G);
  PrintALGraph(G);
  printf("请输入你想查找结点的序号:\n");
  int m;
  scanf_s("%d",&m);
  FirstNeighbor(G,m);
  printf("请输入你想查找结点和某一个邻接结点的序号:\n");
  int a,b;
  scanf_s("%d %d",&a,&b);
  NextNeighbor(G,a,b);
  return 0;
}

6.运行结果图:

 

 

 

 完整代码:

邻接矩阵法:

#include<stdio.h>
#define Max -1//这里以-1代表最大值

#define MaxVertexNum 10
typedef char VerTexType;//顶点的数据类型
typedef int EdgeType;//带权图中边上权值数据类型
typedef struct
{
  VerTexType Vex[MaxVertexNum];//顶点表
  EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
  int vexnum,arcnum;//图的当前顶点数和弧数
}MGraph;

//函数说明
void CreatMGraph(MGraph &G);
void PrintMGraph(MGraph G);
int FirstNeighbor(MGraph G, int x);
int  NextNeighbor(MGraph G, int x, int y);


int main(void)
{
  MGraph G;
  CreatMGraph(G);
  printf("%c",G.Vex[1]);
  PrintMGraph(G);
  printf("请输入你想查找顶点的编号:");
  int pos;
  scanf_s("%d",&pos);
  int FN = FirstNeighbor(G,pos);
  if(FN != -1)
	  printf("编号为%d顶点值为%c第一个临接的顶点的值为:%c\n",pos,G.Vex[pos],G.Vex[FN]);
  else
	  printf("编号为%d顶点值为%c的没有第一个邻接点",pos,G.Vex[pos]);
  int NN = NextNeighbor(G,pos,FN);
  if(NN == -1)
	  printf("编号为%d顶点值为%c且第一个邻接顶点值为%c没有下一个邻接点",pos,G.Vex[2],G.Vex[FN]);
  else
	  printf("编号为%d顶点值为%c且第一个邻接顶点值为%c的下一个邻接点值为%c",pos,G.Vex[2],G.Vex[FN],G.Vex[NN]);
  return 0;
}


//无向网的建立
void CreatMGraph(MGraph &G)
{
  printf("请输入图的顶点数和边数:");
  int m,n;
  scanf_s("%d %d",&m,&n);
  G.vexnum = m;
  G.arcnum = n;
  char val;
  for(int i = 0; i < G.vexnum; ++i)
  {
	  printf("第%d个顶点值为:",i);
	  scanf_s("%*c%c",&val);
	  G.Vex[i] = val;
  }
  for(int i = 0; i < G.vexnum; ++i)
  { 
	  for(int j = 0; j < G.vexnum; ++j)
	  {
		  G.Edge[i][j] = Max;
	  }
  }
  int i,j,w;
  for(int k = 0; k < G.arcnum; ++k)
  {
	printf("请输入顶点和权值\n");
	scanf_s("%d %d %d",&i,&j,&w);
    printf("(Vi,Vj)下表为(%d,%d)的权值为%d:\n",i,j,w);
	G.Edge[i][j] = w;
	G.Edge[j][i] = G.Edge[i][j];
  }

}

//打印邻接矩阵存储的图
void PrintMGraph(MGraph G)																																																		
{
	for(int i = 0; i < G.vexnum; ++i)
	{
		printf("第%d个顶点的值为%c\n",i,G.Vex[i]);
	}
	for(int i = 0; i < G.vexnum; ++i)
	{
		for(int j = 0; j < G.vexnum; ++j)
		{
			printf("%d ",G.Edge[i][j]);
		}
		printf("\n");
	}
}

//求图G中顶点编号x的第一个邻接点
int FirstNeighbor(MGraph G, int x)
{

	for(int j = 0; j < G.vexnum; ++j)
	{
		if(G.Edge[x][j] != -1)
			return j;
	}
	return -1;
}

//假设图G中顶点y是顶点x的一个邻近点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
int NextNeighbor(MGraph G, int x, int y)
{
  for(int j = y+1; j < G.vexnum; ++j)
  {
	  if(G.Edge[x][j] != -1)
		  return j;
  }
  return -1;
}

邻接表法:

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

#define MaxVertexNum 10//图中顶点数目的最大值
typedef char VertexType;
//定义边表结点
typedef struct ArcNode
{
  int adjvex;//该弧所指向的顶点的位置
  struct ArcNode *next;//指向下一条弧的指针
  int info;//网的边权值
}ArcNode;

//顶点表信息,用顺序结构存储顶点表的信息
typedef struct VNode
{
  VertexType data;//顶点信息
  ArcNode *first;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum];

//邻接表
typedef struct
{
  AdjList vertices;//邻接表
  int vexnum,arcnum;//图的顶点数和弧数
}ALGraph;//ALGraph是以邻接表存储图的类型


//函数说明
void CreatALGraph(ALGraph &G);
void PrintALGraph(ALGraph G);
int FirstNeighbor(ALGraph G, int x);
int NextNeighbor(ALGraph G,int x,int y);

int main(void)
{
  ALGraph G;
  CreatALGraph(G);
  PrintALGraph(G);
  printf("请输入你想查找结点的序号:\n");
  int m;
  scanf_s("%d",&m);
  FirstNeighbor(G,m);
  printf("请输入你想查找结点和某一个邻接结点的序号:\n");
  int a,b;
  scanf_s("%d %d",&a,&b);
  NextNeighbor(G,a,b);
  return 0;
}

//创建邻接表
void CreatALGraph(ALGraph &G)
{
  printf("请输入图G的顶点数和边数:\n");
  scanf_s("%d %d",&(G.vexnum),&(G.arcnum));
  //输入结点
  char val;
  for(int i = 0; i < G.vexnum; ++i)
  {
    printf("请输入第%d个结点的值:\n",i);
	scanf_s("%*c%c",&val);
	G.vertices[i].data = val;
	G.vertices[i].first = NULL;//最开始令每个顶点的第一条依附顶点的弧的指针为空
  }
  //输入边
  int i,j,w;
  for(int k = 0; k < G.arcnum; ++k)
  {
	ArcNode *m = (ArcNode*)malloc(sizeof(ArcNode));
	printf("请输入顶点的序号和权值\n");
	scanf_s("%d %d %d",&i,&j,&w);
    printf("(Vi,Vj)下表为(%d,%d)的权值为%d:\n",i,j,w);
	m->adjvex = j;
	m->info = w;
	//用头插法创造边表
	m->next = G.vertices[i].first;
	G.vertices[i].first = m;
	//这个是无向图,而且令k<G.arcnum,因为一个弧对应两个顶点,两个顶点都是顶点表中的,所以要同时将两个顶点表的边表都弄好
	ArcNode *n = (ArcNode*)malloc(sizeof(ArcNode));
	n->adjvex = i;
	n->info = w;
	//用头插法创建边表
	n->next = G.vertices[j].first;
	G.vertices[j].first = n;
  }

}

//打印邻接表存储的图
void PrintALGraph(ALGraph G)
{
	for(int i = 0; i < G.vexnum; ++i)
	{
		ArcNode *p = G.vertices[i].first;
		printf("顶点编号为%d的值为:%c\n",i,G.vertices[i].data);
		printf("顶点后面挂着的边表的值分别为:\n");
		while(p != NULL)
		{
			printf("序号为:%d; 顶点值为:%c; (%c,%c)之间权值为:%d\n",p->adjvex,G.vertices[p->adjvex].data,G.vertices[i].data,G.vertices[p->adjvex].data,p->info);
			p = p->next;
		}
	}
}

//求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1.
int FirstNeighbor(ALGraph G, int x)
{
	if(x >= G.vexnum)
	{
	  printf("图G不存在x\n");
	  return -1;
	}
	else if(G.vertices[x].first == NULL)
	{	
	  printf("图G中顶点x没有邻接点\n");
	  return -1;
	}
	else
	{
		ArcNode *p = G.vertices[x].first;//指向图G的顶点x的邻接点的指针
		int i = p->adjvex;//邻接点的序号
		int j = p->info;//两个顶点之间的权值
		printf("图G中顶点序号为%d的值为%c的邻接点的序号为%d值为%c且权值为%d\n",x,G.vertices[x].data,i,G.vertices[i].data,j);
		return i;
	}

}

//假设图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
int NextNeighbor(ALGraph G,int x,int y)
{
	ArcNode *p = G.vertices[x].first;
	while(p->adjvex != y)
	{
		p = p->next;
	}
	if(p->next == NULL)
	{
		printf("%c是图G中顶点%c的最后一个邻接点\n",G.vertices[x].data,G.vertices[y].data);
		return -1;
	}
	else
	{
		p = p->next;
		int j = p->adjvex;
		printf("%c是图G中除%c之外顶点%c的下一个邻接点\n",G.vertices[j].data,G.vertices[y].data,G.vertices[x].data);
		return j;
	}
}

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

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

相关文章

prometheus + grafana + node_exporter + alertmanager 的安装部署与邮件报警

背景介绍 Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发&#xff0c;是Google BorgMon监控系统的开源版本。 Prometheus的特点 多维度数据模型。 灵活的查询语言。 不依赖分布式存储&#xff0c;单个服务器节点是自主的。 通…

二值化的mask生成yolov5-7.0的实例分割训练标签

背景&#xff1a;要用yolov5-7.0训练分割&#xff0c;这里使用自己的数据&#xff0c;mask是二值化的数据&#xff0c;要先转换成COCO格式&#xff0c;这里用imantics实现。 详见&#xff1a;https://zhuanlan.zhihu.com/p/427096258 截取部分代码如下图&#xff0c;读取image图…

C++之引用、指针引用、常引用

引用 引用的概念引用的定义引用的使用引用的应用引用的本质&#xff08;就是C内部的一个常指针(type * const 名)&#xff09;指针引用&#xff08;其类型还是指针type *&#xff09;常引用&#xff08;采用const修饰的引用&#xff09; 引用的概念 1、通常我们说的引用指的是…

和鲸社区数据分析每周挑战【第九十五期:奈飞股价预测分析】

和鲸社区数据分析每周挑战【第九十五期&#xff1a;奈飞股价预测分析】 文章目录 和鲸社区数据分析每周挑战【第九十五期&#xff1a;奈飞股价预测分析】一、前言1、背景描述2、数据说明3、数据集预览 二、数据读取和数据预处理三、历史股价数据可视化四、利用sklearn中LinearR…

Linux 系统下的df、du、fdisk、lsblk指令

文章目录 1 查看磁盘与目录容量&#xff08;df、du&#xff09;2 查看磁盘分区&#xff08;fdisk、lsblk&#xff09;3 df、du、fdisk、lsblk的区别 1 查看磁盘与目录容量&#xff08;df、du&#xff09; df -h //列出文件系统的整体磁盘使用量在显示的结果中要特别留意根目录…

安洵杯2023 部分pwn复现

1. harde_pwn 漏洞点&#xff1a; 覆盖printf的返回地址 from pwn import * from LibcSearcher import LibcSearcher from sys import argv from Crypto.Util.number import bytes_to_long import os def ret2libc(leak, func, path):if path :libc LibcSearcher(func, leak…

二级Python考试环境安装教程

二级Python考试环境 Python3.5.3至Python3.9.10版。为方便考生学习与考点备考&#xff0c;现提供二级Python应用软件的网络下载&#xff0c;广大考生和考点管理员可以下载使用 软件包下载&#xff08;62.18 MB&#xff09; https://www.123pan.com/s/y4HrVv-0S0lA.html 安装…

在windows11环境下安装CUDA11.6+Anaconda3+pyToach1.13搭建炼丹炉

0.电脑环境 系统&#xff1a;win11 显卡&#xff1a;NVIDIA GTX1650 还有一个pyCharm&#xff0c;其他也用不到了&#xff0c;需要的文章中会进行说明 1.安装CUDA11.6 目前2023.03出来的pyToach2.0是用不到了&#xff0c;因为最低版本支持CUDA11.7。我的显卡是1650&#xff0c…

leetcode数据库题第八弹(免费题刷完了)

leetcode数据库题第八弹&#xff08;免费题刷完了&#xff09; 1757. 可回收且低脂的产品1789. 员工的直属部门1795. 每个产品在不同商店的价格1873. 计算特殊奖金1890. 2020年最后一次登录1907. 按分类统计薪水1934. 确认率1965. 丢失信息的雇员1978. 上级经理已离职的公司员工…

WebRTC音视频会议底层支撑技术

WebRTC允许应用使用P2P通信。WebRTC是一个广泛的话题&#xff0c;在本文中&#xff0c;我们将重点讨以下问题。 为什么Web RTC 如此受欢迎&#xff1f; 在P2P连接过程中会发生什么 信号传递 NATs和ICE STUN & TURN服务器 VP9视频编解码器 WebRTC APIs 安全 1.为什…

科技资讯|苹果新专利曝光:手势增强用户的交互体验

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的最新清单&#xff0c;苹果公司获得了一项编号为 US 20230195237 A1 的专利&#xff0c;展示了使用手势导航用户界面的交互体验。 苹果这项专利涉及 iPhone、iPad、Apple Watch 和 Mac&#xff0c;使用屏幕生成组件和…

Typora的安装和授权(2023)

文章目录 1. 文章引言2. Typora的下载3. Typora的安装4. Typora的授权 1. 文章引言 我们在开发的过程中&#xff0c;不可或缺地要使用到markdown文本&#xff0c;支持markdown文本的编辑器有很多&#xff0c;其中Typora便是一款不错的编辑器。 不过&#xff0c;Typora是收费的…

知行之桥EDI系统QA第二期:AS2专题

随着使用知行之桥EDI系统的用户群体日益壮大&#xff0c;在使用过程中&#xff0c;用户可能对系统的工作原理、功能模块和实施过程有一些疑问。近期整理了有关 AS2 的四个常见问题&#xff1a; 1.知行之桥 EDI系统支持AS2 协议的 AES_GCM 算法吗&#xff1f;2.AS2发送文件后收…

C++不知算法系列之计数排序算法的计数之巧

1. 前言 计数排序是较简单的排序算法&#xff0c;其基本思想是利用数组索引号有序的原理。 如对如下的原始数组中的数据(元素)排序&#xff1a; //原始数组 int nums[5]{9,1,7,6,8};使用计数排序的基本思路如下&#xff1a; 创建一个排序数组。数组的大小由原始数组的最大值…

ActiveMQ消息队列的核心概念

文章目录 ActiveMQ消息队列的核心概念1.什么是MQ消息队列2.为什么要使用MQ消息队列3.MQ消息队列的应用场景3.1.异步处理3.2.应用解耦3.3.流量削锋 4.常见的MQ消息队列产品对比 ActiveMQ消息队列的核心概念 1.什么是MQ消息队列 Message Queue消息队列简称MQ&#xff0c;消息队…

NXP i.MX 6ULL工业开发板规格书( ARM Cortex-A7,主频792MHz)

1 评估板简介 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳定可靠&#xff0c;可满足各种工业应用环境。 评估板接口资源丰富&…

AI通用大模型 —— Pathways,MoE, etc.

文章目录 Pathways现有AI缺憾Pathways Can DoMultiple TasksMultiple SensesSparse and Efficient Mixture of Experts&#xff08;MoE&#xff09;Neural Computation1991, Adaptive mixtures of local expertsICLR17, Outrageously Large Neural Networks: The Sparsely-Gate…

【已解决】ModuleNotFoundError: No module named ‘timm.models.layers.helpers‘

文章目录 错误信息原因解决方法专栏&#xff1a;神经网络精讲与实战AlexNetVGGNetGoogLeNetInception V2——V4ResNetDenseNet 错误信息 在使用timm库的时候出现了ModuleNotFoundError: No module named timm.models.layers.helpers’的错误&#xff0c;详情如下&#xff1a; …

Windows下安装ClickHouse图文教程

文章目录 1.安装WSL21.1启用适用于 Linux 的 Windows 子系统1.2启用Windows虚拟机功能1.3将WSL2设置为默认版本1.4下载Linux内核更新包1.5安装Linux子系统1.6设置账户和密码 2.安装Docker2.1下载与安装2.2设置镜像地址 3.安装Clickhouse3.1拉取镜像3.2启动clickhouse-server3.3…

Docker学习笔记7

启动一个运行httpd服务的容器&#xff1a; docker run -it --namec3 centos:latest /bin/bash 在容器中安装apache服务&#xff1a; yum install -y httpd 在这个过程中遇到一个问题&#xff1a; Error: Failed to download metadata for repo appstream: Cannot prepare …