数据结构考研第六章——图(内含动图)

news2024/11/27 17:36:02

在这里插入图片描述
大纲要求:图的相关算法相对较多,通常只要求掌握其基本思想和实现步骤,而算法的具体实现不是重点。

一、图的基本概念

  1. 图的概念:图G由顶点集V和边集E组成的,记为G=(V,E)
  2. 有向图:若E是有向边(也称为弧),则G为有向图
    G=(V,E),其中V={1,2,3},E={<1,2>,<2,3>,<2,1>}
  3. 无向图:若E是无向边(也称为边),则G为无向图
    G=(V,E),其中V={1,2,3},E={(1,2),(2,3),(2,1)}
  4. 简单图:不存在重复的边,不存在顶点到自身的边(数据结构仅讨论简单图)
  5. 多重图:存在重复的边,存在顶点到自身的边
  6. 完全图:对于无向图来说有n(n-1)/2条边,对于有向图来说有n(n-1)条边
  7. 连通:对于无向图来说,若顶点v到顶点w有路径存在,则称v和w是连通的
    连通图:对于无向图来说,若任意两个顶点都连通,则称为连通图。否则称为非连通图。
    连通分量:对于无向图来说,无向图中的极大连通子图称为连通分量
  8. 强连通:对于有向图来说,若顶点v到顶点w有路径存在,则称v和w是强连通的
    强连通图:对于有向图来说,若任意两个顶点都连通,则称为强连通图。否则称为非强连通图。
    强连通分量:对于有向图来说,有向图中的极大强连通子图称为强连通分量
  9. 生成树:包含图中全部顶点的一个极小连通子图。
    极小连通子图是既要保持图的连通又要使得边数最少的子图。极大连通子图要求包含所有的边
  10. 度TD、出度ID、入度OD
    顶点的度等于入度与出度之和
    有向图的全部顶点的入度之和和出度之和相等,无向图没有出度和入度之分。
    无向图的全部顶点的度的和等于边数的2倍,有向图也是。
  11. 网:带有权值的边的图称为网
  12. 稠密图:边数满足E>=VlogV的图。
    稀疏图:边数满足E<VlogV的图
  13. 路径:顶点v到顶点w之间的顶点序列
    路径长度:路径边上的数目
    回路:第一个顶点和最后一个顶点相同的路径
  14. 距离:两个顶点之间最短路径
  15. 有向树:一个顶点(作为根)入度为0,其余顶点(非根)入度为1的有向图

二、图的存储结构

核心思想:紧扣 “图由点和边组成” 这一基本概念思考四种存储结构

  1. 邻接矩阵法

【数据结构】

#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct{
	VertexType Vex[MaxVertexNum];					//顶点表
	EdgeType Edge[MaxVertexNum][MaxVertexNum];		//边表,邻接矩阵形式
	int vexNum;			//顶点数
	int arcnum;			//边数
}

在这里插入图片描述

【存储特点】

  1. 当邻接矩阵的元素仅表示相应边是否存在时,EdgeType可采用值为0和1;
    当邻接矩阵的元素表示相应边的权值时,EdgeType需要表示具体权值;
  2. 无向图的邻接矩阵是对称矩阵,对规模大的邻接矩阵可采用压缩存储;
    邻接矩阵表示法的空间复杂度为O( n 2 n^2 n2),其中n为图的顶点数
  3. 适用范围:稠密图适合使用邻接矩阵的存储表示

【相关计算】

  1. 对于无向图,邻接矩阵的第i行(列)非零元素(非∞元素)的个数正好是顶点i的度TD
    对于有向图,邻接矩阵的第i行非零元素(非∞元素)的个数正好是顶点i的出度OD,邻接矩阵的第i列非零元素(非∞元素)的个数正好是顶点i的入度TD
  2. 设置图G的邻接矩阵为A, A n A^n An的元素 A n [ i ] [ j ] A^n[i][j] An[i][j]等于由顶点i到顶点j的长度为n的路径的数目
  1. 邻接表法

【数据结构】

