图的基本知识点及遍历代码

2023-11-14

一.引出
1.七桥问题
欧拉回路判定规则:
如果通奇数桥的地方多于两个,则不存在欧拉回路;
如果只有两个地方通奇数桥,可以从这两个地方之一出发,找到欧拉回路;
如果没有一个地方是通奇数桥的,则无论从哪里出发,都能找到欧拉回路。

二.基本概念
1.
1)由顶点(数据元素)的有穷非空集合和顶点之间边的集合组成。
2)表示为:G(V,E)<V:顶点的集合(不能是空集),顶点之间边的集合>
2.无向图
1)图中任意两个顶点之间的边都是无向边。
2)无向边:表示为(vi,vj),顶点vi和vj之间的边没有方向。
3)邻接、依附:无向图中,对于任意两个顶点 vi 和顶点 vj,若存在边(vi,vj),则称顶点 vi 和顶点 vj 互为邻接点,同时称边(vi,vj)依附于顶点 vi 和顶点 vj
3.有向图
1)图中任意两个顶点之间的边都是有向边。
2)有向边(弧):表示为<vi,vj>,从vi 到vj 的边有方向
3)邻接、依附:有向图中,对于任意两个顶点 vi 和顶点 vj,若存在弧<vi,vj>,则称顶点 vi “邻接到 ”vj ,顶点 vj “邻接自”vi ,同时称弧<vi,vj>依附于顶点 vi 和顶点 vj
4.稠密图,稀疏图
5.完全图
1)无向完全图:无向图中,任意两个顶点之间都存在边。
n×(n-1)/2
2)有向完全图:有向图中,任意两个顶点之间都存在方向相反的两条弧。
n×(n-1)<有2倍关系>
6.
1)权:对边赋予的有意义的数值量
2)带权图(网图),非带权图
7.度,入度,出度及其与边的关系:
1)无向图——度TD(v)
在这里插入图片描述

2)有向图——入度 ID(v)、出度OD(v)
在这里插入图片描述
7.路径
1)无向图中:顶点vp和顶点vq之间的路径是一个顶点序列(vp=vi0,vi1,…, vim=vq),其中(vij-1,vij)∈E(1≤j≤m)
eg:在这里插入图片描述

2)在有向图中:从顶点vp到顶点vq的路径是一个顶点序列(vp=vi0,vi1, …, vim=vq),其中<vij-1,vij>∈E(1≤j≤m)
eg:
在这里插入图片描述
3)
简单路径:序列中顶点不重复出现的路径
简单回路(简单环):除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。
4)路径长度:
非带权图——路径上边的个数
带权图——路径上边的权值之和
8.子图
在这里插入图片描述
9.连通——对于无向图来说
1)连通顶点:在无向图中,如果顶点vi和顶点vj(i≠j)之间有路径,则称顶点vi和vj是连通的
2)连通图:在无向图中,如果任意两个顶点都是连通的(任意两个顶点之间都有路径),则称该无向图是连通图
3)连通分量:非连通图的极大连通子图
(是对无向图的划分)
PS:含有极大顶点数
依附于这些顶点的所有边
10.强连通——对于有向图来说
1)强连通图:有向图中,若对于每一对顶点vi和vj都存在一条从vi到vj和从vj到vi的路径(每个顶点之间都有两条边),此有向图为强连通图。
2)强连通分量:有向图的极大强连通子图
PS:
a)任何强连通图的强连通分量只有一个——本身
b)非强连通图则有多个强连通分量。

例题:
1.设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。
//0 n(n-1)/2 0 n(n-1)
2.在一个无向图中,所有顶点的度数之和等于所有边数的()倍
//2
3.无向图G有16条边,度为4的顶点有3个,度为3的顶点有4个,其余顶点的度均小于3,则图G至少有( )个顶点。
//11
//"顶点越少,那么每个顶点的度越大,在无向图中:边的个数的2倍=为所有顶点度数之和,故:3*4+4*3+(x-3-4)*2>=16*2
4.n个顶点的强连通图至少有()条边,其形状是()
//(强连通图——有向)n,环形

三.图的存储结构

1.图不可以采用顺序存储结构
无法通过存储位置表示:任何两个顶点之间存在的关系。
2.将点和边分开存储

邻接矩阵

邻接矩阵(也称:数组表示法):

