【数据结构基础笔记】【图】

代码参考《妙趣横生的算法.C语言实现》

文章目录

  • 前言
  • 1、图的概念
  • 2、图的存储形式
    • 1、邻接矩阵:
    • 2、邻接表
    • 3、代码定义邻接表
  • 3、图的创建
  • 4、深度优先搜索DFS
  • 5、广度优先搜索BFS
  • 6、实例分析


前言

本章总结:图的概念、图的存储形式、邻接表定义、图的创建、图的遍历(DFS、BFS)、
以及最后给出一个实例分析


1、图的概念

图是由顶点的非空有限集合V与边的集合E(顶点之间的关系)所构成。
图分为有向图和无向图。

2、图的存储形式

最常见的两种:邻接矩阵、邻接表

1、邻接矩阵:

利用两个数组来存储一个图。
第一个数组为一维数组,用来存放图中的数据。vertex[0,1,…,n-1]:存储顶点信息
第二个数组为二维数组,用来存储顶点的相互关系,称为邻接矩阵。
A[i][j]={1,当顶点i与顶点j之间有边 0,当顶点i与顶点j之间没有边}

有向图
有向图的邻接矩阵

通过简单的邻接矩阵就可以把一个复杂的图关系表现出来,不过该方法不适合存储稀疏图(边数目少的图)

2、邻接表

邻接表由链表和顺序数组组成。链表用来存放边的信息,数组用来存放顶点的数据信息。
每一个顶点分别建立一个链表。
每个链表前面设置一个头结点,顶点域vertex用来存放顶点数据信息,指针域next指向依附于顶点vertex的第一条边。

vertexnext

每一个链表中,链表的每一个结点陈伟边结点,表示依附于对应顶点的一条边。adjvex域存放该边的另一端顶点在顶点数组中的位置(数组下标);weight存放边的权重;next指向下一条边结点,若是最后一个边结点,则指向NULL;

adjvexweightnext
																			分别对应了头结点以及边结点:
有向图
有向图的邻接表

3、代码定义邻接表

//邻接表定义
#define MAX_VERTEX_NUM 20		//指定图中顶点最大的个数为20
typedef struct ArcNode
{//单链表中结点类型int adjvex;					//该边指向顶点在顺序表中的位置(数组下标)struct ArcNode *next;		//指向下一条边的指针infoType *weight;			//边上的权重
}ArcNode;typedef struct VNode
{//顶点类型VertexType data;			//顶点中的数据信息,为VertexType类型ArcNode *firstarc;			//指向单链表,即指向一条边
}VNode;VNode G[MAX_VERTEX_NUM];		//VNode类型的数组G,它是图中顶点的存储容器。

3、图的创建

图的创建就是创建一个基于邻接表存储的图结构。在此之前,必须先设计好图的逻辑结构。
步骤:
1、创建图的顶点,也就是创建存储图中顶点的顺序表
2、创建顶点之间的边,也就是创建单链表。
代码描述如下:
1、首先向顶点中赋值。通过Getdata得到每个顶点中的数据,并将它赋值到G[i].data中去。
每个顶点的firstarc域要初始化为NULL
2、然后创建顶点之间的边。创建时应该严格按照最开始所设计的图的逻辑结构进行边的输入。
创建边的过程与创建链表的过程类似。
当输入-1时,表示该顶点依附的边创建完成