#define MaxVertexNum 100
typedef struct ArcNode{		//边表结点
	int adjvex;				//该弧所指向的顶点的位置
	struct ArcNode *next;	//指向下一条弧的指针
}ArcNode;
typedef struct VNode{		//顶点表结点
	VertexType data;		//顶点信息
	ArcNode *first;			//顶点的第一条弧的指针
}VNode,AdjList[MaxVertexNum];
typedef struct{
	AdList vertices;			//邻接表
	int vexnum,arcnum;			//图的顶点数和边数
}ALGraph;

在这里插入图片描述

【存储特点】

  1. 适用范围:稀疏图适合使用邻接表法的存储表示
  2. 邻接表法的空间复杂度:无向图的空间复杂度为O(V+2E),有向图的空间复杂度为O(V+E)
  3. 在邻接表中,给定一顶点,能很容易找出它的所有邻边,因为只需要读取它的邻接表,时间复杂度远小于O(n);而在邻接矩阵则需要扫描一行,时间复杂度为O(n).
    在邻接表中,确认两个顶点是否存在边,则需要在边链表上依次查找,时间复杂度为O(n);而在邻接矩阵则可以通过A[i][j]元素查到,时间复杂度为O(1).
  4. 在有向图的邻接链表中,求一个顶点的出度只需要计算其邻接表中的结点个数;但求其顶点的入度则需要遍历全部的邻接表。后者可以采用逆邻接表来加速求解。
  5. 图的邻接表表示并不唯一
  1. 十字链表法(只用于有向图)

【数据结构】 这种存储结构要从边的特点出发定义

  1. 弧的两个端点:弧头和弧尾
  2. 弧的分类:弧头相同的弧链接在一起,弧尾相同的弧链接在一起。
    在这里插入图片描述
    在这里插入图片描述

【存储特点】

  1. 在十字链表中,既容易找到V为尾的弧,又容易找到V为头的弧,因而容易求得顶点得出度和入度。
  1. 邻接多重表(只用于无向图)

【数据结构】
【数据结构】 这种存储结构要从边的特点出发定义

  1. 边的两个端点:弧头和弧尾
  2. 边的分类:依附在相同顶点的边链接在一起。
    在这里插入图片描述
    在这里插入图片描述

三、图的基本操作

基本操作 :图的基本操作是独立于图的存储结构的,而对于不同的存储方式,操作算法的具体实现会有着不同的性能。在设计具体算法的实现时,应考虑采用何种存储方式的算法效率会更高。

  1. Adjacent(G,x,y):判断图G是否存在边<x,y>或(x,y)
  2. Neighbors(G,x):列出图G中与结点x邻接的边
  3. InsertVertex(G,x):在图G中插入顶点x
  4. DeleteVertex(G,x):在图G中删除顶点x
  5. AddEdge(G,x,y):若无向边(x,y)或者有向边<x,y>不存在,则添加
  6. RemoveEdge(G,x,y):若无向边(x,y)或者有向边<x,y>存在,则删除
  7. FirstNeighbor(G,x):求图G中第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1.
  8. NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号。若没有则返回-1;
  9. Get_edge_value(G,x,y):获取权值
  10. Set_edge_value(G,x,y):设置权值

四、图的遍历算法

  1. 广度优先搜索BFS

【算法思想】

  1. 首先从未被访问的顶点v开始,接着由顶点v出发,依次访问v的各个未被访问过的邻接顶点w1,w2,w3…,然后依次访问w1,w2,w3…未被访问过的邻接结点,直到没有邻接结点为止。
  2. 如果图中尚有未被访问过的结点,则另选择一个未曾被访问过的顶点作为始点,重复上述过程。

【代码实现】 (辅助队列+非递归算法)

bool visited[MAX_VERTEX_NUM];
void BFSTraverse(Graph G){
	for(int i=0;i<G.vexnum;++i){
		visited[i]=FALSE;
	}
	InitQueue(Q);
	for(i=0;i<G.vexnum;++i)
		if(!visited[i])
			BFS(G,i)
}
void BFS(Graph G,int v){
	visit(v);
	visited[v]=TRUE;
	Enqueue(Q,v);
	while(!isEmpty(Q)){
		DeQueue(Q,V);
		for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v)){//如果为空,会返回-1
			if(!visited[w]){
				visit(w);
				visited(w)=TRUE;
				EnQueue(Q,w);
			}
		}
	}
}