1基本思想:
一维数组:存储图中顶点的信息
二维数组(邻接矩阵):存储图中各顶点之间的邻接关系
在这里插入图片描述
在这里插入图片描述
2.
1)无向图:
在这里插入图片描述
2)邻接点:
在这里插入图片描述
3)有向图:
在这里插入图片描述
4)网图——无向图(对称)
在这里插入图片描述
3.存储结构的定义:

#define MaxSize 10//十个顶点
typedef char DataType;
typedef struct
{
  DataType vertex[MaxSize]; //存储点
  int edge[MaxSize][MaxSize];//存储关系
  int vertexNum, edgeNum;//顶点数量 边数
} MGraph;

4.图的建立:
//输入:n个顶点,e条边
//结果:
在这里插入图片描述
1)伪代码:

算法:CreatGraph(a[n], n, e)
输入:顶点的数据a[n],顶点个数n,边的个数e
输出:图的邻接矩阵
        1. 存储图的顶点个数和边的个数;
        2. 将顶点信息存储在一维数组vertex中;
        3. 初始化邻接矩阵edge;//int edge[MaxSize][MaxSize]={0};
        4. 依次输入每条边并存储在邻接矩阵edge中:
            4.1 输入边依附的两个顶点的编号i和j;
            4.2 将“edge[i][j]和edge[j][i]”(两个)的值置为1

2)实现代码:

void CreatGraph(MGraph *G, DataType a[ ], int n, int e) 
{
    int i, j, k;
    G->vertexNum = n; G->edgeNum = e;//输入顶点的个数和边的个数
    //存储顶点信息
    for(i=0;i<G->vertexNum;i++)
    {
    	G->vertex[i]=a[i];
    }
    //1)初始化邻接矩阵
    for(i=0;i<G->vertexNum;i++)
    {
    	for(j=0;j<G->vertexNum;j++)
    	{
    		G->edge[i][j]=0;
    	}
    }
    //2)在定义时:
    //int edge[MaxSize][MaxSize]={0};

	//依次输入每一条边
	for(k=0;k<G->edgeNum;k++)
	{
		scanf("%d %d",&i,&j);//输入边依附的顶点编号
		G->edge[i][j]=1;
		G->edge[j][i]=1;
	}
}

3)图的邻接矩阵不需要销毁
图的邻接矩阵存储是静态存储分配–>在图变量退出作用域自动释放所占内存单元–>图的邻接矩阵存储无需销毁
4)存储的空间复杂度:O(n^2)
最坏情况——稀疏矩阵

邻接表

1.基本思想:
在这里插入图片描述
2.存储结构定义:

#define MaxSize 10
typedef char DataType;

//边表————邻接点组成的单链表
typedef struct EdgeNode
{
    int adjvex;                       
    struct EdgeNode *next;
} EdgeNode;
// 顶点表
typedef struct
{
    DataType vertex;
    EdgeNode *first;
} VertexNode;
//整体定义
typedef struct
{
    VertexNode adjlist[MaxSize];
    int vertexNum, edgeNum;    
} ALGraph;

3.时间复杂度:O(n+e)
4.一些问题:
1)求顶点 v 的度——顶点 v 的边表中结点的个数

p = adjlist[v].first; 
count = 0;
while (p != NULL)
{
    count++; 
    p = p->next;
}

2)求顶点 v 的所有邻接点——顶点 i 的边表中的所有结点
3)判断顶点 i 和顶点 j 之间是否存在边——测试顶点 i 的边表中是否存在数据域为 j 的结点
4)
求顶点 v 的出度——顶点 v 的出边表中结点的个数
求顶点 v 的入度——边表中数据域为 v 的结点个数
5)如何存储带权图——权值存储在边表中
在这里插入图片描述
5.图的建立
1)
在这里插入图片描述
2)伪代码:

算法:CreatGraph(a[n], n, e)
输入:顶点的数据信息a[n],顶点个数 n,边的个数 e
输出:图的邻接表
        1. 存储图的顶点个数和边的个数;
        2. 将顶点信息存储在顶点表中,将该顶点边表的头指针初始化为NULL3. 依次输入边的信息并存储在边表中:
            3.1 输入边所依附的两个顶点的编号 i 和 j;
            3.2 生成边表结点 s,其邻接点的编号为 j;
	        3.3 将结点 s 插入到第 i 个边表的表头;

3)实现代码:

void CreatGraph(ALGraph *G,DataType a[],int n,int e)
{
	int i,j,k;
	EDgeNode *s=NULL;
	G->vertexNum=n;
	G->edgeNum=e;
	//建立一个顶点表
	for(i=0;i<G->vertexNum;i++)
	{
		G->adjlist[i].vertex=a[i];
		G->adjlist.first=NULL;
	}
	//完善边表
	for(k=0;k<G->edgeNum;k++)
	{
		scanf("%d %d",&i,&j);
		s=(EdgeNode*)malloc(sizepf(EdgeNode));
		s->adjvex=j;
		s->next=G->adjlist[i].first;
		G->adjlist[i].first=s;
	}
}

6.图的销毁
//在邻接表存储中,须释放所有在程序运行过程中申请的的“边表结点”

void DestroyGraph(ALGraph *G)
{
    EdgeNode *p = NULL, *q = NULL;
    for (int i = 0; i < G->vertexNum; i++)
    {
        p = q = G->adjlist[i].first;
        while (p != NULL)
        {
              p = p->next;
              free(q); 
              q = p;
        }
    }
}

四.图的遍历
##从图中某一顶点出发访问图中所有顶,并且每个结点仅被访问一次

1.选取遍历的起始点:
将图中的顶点按任意顺序排列起来, 从编号最小的顶点开始
2.若为非连通图(不是任意两个顶点之间都有边):
多次调用图遍历算法
3.避免陷入死循环:
附设访问标志数组visited[n](记录访问的次数)
4.访问次序:
深度优先遍历
广度优先遍历

1.深度优先遍历:(递归)(用栈)
1)基本思想:
a)访问顶点 v
b)从 v 的未被访问的邻接点中选取一个顶点 w,从 w 出发进行深度优先遍历
c)重复上述两步,直至访问所有和 v 有路径相通的顶点
2)伪代码:

算法:DFTraverse
输入:顶点的编号 v
输出:1. 访问顶点 v ; 修改标志visited[v] = 1;
       2. w =顶点 v 的第一个邻接点;
       3. while (w 存在) 
           3.1 if (w 未被访问) 从顶点 w 出发递归执行该算法;
           3.2 w = 顶点 v 的下一个邻接点;

3.1)实现代码:
//邻接矩阵
//void DFTraverse(MGraph *G, int v)【顶点编号V0】

void DFTraverse(MGraph *G, int v)        /*全局数组变量visited[n]已初始化为0*/
{
    printf("%c ", G->vertex[v]); visited[v] = 1;//输出顶点的值,并将标记为设为1
    for (int j = 0; j < G->vertexNum; j++)//不知道每一个顶点有多少条边
    {
    	//无向图:v行,v列均可
    	//有向图:(需要看“出度”,才能到达)必须为v行,故此处都用“行”
    	if (G->edge[v][j] == 1 && visited[j] == 0) //j相当于v的下角标
        {
        	DFTraverse(G, j);
        }
    }
}

3.2)实现代码
//邻接表

void DFTraverse(ALGraph *G, int v)
{
    EdgeNode *p = NULL;
    int j;
    printf("%c ", G->adjlist[v].vertex);  
    visited[v] = 1;
    p = G->adjlist[v].first;         
    while (p != NULL)
    { 
        j = p->adjvex;
        if (visited[j] == 0) 
        {
        	DFTraverse(G, j);
        }
        p = p->next;           
    }
}

2.广度优先:(用队列)(类似于层序遍历——先进来一个V0,V0出队的时候它的所有可一步到达的点全都进来)
1)基本思想:
⑴ 访问顶点 v
依次访问 v 的各个未被访问的邻接点 v1 , v2 , …, vk
分别从 v1 , v2 , …, vk 出发依次访问它们未被访问的邻接点,直至访问所有与顶点 v 有路径相通的顶点
在这里插入图片描述
//邻接矩阵
2.1)伪代码:

算法:BFTraverse
输入:顶点的编号 v
输出:无
       1. 队列 Q 初始化;
       2. 访问顶点 v ; 修改标志visited [v] = 1; 顶点 v 入队列 Q;
       3. while (队列 Q 非空) 
          3.1 v = 队列 Q 的队头元素出队;
          3.2 w = 顶点 v 的第一个邻接点;
          3.3 while (w 存在) 
                3.3.1 如果 w 未被访问,则访问顶点 w ; 修改标志visited[w] = 1; 顶点 w 入队列 Q;
                3.3.2 w = 顶点 v 的下一个邻接点;

3.1)实现代码:
//邻接矩阵