//图的创建
GreatGraph(int n,VNode G[])
{int i,e;ArcNode *p,*q;printf("输入顶点信息\n");for(i=0;i<n;i++){					Getdata(G[i]);			//得到每条顶点中的数据	G[i].firstarc=NULL;		//初始化每一个顶点第一条边为空}for(i=0;i<n;i++){printf("创建第%d个顶点的边");scanf("%d",&e);			//输入边指向的顶点坐标while(e!=-1){p=(ArcNode *)malloc(sizeof(ArcNode));		//创建一条边p->next =NULL;		//链表结点next指向空p->adjvex = e;		//将该边指向顶点的信息赋值给adjvexif(G[i].firstarc == NULL)G[i].firstarc=p;	//i结点的第一条边else q->next = p;q=p;scanf("%d",&e);}}
}//如果是创建上面提到过的有向图,则:
void main()
{VNode G[3];CreatGpraph(3,G);
}

4、深度优先搜索DFS

图的遍历:从图的某一顶点出发,访遍图中其余顶点,且使每个顶点只被访问一次。
图的遍历可用于 求解图的连通性问题,拓扑排序,求解最短路径,求解关键路径

深度优先搜索的基本思路:
从图中的某个顶点v出发,访问该顶点v,然后再一次从v的未被访问过的邻接点出发,继续优先深度优先遍历该图,直到图中与顶点v路径相通的顶点都被访问到为止。
由于一个图结构未必是连通的,因此一次的深度优先搜索不一定可以遍历到图中所有的顶点,若此时图中仍然有顶点未被访问,
就另选图中的一个没有被访问到的顶点作为起始点,继续深度优先搜索。
重复上述操作,直到图中所有顶点都被访问到为止。
深度优先搜索是一个递归操作,重复“访问顶点v,再依次从v未被访问过的邻接点出发继续深度优先搜索”

//代码描述
/*
深度优先搜索一个连通图
*/
void DFS(VNode G[],int v)
{int w;visit(v);				//访问当前顶点visited[v] =1;			//将顶点v对应的访问标记置1w=FirstAdj(G,v);		//找到顶点v的第一个邻接点,如果无邻接点返回-1while(w!=-1){if(visited[w]==0)	//如果该顶点未被访问{DFS(G,w);		//递归地进行深度优先访问w=NextAdj(G,v); //找到顶点v的下一个邻接点,如果没有返回-1}}
}//对图中G=(V,E)进行深度优先搜索的主算法
void Travel_DFS(VNode G[],int visited[],int n)
{int i;for(i=0;i<n;i++)visited[i]=0;		//将标记数组初始化为0for(i=0;i<n;i++)if(visited[i]==0)  	//若有顶点未被访问,从该顶点开始继续深度优先搜索DFS(G,i);
}

Travel_DFS 函数包含了3个参数
G[]表示存储图结构的容器,这里可以理解为邻接表
visited[]为设置的方位标志数组,用来标记图中被访问过的顶点
n表示图中的顶点个数。
将visited初始化为0,因为一开始时,图中的任何定点都没有被访问。
然后从第一个没有被访问的顶点开始调用递归函数DFS,从该顶点开始深度优先遍历整个图
之所以不能仅仅通过一个递归函数DFS()来遍历整个图,是因为DFS只能遍历到从起始顶点v开始所有与v相连通的图的顶点。
如果这个图不是连通的,仅仅通过DFS是无法遍历完全的

可以举个例子来描述详细遍历过程:
在这里插入图片描述

假设以V0为起点,访问标志数组初始值为visited[5]={0,0,0,0,0};
{(1)访问顶点V0,visited[5]=1,0,0,0,0(2)用函数FirstAdj得到V0第一个邻接点,如V1(3)如果不返回-1,即有邻接点(3.1)访问顶点V1,visited[5]=1,1,0,0,0(3.2)用函数FirstAdj得到V1第一个邻接点,V2(因为V0已经访问过了)(3.3)如果不返回-1,即有邻接点(3.3.1)访问顶点V2,visited[5]=1,1,1,0,0(3.3.2)用函数FirstAdj得到V2第一个邻接点,返回-1,因为都被访问过了(3.4)用函数NextAdj()得到V1下一个邻接点返回-1,因为都被访问过儿(4)用函数NextAdj()得到V0下一个邻接点返回-1,因为都被访问过儿\begin{cases} (1)& \text{访问顶点V0,visited[5]={1,0,0,0,0}}\\ (2)& \text{用函数FirstAdj得到V0第一个邻接点,如V1}\\ (3)& \text{如果不返回-1,即有邻接点}\\ (3.1)& \text{访问顶点V1,visited[5]={1,1,0,0,0}}\\ (3.2)& \text{用函数FirstAdj得到V1第一个邻接点,V2(因为V0已经访问过了)}\\ (3.3)& \text{如果不返回-1,即有邻接点}\\ (3.3.1)& \text{访问顶点V2,visited[5]={1,1,1,0,0}}\\ (3.3.2)& \text{用函数FirstAdj得到V2第一个邻接点,返回-1,因为都被访问过了}\\ (3.4)& \text{用函数NextAdj()得到V1下一个邻接点返回-1,因为都被访问过儿}\\ (4)& \text{用函数NextAdj()得到V0下一个邻接点返回-1,因为都被访问过儿}\\ \end{cases}(1)(2)(3)(3.1)(3.2)(3.3)(3.3.1)(3.3.2)(3.4)(4)访问顶点V0visited[5]=1,0,0,0,0用函数FirstAdj得到V0第一个邻接点,如V1如果不返回-1,即有邻接点访问顶点V1visited[5]=1,1,0,0,0用函数FirstAdj得到V1第一个邻接点,V2(因为V0已经访问过了)如果不返回-1,即有邻接点访问顶点V2visited[5]=1,1,1,0,0用函数FirstAdj得到V2第一个邻接点,返回-1,因为都被访问过了用函数NextAdj()得到V1下一个邻接点返回-1,因为都被访问过儿用函数NextAdj()得到V0下一个邻接点返回-1,因为都被访问过儿

5、广度优先搜索BFS

广度优先搜索基本思路:
从图中的指定顶点v出发,先访问顶点v,然后依次访问v的各个未被访问的邻接点,然后从这些邻接点出发,按照同样的原则依次访问它们未被访问的邻接点
如此循环,直道图中所有与v相连通的邻接点都被访问。
若此时图中仍有顶点未被访问,就另选图中的一个没有被访问到的顶点作为起始点,继续广度优先搜索,直道图中所有顶点都访问完为止。

深度优先特点:从一个顶点深入下去,深入到不能再深入下去为止,再从另一个未被访问过的顶点深入下去。
广度优先特点:按层次遍历的方法,即先访问离顶点v0最近的顶点v1,v2,v3,…再逐一访问离v1 v2 v3 …最近的顶点

算法思路:

【A】
1、访问顶点v
2、每访问到一个顶点。都将对应的访问标签置1
3、将一杯访问过的顶点v入队列
【B】
循环执行以下操作:
1、从队列中取出队头元素(顶点v)
2、得到该顶点的第一个邻接点
3、如果该邻接点还没被访问、则访问,并入队列,访问标记置1
4、求顶点v的下一个邻接点,如果存在邻接点,则跳回步骤3,如果不存在邻接点,跳回到步骤1
循环执行上述操作,直到队列取空为止。
一旦队列取空则表明最后访问到的顶点已经没有未访问到的邻接点了

代码描述:

void BFS(VNode G[],int v)
{int w;visit(v);				//访问顶点vvisited[v]=1;			//将顶点v对应的访问标记置1EnQueue(q,v);			//顶点v入队列while(!emptyQ(q)){DeQueue(&q,&v);		//出队列,元素由v返回w = FirstAdj(G,v);	//找到顶点v的第一个邻接点,如果无邻接点返回-1while(w!=-1){if(visited[w]==0){visit(w);EnQueue(q,w);	//顶点w入队列visited[w]=1;}w=NextAdj(G,v);		//找到顶点v的下一个邻接点,如果无邻接点,返回-1}}
}//对图G=(V,E)进行广度优先搜索的主要算法
void Travel_BFS(VNode G[],int visited[],int n)
{int i;for(i=0;i<n;i++){visited[0]=0;			//标记数组初始化为0}for(i=0;i<n;i++){if(visited[i]==0)		//如果顶点未被访问到,从该顶点开始继续广度优先搜索BFS(G,i);}
}
/*
BFS实现广度优先搜索一个连通的图,参数G[]表示图的存储容器,即邻接表
v表示广度优先遍历访问起点

可以举个例子来描述详细遍历过程:
在这里插入图片描述

1、visit(V0),visited[5]={1,0,0,0,0} queue: V0
2、QueOut(V0),Firstadj(V0)=V1,visit(V1) queue:
3、visit(V1),visited[5]={1,1,0,0,0} queue: V1
4、NextAdj(V0)=V2,visit(V2) queue: V1
5、visit(V2),visited[5]={1,1,1,0,0} queue: V1,V2
6、NextAdj(V0)=-1 queue: V1,V2
7、QueOut(V1),Firstadj(V1)=V3,visit(V3) queue: V2
8、visit(V3),visited[5]={1,1,1,1,0} queue: V2,V3
9、NextAdj(V1)=V4,visit(V4) queue: V2,V3
10、visit(V4),visited[5]={1,1,1,1,1} queue: V2,V3,V4
11、NextAdj(V1)=-1 queue: V2,V3,V4
12、QueOut(V2),Firstadj(V2)=-1 queue: V3,V4
14、QueOut(V3),Firstadj(V3)=-1 queue:V4
15、QueOut(V4),Firstadj(V4)=-1 queue:
此数据结构为二叉树结构,所以广度优先搜索适用于对树结构的遍历,因为树结构是标准的层次结构

注意,我们这里的遍历是按照图中每个顶点之间的关系对一个图的各连通分量进行的遍历,而不只是对图中的每个顶点进行访问那么简单。图的遍历可能带有其他操作如:计算带权有向图边权之和,记录有向图顶点访问轨迹,记录两顶点之间的边权值问题,都必须依赖图的遍历。

6、实例分析

这里实例化上面涉及到的两个函数FirstAdj()和NextAdj();
FirstAdj():
功能:返回顶点的第一个邻接点在数组G的下标,如果该顶点无邻接点,返回-1

//返回第一个邻接点在数组中的下标
int FirstAdj(VNode G[],int v)
{if(G[v].firstarc!=NULL) return (G[v].firstarc)->adjvex;	//如过该结点有第一条边,返回下标,否则返回-1return -1;
}

NextAdj():
功能:返回顶点的下一个邻接点在数组G的下标,如果该顶点无邻接点,或者该点所有邻接点都被访问过,返回-1

//返回下一个邻接点在数组中的下标
int NextAdj(VNode G[],int v)
{ArcNode *p;p=G[v].firstarc;while(p!=NULL){if(visited[p->adjvex]) p=p->next;		//如果已经访问过,返回-1else return p->adjvex;}return -1;
}

用邻接表存储的形式创建一棵无向图,并应用深度优先搜索方法遍历该图中的每个顶点
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#include "conio.h"//邻接表定义
#define MAX_VERTEX_NUM 20		//指定图中顶点最大的个数为20
typedef int VertexType ;
typedef struct ArcNode
{//单链表中结点类型int adjvex;					//该边指向顶点在顺序表中的位置(数组下标)struct ArcNode* next;		//指向下一条边的指针//infoType* weight;			//边上的权重
}ArcNode;typedef struct VNode
{//顶点类型VertexType data;			//顶点中的数据信息,为VertexType类型ArcNode* firstarc;			//指向单链表,即指向一条边
}VNode;VNode G[MAX_VERTEX_NUM];		//VNode类型的数组G,它是图中顶点的存储容器。
int visited[5] = { 0,0,0,0,0 };//图的创建
void GreatGraph(int n, VNode G[])
{int i, e;ArcNode* p, * q;q = NULL;printf("输入顶点信息\n");for (i = 0;i < n;i++){scanf("%d", &G[i].data);			//得到每条顶点中的数据	G[i].firstarc = NULL;		//初始化每一个顶点第一条边为空}for (i = 0;i < n;i++){printf("创建第%d个顶点的边\n",i);scanf("%d", &e);			//输入边指向的顶点坐标while (e != -1){p = (ArcNode*)malloc(sizeof(ArcNode));		//创建一条边p->next = NULL;		//链表结点next指向空p->adjvex = e;		//将该边指向顶点的信息赋值给adjvexif (G[i].firstarc == NULL)G[i].firstarc = p;	//i结点的第一条边else{q->next = p;}q = p;scanf("%d", &e);}}
}
//返回第一个邻接点在数组中的下标
int FirstAdj(VNode G[], int v)
{if (G[v].firstarc != NULL) return (G[v].firstarc)->adjvex;	//如过该结点有第一条边,返回下标,否则返回-1return -1;
}//返回下一个邻接点在数组中的下标
int NextAdj(VNode G[], int v)
{ArcNode* p;p = G[v].firstarc;while (p != NULL){if (visited[p->adjvex]) p = p->next;		//如果已经访问过,返回-1else return p->adjvex;}return -1;
}void DFS(VNode G[], int v)
{int w;printf("%d ", G[v].data);		//访问当前顶点,打印出顶点额数据信息visited[v] = 1;			//将顶点v对应的访问标记置1w = FirstAdj(G, v);		//找到顶点v的第一个邻接点,如果无邻接点返回-1while (w != -1){if (visited[w] == 0)	//如果该顶点未被访问{DFS(G, w);		//递归地进行深度优先访问}w = NextAdj(G, v); //找到顶点v的下一个邻接点,如果没有返回-1}
}/*
1、首先向顶点中赋值。通过Getdata得到每个顶点中的数据,并将它赋值到G[i].data中去。
每个顶点的firstarc域要初始化为NULL
2、然后创建顶点之间的边。创建时应该严格按照最开始所设计的图的逻辑结构进行边的输入。
创建边的过程与创建链表的过程类似。
当输入-1时,表示该顶点依附的边创建完成
*/
int main()
{VNode G[5];GreatGraph(5, G);printf("DFS搜索\n ");DFS(G, 0);_getche();return 0;
}

效果:
在这里插入图片描述

放几个链接,学习学习

https://blog.csdn.net/ledou2/article/details/81875743
https://blog.csdn.net/ledou2/article/details/81905831

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

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

相关文章

第十六章 测试基础

第十六章 测试基础 在编译型语言中&#xff0c;需要不断重复编辑、编译、运行的循环。 在Python中&#xff0c;不存在编译阶段&#xff0c;只有编辑和运行阶段。测试就是运行程序。 先测试再编码 极限编程先锋引入了“测试一点点&#xff0c;再编写一点点代码”的理念。 换而…

如何蹭网

引言蹭网&#xff0c;在普通人的眼里&#xff0c;是一种很高深的技术活&#xff0c;总觉得肯定很难&#xff0c;肯定很难搞。还没开始学&#xff0c;就已经败给了自己的心里&#xff0c;其实&#xff0c;蹭网太过于简单。我可以毫不夸张的说&#xff0c;只要你会windows的基本操…

android对象缓存,Android简单实现 缓存数据

前言1、每一种要缓存的数据都是有对应的versionCode&#xff0c;通过versionCode请求网络获取是否需要更新2、提前将要缓存的数据放入assets文件夹中&#xff0c;打包上线。缓存设计代码实现/*** Created by huangbo on 2017/6/19.** 主要是缓存的工具类** 缓存设计&#xff1a…

通信原理.绪论

今天刚上通信原理的第一节课&#xff0c;没有涉及过多的讲解&#xff0c;只是讲了下大概的知识框架。现记录如下&#xff1a; 目录1、基本概念消息、信息与信号2、通信系统模型1、信息源2、发送设备3、信道4、接收设备5、信宿6、模拟通信系统模型7、数字通信系统模型8、信源编…

Android版本演进中的兼容性问题

原文&#xff1a;http://android.eoe.cn/topic/summary Android 3.0 的主要变化包括: 不再使用硬件按键进行导航 (返回、菜单、搜索和主屏幕)&#xff0c;而是采用虚拟按键 (返回&#xff0c;主屏幕和最近的应用)。在操作栏固定菜单。 Android 4.0 则把这些变化带到了手机平台。…

css rgba透明_rgba()函数以及CSS中的示例

css rgba透明Introduction: 介绍&#xff1a; Functions are used regularly while we are developing a web page or website. Therefore, to be a good developer you need to master as many functions as you can. This way your coding knowledge will increase as well …

第十七章 扩展Python

第十七章 Python什么都能做&#xff0c;真的是这样。这门语言功能强大&#xff0c;但有时候速度有点慢。 鱼和熊掌兼得 本章讨论确实需要进一步提升速度的情形。在这种情况下&#xff0c;最佳的解决方案可能不是完全转向C语言&#xff08;或其他中低级语言&#xff09;&…

android studio资源二进制,无法自动检测ADB二进制文件 – Android Studio

我尝试在Android Studio上测试我的应用程序,但我遇到了困难"waiting for AVD to come online..."我读过Android设备监视器重置adb会做到这一点,它确实……对于1次测试,当我第二天重新启动电脑时,我不仅仅是&#xff1a;"waiting for AVD to come online..."…

犀牛脚本:仿迅雷的增强批量下载

迅雷的批量下载满好用。但是有两点我不太中意。在这个脚本里会有所增强 1、不能设置保存的文件名。2、不能单独设置这批下载的线程限制。 使用方法 // 下载从编号001到编号020的图片&#xff0c;保存名为猫咪写真*.jpg 使用6个线程 jdlp http://bizhi.zhuoku.com/bizhi/200804/…

为什么使用1 * 1 的卷积核

为什么使用 1* 1卷积核&#xff1f; 作用&#xff1a; 1、实现跨通道的交互和信息整合 2、 进行卷积核通道数的降维和升维 3、 在保持feature map尺度不变的&#xff08;即不损失分辨率&#xff09;的前提下大幅增加非线性特性 跨通道的交互和信息整合 使用1 * 1卷积核&a…

KingPaper初探ThinkPHP3.1.2之扩展函数库和类库的使用(四)

在我们做项目的时候TP的系统函数或系统类库满足不了我们的需要 所以有些东西需要我们自己去定义&#xff0c;在TP中我们怎么使用自己的函数库和类库呢&#xff1f;在TP系统中提供了三个系统函数库 common.php是全局必须加载的基础函数库&#xff0c;在任何时候都可以直接调用&a…

isfinite函数_isfinite()函数以及C ++中的示例

isfinite函数C isfinite()函数 (C isfinite() function) isfinite() function is a library function of cmath header, it is used to check whether the given value is a finite value or not? It accepts a value (float, double or long double) and returns 1 if the v…

android 服务端 漏洞,安卓漏洞 CVE 2017-13287 复现详解-

2018年4月&#xff0c;Android安全公告公布了CVE-2017-13287漏洞。与同期披露的其他漏洞一起&#xff0c;同属于框架中Parcelable对象的写入(序列化)与读出(反序列化)的不一致所造成的漏洞。在刚看到谷歌对于漏洞给出的补丁时一头雾水&#xff0c;在这里要感谢heeeeenMS509Team…

某公司面试题

一、基础题 1&#xff0c;冯诺依曼结构的计算机硬件逻辑组成中&#xff0c;不包含以下哪个模块&#xff1f; A&#xff0c;编译器 B&#xff0c;控制器 C&#xff0c;输入设备 D&#xff0c;输出设备 解释&#xff1a;冯诺依曼由五个模块组成&#xff1a;输入设备 输出设备 存…

GAP(全局平均池化层)操作

转载的文章链接&#xff1a; 为什么使用全局平均池化层&#xff1f; 关于 global average pooling https://blog.csdn.net/qq_23304241/article/details/80292859 在卷积神经网络的初期&#xff0c;卷积层通过池化层&#xff08;一般是 最大池化&#xff09;后总是要一个或n个全…

zoj1245 Triangles(DP)

/* 动态三角形&#xff1a;每次DP时考虑的是两个子三角形的高度即可 注意&#xff1a; 三角形可以是倒置的。 */ View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <stdio.h> 5 6 using namespace std; 7 8…

第十八章 程序打包

第十八章 程序打包 Setuptools和较旧的Distutils都是用于发布Python包的工具包&#xff0c;能够使用Python轻松地编写安装脚本。这些脚本可用于生成可发布的归档文档&#xff0c;供用户用来编译和安装编写库。 Setuptools并非只能用于创建基于脚本的Python安装程序&#xff0…

如何在Java中检查对象是否为空?

With the help of "" operator is useful for reference comparison and it compares two objects. 借助“ ”运算符&#xff0c;对于参考比较非常有用&#xff0c;它可以比较两个对象。 "" operator returns true if both references (objects) points to…

android编程从零开始,从零开始学习android开发

博主最近开通了Android栏目&#xff0c;现在正在从零开始学习android&#xff0c;遇到的所有值得分享的知识点以及遇到的问题将发布在这个博客的android栏目下。因为我有着深厚的java底子&#xff0c;所以学习起来得心应手&#xff0c;十分的简单&#xff0c;当然也只能算是入门…

CNN基本步骤以及经典卷积(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)网络讲解以及tensorflow代码实现

课程来源&#xff1a;人工智能实践:Tensorflow笔记2 文章目录前言1、卷积神经网络的基本步骤1、卷积神经网络计算convolution2、感受野以及卷积核的选取3、全零填充Padding4、tf描述卷积层5、批标准化(BN操作)6、池化Pooling7、舍弃Dropout8、卷积神经网络搭建以及参数分析2、经…