【具体实例】
在这里插入图片描述
【算法分析】

  1. 空间复杂度:最坏的情况下空间复杂度为O(V)
  2. 时间复杂度:邻接表时间复杂度为O(V+E)=顶点访问时间O(V)+边访问时间O(E),邻接矩阵时间复杂度为O( V 2 V^2 V2)

【BFS算法求解单源最短路径问题】 (注意与Dijkstra算法的区别)

void BFS_MIN_Distance()
{
	for(i=0;i<G.vexnum;++i) d[i]=∞;
	visited[u]=TRUE;
	d[u]=0;
	EnQueue(Q,u);
	while(!IsEmpty(Q)){
		DeQueue(Q,u);
		for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))
			if(!visited[w]){
				visited[w]=TRUE;
				d[w]=d[u]+1;			//整个算法的精髓
				EnQueue(Q,w);
			}
	}
}

【广度优先生成树】

  1. 在广度遍历的过程中,我们可以得到一棵遍历树,称为广度优先生成树
  2. 由于邻接矩阵表示唯一,所以生成树也是唯一的
  3. 由于邻接表存储表示不唯一,所以生成树也是不唯一的
  1. 深度优先搜索

【算法思想】

  1. 首先访问图中某一起始顶点v,然后从v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2…重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点。
  2. 若还有尚未被访问的顶点,则从该顶点开始继续上述搜索过程。

【代码实现】

bool visited[MAX_VERTEX_NUM];
void BFSTraverse(Graph G){
	for(int i=0;i<G.vexnum;++i){
		visited[i]=FALSE;
	}
	for(i=0;i<G.vexnum;++i)
		if(!visited[i])
			BFS(G,i)
}

void DFS(Graph G,int v){
	visit(v);
	visited[v]=TRUE;
	for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
		if(!visited[w]) DFS(G,w)		//精髓:直接选用了新结点来寻找邻接结点,这就成了深度遍历了
}

【具体实例】
在这里插入图片描述
【算法分析】

  1. 空间复杂度:使用了递归工作栈,故空间复杂度为O(V)
  2. 时间复杂度:邻接表时间复杂度为O(V+E)=顶点访问时间O(V)+边访问时间O(E),邻接矩阵时间复杂度为O( V 2 V^2 V2)

【深度优先生成树】

  1. 在深度遍历的过程中,我们可以得到一棵遍历树,称为深度优先生成树
  2. 由于邻接矩阵表示唯一,所以生成树也是唯一的
  3. 由于邻接表存储表示不唯一,所以生成树也是不唯一的
  1. 图的遍历
  1. 对于无向图来说,两个函数调用BFS(G,i)和DFS(G,i)的次数等于该图的连通分量数。
  2. 对于有向图来说,两个函数调用BFS(G,i)和DFS(G,i)的次数等于该图的强连通分量数。

五、图的应用

  1. 最小生成树

【概念特性】

  1. 概念:权值之和最小的生成树
  2. 特性:最小生成树不是唯一的,但是最小生成树的边的权值之和是唯一的。

【Prim算法】

  1. 算法思想:初始时从图中任选一个顶点加入树T,此时树中只含有一个顶点,之后选择一个与当前T中顶点集合距离最近的顶点,并将该顶点和相应的边加入T,每次操作后T中的顶点数和边数都增1.
  2. 算法分析:时间复杂度为O( V 2 V^2 V2),因为n个顶点,每个顶点有n-1条边比较大小。
  3. 适用范围:边稠密的图
  4. 具体实例

在这里插入图片描述
【Kruskal算法】

  1. 算法思想:初始时为只有n个顶点而无边的非连通图T={V,{}},每个顶点自成一个连通分量,然后按照边的权值由小到大的顺序,不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在T中不同的连通分量上(即不形成环路),则将此边加入T,否则舍弃此边而选择下一条权值最小的边。直至T中所有顶点都在一个连通分量上。
  2. 算法分析:时间复杂度为O( E l o g E ElogE ElogE)
  3. 适用范围:边稀疏的图
  4. 具体实例
    在这里插入图片描述
  1. 最短路径