void BFTraverse(MGraph *G, int v)         /*全局数组变量visited[n]已初始化为0*/
{
    //队列————int
    int i, j, Q[MaxSize];/*采用顺序队列,存储顶点编号*/                       
    int front = rear = -1;/*初始化顺序队列*/                              
    printf("%c ", G->vertex[v]); 
    visited[v] = 1;  
    Q[++rear] = v;  
    while (front != rear)/*当队列非空时*/
    {
         i = Q[++front];  
         for (j = 0; j < G->vertexNum; j++)
         {
             if (G->edge[i][j] == 1 && visited[j] == 0 ) //有边且没有被访问过
             {
                 printf("%c ", G->vertex[j]); 
                 visited[j] = 1; //标志已经被访问过
                 Q[++rear] = j;//入队
             }
    }
}

//邻接表
2.2)伪代码:

算法:BFTraverse
输入:顶点的编号 v
输出:无
       1. 队列 Q 初始化;
       2. 访问顶点 v ; 修改标志visited [v] = 1; 顶点 v 入队列 Q;
       3. while (队列 Q 非空) 
          3.1 i = 队列 Q 的队头元素出队;
          3.2 j = 顶点 v 的第一个邻接点;
          3.3 while (j 存在) 
                3.3.1 如果 j 未被访问,则访问顶点 j ; 修改标志visited[j] = 1; 顶点 j 入队列 Q;
                3.3.2 j = 顶点 i 的下一个邻接点;

3.2)实现代码:

void BFTraverse(ALGraph *G, int v) 
{
    EdgeNode *p = NULL;
    int Q[MaxSize], front = rear = -1, i, j;   
    printf("%c ", G->adjlist[v].vertex); 
    visited[v] = 1; 
    Q[++rear] = v; 
	while (front != rear)
	{
	    i = Q[++front];
		p = G->adjlist[i].first; 
        while (p != NULL) 
        {
            j = p->adjvex;           
            if (visited[j] == 0) 
			{
                printf("%c ", G->adjlist[j].vertex); 
                visited[j] = 1; 
                Q[++rear] = j;
            }
            p=p->next;
       }
	}  
}

4)讨论:
a.深度优先搜索结果唯一吗?
在这里插入图片描述

例题

问题描述】

输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
实验要求:在程序中定义下述函数,并实现要求的函数功能:
   CreateGraph(): 按从键盘输入的顶点数和边数建立图
   DFSGrahp():深度优先遍历图
   BFSGrahp():广度优先遍历图
实验提示:
  图的存储可采用邻接表或邻接矩阵,若采用邻接表存储,“要求边链表中结点按顶点序号递增次序排列;”<保证输出结果唯一>
【输入形式】
首先输入一个n表示有n个节点(1-n)编号,再输入一个 m 表示下边接下来 m 行,每行两个整数 a b,表示a b有条无向边。
【输出形式】
第一行输出1号节点开始的深度优先遍历结果(DFS),第二行输出1号节点开始的广度优先遍历结果(BFS)
//(无向图)输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
//为了好定义,下面输入的n不能在现在用于结构体里数组的定义 

//1.存储结构的定义
//1)边表---邻接点组成的单链表
typedef struct EdgeNode
{
	int adjvex;
	struct EdgeNode *next;
}EdgeNode; 
//2)顶点表 
typedef struct
{
	int vertex;
	EdgeNode *first;//统一格式 
}VertexNode;
//3)整体定义
typedef struct
{
	VertexNode adjlist[MaxSize];//MaxSize=n相当于顶点的个数
	int vertexNum;//vertexNum==n;
	int edgeNum;//edgeNum==m; 
}ALGraph; 
int visited[MaxSize]={0};
//2.图的建立 
ALGraph CreatGraph(ALGraph G,int n,int m)
			  /*图:G(有一个顶点表) 
				int n,int m:将点和边的数量传递过来 
			  */ 
{
	int i,a,b,t,j,count;
	EdgeNode *s=NULL;
	EdgeNode *p=NULL;
	G.vertexNum=n;
	G.edgeNum=m;
	
	//建立一个顶点表
	for(i=1;i<=G.vertexNum;i++)
	{
		G.adjlist[i].vertex=i;
		G.adjlist[i].first=NULL;
	} 
	//完善边表
	for(i=1;i<=G.edgeNum;i++)
	{
		scanf("%d %d",&a,&b);
		count=0;
		for(j=0;j<2;j++)
		{
			if(count!=0)
			{
				t=a;
				a=b;
				b=t;
			}
			p=G.adjlist[a].first;
			if(p==NULL)
			{
				s=(EdgeNode*)malloc(sizeof(EdgeNode));
				s->adjvex=b;
				s->next=G.adjlist[a].first;
				G.adjlist[a].first=s;
			}
			else
			{
				while(b>p->adjvex&&p->next!=NULL)
				{
					p=p->next;
				}
				s=(EdgeNode*)malloc(sizeof(EdgeNode));
				s->adjvex=b;
				s->next=p->next;
				p->next=s;
				if(s->adjvex<p->adjvex)
				{
					t=s->adjvex;
					s->adjvex=p->adjvex;
					p->adjvex=t;
				}
			}
			count++;
		}
	}  
	return G;
} 
//3.遍历
/*
深度优先:
从 v 的未被访问的邻接点中选取一个顶点 w,从 w 出发进
行深度优先遍历 

广度优先:
依次访问v的各个未被访问的邻接点 
*/ 