【Dijkstra算法:实现单源最短路径问题】 (带正权无向图、带正权有向图)

  1. 算法介绍:Dijkstra算法应用了贪心算法思想,是目前公认的最好的求解最短路径的方法。算法解决的是有带权无向图、带权有向图中单个源点到其他顶点的最短路径问题。
  2. 辅助数组
    dist[]:记录从源点 v 0 v_0 v0到其他各顶点当前的最短路径长度。
    path[]:path[i]表示源点到顶点i之间的最短路径的前驱结点。
  3. 算法思想:
    设置一个集合S记录已求得的最短路径的顶点,初始时把源点 v 0 v_0 v0放入S;
    集合S每并入一个新顶点 v i v_i vi,都要修改源点 v 0 v_0 v0到集合V-S中顶点当前的最短路径长度值;
  4. 算法特点:使用邻接矩阵的时间复杂度为O( V 2 V^2 V2),并且不适用于权值带负数的情况
  5. 具体实例
    在这里插入图片描述

【Floyd算法:各顶点之间最短路径问题】(带正负权无向图、带正负权有向图)

【算法思想】
在这里插入图片描述

【代码实现】

//核心代码
for(int k=0;k<n;k++)						//中转结点
	for(int i=0;i<n;i++)					//起始结点
		for(int j=0;j<n;j++)				//终点
			if(d[i][j]>d[i][k]+d[k][j])
				d[i][j]=>d[i][k]+d[k][j];

【具体实例】
在这里插入图片描述

【算法分析】

  1. 时间复杂度:根据核心代码不难得出时间复杂度为O( V 3 V^3 V3).
  2. 使用范围:带正负权无向图、带正负权有向图,但是不允许含带负权值的边组成的回路。
  1. 有向无环图DAG描述表达式 (描述含有公共子式的表达式的有效工具)

【使用真题演示】
在这里插入图片描述

  1. 拓扑排序

【基本概念】

  1. AOV网:带权有向无环图 表示活动的网络,记为AOV网
  2. 活动:每个顶点代表一个活动
  3. 事件:每条边代表一个事件

【算法思想】

  1. 从AOV网中选择一个没有前驱的顶点并输出
  2. 从网中删除该顶点和所有以它为起点的有向边
  3. 重复步骤1和步骤2直到当前AOV网为空

【代码实现】

bool TopoLogicalSort(Graph G){
	InitStack(S);
	for(int i=0;i<n;i++){
		if(indegree[i]=0)
			Push(S,i)
	}
	int count=0;		//用来计数是否全部结点拓扑完毕
	while(!IsEmpty(S)){
		Pop(S,i);
		print[count++]=i;
		for(p=G.vertices[i].firstarc;p;p=p->nextarc){	//这个for循环是核心
			v=p->adjvex;
			if(!(--indegree[v])) Push(S,v);
		}
	}
	if(count<G.vexnum) return false;			//排序失败,有向图中有回路
	else return true;
}

【算法分析】

  1. 时间复杂度:邻接表时间复杂度为O(V+E),邻接矩阵时间复杂度为O( V 2 V^2 V2)
  2. 唯一性:若顶点有多个后继,则拓扑排序算法不唯一;若顶点有多个后继,则拓扑排序算法唯一
  1. 关键路径 (完成整个工程的最短时间就是关键路径的长度)

【基本概念】

  1. 源点:入度为0的顶点称为源点
  2. 汇点:出度为0的顶点称为汇点
  3. 关键路径:从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径
  4. 事件vk的最早发生时间ve(k):ve(k)=Max{ve(j)+Weight( v j v_j vj, v k v_k vk)},从源点v1到顶点vk的最长路径长度
  5. 事件vk的最迟发生时间vl(k):vl(k)=Min{vl(j)-Weight( v k v_k vk, v j v_j vj)},即选择最大的一段后退距离
  6. 活动ai的最早发生时间e(i):若边< v k v_k vk, v j v_j vj>表示活动 a i a_i ai,则有e(i)=ve(k);
  7. 活动ai的最迟发生时间l(i):若边< v k v_k vk, v j v_j vj>表示活动 a i a_i ai,则有l(i)=vl(j)-Weight( v k v_k vk, v j v_j vj);
  8. 一个活动ai的最迟开始时间l(i)和最早开始时间e(i)的差额:d(i)=l(i)-e(i)