//1.2)深度优先(递归)
void DFSGrahp(ALGraph G,int v)
{
	EdgeNode *p = NULL;
    printf("%d ", G.adjlist[v].vertex);  
    visited[v] = 1;
    p = G.adjlist[v].first;         
    while (p != NULL)
    { 
        if (visited[p->adjvex] == 0) 
        {
        	DFSGrahp(G,p->adjvex);
        }
        p = p->next;           
    }
}
//2)广度优先
void BFSGrahp(ALGraph G,int v)
{
	int visited[MaxSize]={0};
	EdgeNode *p=NULL;
	int Q[MaxSize],i,j;
	int front=-1,rear=-1;
	printf("%d ",G.adjlist[v].vertex);
	visited[v]=v;
	Q[++rear]=v;
	while(front!=rear)
	{
		i=Q[++front];//i=G->adjlist[0].vertex
		p=G.adjlist[i].first;
		while(p!=NULL)
		{
			j=p->adjvex;
			if(visited[j]==0)
			{
				printf("%d ",G.adjlist[j].vertex);
				visited[j]=1;
				Q[++rear]=j;
			}
			p=p->next;
		}
	}
}
int main()
{
	int n,m;//n个结点,m条边
	scanf("%d %d",&n,&m);
	//创建一个图 
    ALGraph G;
	G=CreatGraph(G,n,m);
	//遍历
	int v=1;
	DFSGrahp(G,v);
	printf("\n");
	BFSGrahp(G,v);

	return 0; 
} 

【样例输入】
6 8
1 5
5 2
2 6
1 4
4 5
2 3
3 6
4 3

【样例输出】
1 4 3 2 5 6
1 4 5 3 2 6

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的基本知识点及遍历代码 的相关文章

  • License授权方案

    源码地址 https github com sixj0 license 解决的问题 将项目卖给其他公司 需要将jar包在客户的服务器上部署 为了避免客户将项目jar包进行二次售卖 或者我们需要控制项目的使用期限 比如控制项目只能运行一年 这
  • Windows中PostgreSQL数据库的备份和还原

    1 备份 通过cmd命令窗口进入到PostgreSQL安装目录下的bin目录下 然后 输入以下命令 2 还原 也是通过cmd命令窗口进入到PostgreSQL安装目录下的bin目录下 然后输入以下命令即可 但在还原数据库之前 需要提前建立一

随机推荐

  • 系统架构设计高级技能 · 系统质量属性与架构评估

    系列文章目录 系统架构设计高级技能 软件架构概念 架构风格 ABSD 架构复用 DSSA 一 系统架构设计师 系统架构设计高级技能 系统质量属性与架构评估 二 系统架构设计师 系统架构设计高级技能 软件可靠性分析与设计 三 系统架构设计师
  • Spring @Async:SpringBoot 自定义线程池,修改springboot的默认线程池

    1 自定义线程池 1 1 修改application properties task pool corePoolSize 20 task pool maxPoolSize 40 task pool keepAliveSeconds 300
  • AD17铺铜时颜色偏暗

    AD17铺铜是颜色很暗 刚开始接触AD17时 使用起来很不熟练 铺铜是遇到了这个问题 正确的样子是如图一所示 偏暗的样子是如图二所示 图一 图二 如何解决这个问题呢 只需要简单一步就可以 将工具栏上的Altium transparent 2
  • MATLAB 学习资料整理

    MATLAB学习资料集合 https www ilovematlab cn thread 265500 1 1 html MATLAB官网文档 https ww2 mathworks cn help matlab index html MA
  • VBA第二种方法实现对比

    Sub check Click Dim ws1 As Worksheet ws2 As Worksheet Dim r1 As Range r2 As Range Dim cell1 As Range cell2 As Range Dim
  • opencv只能用python2不能用python3

    问题如图 感觉可以修改某个环境变量来调整 但是我不会 只好用笨办法了 下载了python3支持的opencv版本
  • 426 将二叉搜索树转化为排序的双向链表

    题目描述 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 对于双向循环列表 你可以将左右孩子指针作为双向循环链表的前驱和后继指针 第一个节点的前驱是最后一个节点 最后一个节点的后继是第一个节点 特别地 我们希望可以 就地 完成转换
  • windows下写入文本换行符\r\n修改为linux下换行符\n

    最近一段时间经常使用python向文本写入数据 但是windows下换行符默认为 r n 而linux下换行符为 n 写入的文本要在linux下调用 这就很坑人了 代码前行的路上怎么能被小小石头绊倒 于是乎搜索了一通 发现这个事情仅需要几行
  • Latex 带圈数字

    我们写作大论文等中文文档 一般都会调用ctex类库 可能描述不准确 它一般已经调用了fontspec 带圈的数字0 20 在unicode字符集中已经有了 但是只有一部分字体包含了 比如 Cambria 所以我们使用带圈文字的时候 直接调用
  • tcym4

    aHR0cHM6Ly93d3cudmVyeWJpbi5jb20vPzQzZjZiYThlYTU5NzcxZGEjeVhtbjN5em43YVVPLzlKYUVrK3JWdWE3SXA2ck9HWHlock5BbkFzL2hyaz0 复制下方
  • CTFHub-WEB-文件上传

    目录 1 无限制 2 前端验证 编辑 3 htaccess 4 MIME验证 5 文件头检查 6 00截断 7 双写后缀 1 无限制 进入靶场环境中看到有上传文件的选项 本关写明无限制所以我们直接上传php后门文件 上传成功后用蚁剑连接 这
  • JVM深入理解内部类

    原文链接 https blog csdn net Hacker ZhiDian article details 82193100 原文链接 https blog csdn net coder what article details 893
  • echarts分裂地图与线性动画

    前言 如果没有geoJSON数据 可以去 datav官网 导出 定义数据结构 const pointsDataArr name 鄂州 展示的名称 routeName region 黄冈 lable 黄冈线 value 10 路线 value
  • FLAGS标志寄存器

    标志寄存器 Flags Register FR 又称程序状态字 Program Status Word PSW 这是一个存放条件标志 控制标志寄存器 主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行 CF Carry Flag
  • Python实现SSA智能麻雀搜索算法优化XGBoost回归模型(XGBRegressor算法)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 视频讲解 如需数据 代码 文档 视频讲解可以直接到文章最后获取 1 项目背景 麻雀搜索算法 Sparrow Search Algorithm SSA 是一种新型的群智能优化算法 在202
  • 数字化转型时代—人人必学的7项商业分析思维

    月説小飞象交流会 人生总有不期而遇的温暖和生生不息的希望 内部交流 29期 数字化转型时代 人人必学的7项商业分析思维 data analysis 分享人 Sophia 数字化时代 数据连接一切 数据驱动一切 数据重塑一切 数据是企业数字化
  • 【计算机网络 -- 期末复习】

    例题讲解 IP地址 必考知识点 子网掩码 子网划分 第一栗 子网划分题目的答案一般不唯一 我们主要采用下方的写法 第二栗 路由跳转 数据传输 栗1 栗2 CSMA CD数据传输 路由转发 2 比特率与波特率转换 四相位表示 四种变化来表示四
  • Mybatis课堂笔记-狂神说

    Mybatis 环境 JDK1 8 Mysql 5 7 maven 3 8 4 IDEA 回顾 JDBC Mysql Java基础 Maven Junit 课堂源码及笔记 https gitee com mileschen02 mybati
  • python 基本操作注意事项

    一 缩进与空格 二 编写规范 1 注释 2 符合规范性 命名要见名知意 3 不要用关键字命名 三 PEP8编码规范 1 收藏 https www python org dev peps pep 0008 2 可读性 可维护性
  • 图的基本知识点及遍历代码

    图 一 引出 1 七桥问题 欧拉回路判定规则 如果通奇数桥的地方多于两个 则不存在欧拉回路 如果只有两个地方通奇数桥 可以从这两个地方之一出发 找到欧拉回路 如果没有一个地方是通奇数桥的 则无论从哪里出发 都能找到欧拉回路 二 基本概念 1