【算法思想】

  1. 从源点出发,令ve(源点)=0,按拓扑排序求其余顶点的最早发生时间ve();
  2. 从汇点出发,令vl(汇点)=ve(汇点),按逆拓扑排序求其余顶点的最迟发生时间vl();
  3. 根据各顶点的ve()值求所有弧的最早开始时间e();
  4. 根据个顶点的vl()值求所有弧的最迟开始时间l();
  5. 求AOE网中所有差额d(),找出所有d()=0的活动构成关键路径

【具体实例】
关键路径为( v 1 v_1 v1, v 3 v_3 v3, v 4 v_4 v4, v 6 v_6 v6
在这里插入图片描述

【特点】

  1. 关键路径上的所有活动都是关键活动,它是决定整个工程的关键因素,因此可通过加快关键活动来缩短整个工程的工期。但也不能任意缩短关键活动,因为一旦缩短到一定的程度,该关键活动就可能会变成非关键活动。

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

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

相关文章

6_显示登录信息以及上传图片

目录一 显示登录信息二 账号设置修改用户图片一 显示登录信息 实现思路 书写一个拦截器 loginTicketInterceptor 在 preHandle 方法中获取用户发送请求时携带的 cookie书写一个专门获取cookie的工具类 CookieUtil查数据库,数据库是否存在该 ticket,判断该凭证是否有效,-凭证是…

【论文阅读】EDPLVO: Efficient Direct Point-Line Visual Odometry

一、公式及符号约定 这篇论文是将直接法的残差计算从点扩展到了线段&#xff0c;所以一些符号在第三章的部分提前做了约定。用Π表示投影的函数&#xff0c;也就是用像素坐标和内参矩阵以及深度信息&#xff0c;投影出点的空间坐标&#xff0c;反之Π-1表示的是将空间坐标投影…

Git使用详细教程

1. cmd面板的常用命令 clear&#xff1a;清屏cd 文件夹名称----进入文件夹cd … 进入上一级目录(两个点)dir 查看当前目录下的文件和文件夹(全拼:directory)Is 查看当前目录下的文件和文件夹touch 文件名----创建文件echo 内容 > 创建文件名----创建文件并写入内容rm 文件名…

基于udp实现回显服务器,翻译服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 udp socket 要掌握的类&#xff1a; 1.DatagramSocket 2.DatagramPacket 一、udp版本回显服务器 服务端&#xff1a; 完整代码 客户端&#xff1a; 完整代码 udp版本翻译…

Spring注入和生命周期

目录 获取Bean对象&#xff08;对象装配&#xff09; 属性注入 构造注入 Setter注入 三种注入的优缺点分析 注入的注解&#xff1a; 一个类型多个bean对象的注入方式 1.让变量名等于bean的id 2.用Resource注解&#xff08;name“bean的id”&#xff09; 3.用Qualif…

Java 核心技术 0 —— Class加载 和 运行时数据区域

JVM 是 字节码的运行环境&#xff0c;负责装载class到JVM内部&#xff0c;解释编译为对应平台的机器码指令进行执行&#xff0c;对于JVM设计有权威的定义规范&#xff0c;了解 JVM 类加载各部的主要功能 和 运行时数据区域组成 很有意义。 磁盘上有一个.java文件&#xff0c;通…

【目标检测】swin-transformer训练自己的数据集

文章目录1. 数据集的制作1.1. Labelme制作数据集1.2 COCO数据集格式2. 配置swin-transformer3. 训练自己的数据集4. 训练5.参考链接1. 数据集的制作 1.1. Labelme制作数据集 pip install labelme然后在桌面搜索框中找到labelme&#xff0c;然后打开&#xff0c;或者直接在命令…

Python 工匠 第一章 变量与注释

1.1 基础知识 1.1.1 变量常见用法 Python 是一门动态类型的语言&#xff0c;因此无须提前声明变量类型&#xff1b;并且由于其是弱类型语言&#xff0c;即可以更改其变量类型。动态类型语言/弱类型语言 a 10 # 不需要提前声明变量类型 a "a" # 可以更改其变量类…

【架构师】解决方案架构师常用的5种类型架构图

0. 背景 在给不同部门的同学讲解系统时&#xff0c;如果用手势解释解决方案&#xff0c;还有很多“这块和这块通过...”在解释复杂的概念时&#xff0c;大部分人都会晕。我们需要一个视觉效果。有人说一个架构图不就行了吗&#xff1f;但架构图不是一个“放之四海而皆准”的解决…

一、springcloud-eureka服务注册与发现

SpringCloud简介 Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式&#xff08;例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话&#xff0c;集群状态&#xff09;。分布式系统的协调导致了样板…

04 Vue属性配置

1、ref属性 App.vue代码&#xff1a; <template><div><h1 v-text"msg" ref"myTitle"></h1><button click"showDom">点我输出上方的DOM元素</button><school ref"school" id"sch"/&…

Node.js | Express+MongoDB 实现简易用户管理系统(一)(项目搭建 | RESTful API架构 | 前后端交互)

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

【javaEE】多线程进阶(Part1 锁策略、CAS、synchronized )

目录前言/补充4. 描述一下线程池的执行流程和拒绝策略有哪些&#xff1f;【面试题&#xff01;】一、常见锁策略一&#xff09;乐观锁VS悲观锁二&#xff09;读写锁VS普通互斥锁三&#xff09;重量级锁VS轻量级锁四&#xff09;自旋锁VS挂起等待锁五&#xff09;公平锁VS非公平…

Vue框架背后的故事

文章目录前言Vue萌芽Vue名字的由来因着Vue免试进入MeteorVue逐步完善Taylor推荐VueVue因受质疑发布1.0LinusBorg加入萌生全职做Vue想法Vue在恰到好处的时机出现探索经济来源Serah Drasner加入全职投入Vue建设Vue引入国内Vue受拥国内Vue在决策背景方面的独有优势总结本期推荐前言…

JVM垃圾回收系列之垃圾收集器二

随笔 最近两个星期因为要忙公司项目上线的事情以至于发表的文章会显得碌碌庸流&#xff0c;在此以示歉意 引言 本文将介绍HotSpot中的G1GC 参考书籍&#xff1a;“深入理解Java虚拟机” 个人java知识分享项目——gitee地址 个人java知识分享项目——github地址 G1GC 介…

双向链表的操作

什么是双向链表&#xff1f; 指针域&#xff1a;用于指向当前节点的直接前驱节点&#xff1b; 数据域&#xff1a;用于存储数据元素。 指针域&#xff1a;用于指向当前节点的直接后继节点&#xff1b; typedef struct line{struct line * prior; //指向直接前趋&#xff0c;结…

超级简单的机器学习入门

超级简单的机器学习入门 文章目录超级简单的机器学习入门0.写在前面1.机器学习基本概念2.机器学习算法的类型2.1 监督学习2.2 无监督学习2.3 监督学习和无监督学习的对比2.4 强化学习3.机器学习的三个基本要素3.1 模型3.2 学习准则3.2.1 损失函数3.2.2 欠拟合和过拟合&#xff…

MySQL数据库 || 增删改查操作详解

目录 前言&#xff1a; 插入数据 查询数据 全列查询 指定列查询 带表达式查询 去重查询 查询结果排序 条件查询 比较运算符 逻辑运算符 示例 模糊查询 示例 空值比较 分页查询 修改数据 删除数据 注意&#xff1a; 前言&#xff1a; &#x1f388;增删改查…

Flutter——常用布局

Flutter—常用布局效果图widget 树形图左布局Text评分条提示内容右布局应用Stack布局效果图释示例效果图释电影封面电影信息电影演员电影简介应用效果图 widget 树形图 整个界面由一行组成&#xff0c;分为两列&#xff1b;左列包括电影介绍&#xff0c;由上到下垂直排列&…

java计算机毕业设计ssm+jsp线上授课系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习线上授课的相关知识以及网络提供的技术应用教程&#xff0c;以线上授课的实际应用需要出发&#xff0c;架构系统来改善现线上授课工作流程繁琐等问题。不仅如此以操作者的角度来说&#xf…