408数据结构-图的遍历 自学知识点整理

news2024/11/26 10:25:43

前置知识:图的存储与基本操作


图的遍历是指从图的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。因为树是一种特殊的图,所以树的遍历实际上也可以视为一种特殊的图的遍历。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。
因为图的任意一个顶点都可能和其余的顶点相邻接,所以再访问过某个顶点后,又可能沿着某条路径搜索回到这个被访问过的结点。为了避免同一个顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点,可以设一个辅助数组 v i s i t e d [   ] visited[\ ] visited[ ]来标记顶点是否被访问过。图的遍历算法主要有两种:广度优先搜索深度优先搜索

广度优先搜索

知识点回顾:二叉树的层次遍历
对二叉树进行按层次的遍历,需要借助一个辅助队列实现,具体思想如下:
①首先将二叉树的根结点入队。
②若队列非空,则队头结点出队,并访问该结点。若该结点有左孩子,则将其左孩子入队;若该结点有右孩子,则将其右孩子入队。
③重复步骤②,直至队列为空。

广度优先搜索 B r e a d t h − F i r s t − S e a r c h ,   B F S Breadth-First-Search,\ BFS BreadthFirstSearch, BFS)类似于二叉树的层次遍历算法。基本思想是:首先访问起始顶点 v v v,接着从 v v v出发,依次访问 v v v的各个未访问过的邻接顶点 w 1 , w 2 , ⋯   , w i {{w}_{1}},{{w}_{2}},\cdots ,{{w}_{i}} w1,w2,,wi,然后依次访问 w 1 , w 2 , ⋯   , w i {{w}_{1}},{{w}_{2}},\cdots ,{{w}_{i}} w1,w2,,wi的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点,依此类推,直至图中所有顶点都被访问过为止。若此时图中尚有顶点未被访问,则另选图中一个未被访问过的顶点作为起始点,再重复上述过程,直至图中所有顶点都被访问到为止。
D i j k s t r a Dijkstra Dijkstra单源最短路径算法和 P r i m Prim Prim最小生成树算法也应用了类似的思想。
对广度优先搜索遍历图的过程,换而言之,就是以 v v v为起始点,由近至远依次访问和 v v v有路径相通且路径长度为 1 , 2 , ⋯ 1,2,\cdots 1,2,的顶点。广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层的顶点。

代码实现

首先是预处理,包括结构体定义,基本操作函数等。因为邻接矩阵法写起来相对简单一些,所以我主要用邻接表法来写。

知识点回顾:图的邻接表存储表示法
知识点类比:二叉树的层次遍历

#define MaxVertexNum 810
typedef struct ArcNode {//边结点
	int adjvex;
	struct ArcNode* nextarc;
}ArcNode;
typedef struct VNode {//顶点表结点
	int data;
	ArcNode* firstarc;
}VNode,AdjList[MaxVertexNum];
typedef struct {
	AdjList vertices;//邻接表存储图
	int vexnum, arcnum;
}ALGraph;
bool Visited[MaxVertexNum];//辅助数组标记顶点是否被访问

typedef struct LinkNode {
	int Vertex;//图的顶点编号
	struct LinkNode* next;
}LinkNode;
typedef struct {
	LinkNode* front, * rear;//链队列
}LinkQueue;

void InitQueue(LinkQueue& Q) {
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode*));
	p->Vertex = -1;
	p->next = NULL;
	Q.front = Q.rear = p;//初始化队列
	return;
}

bool Q_Is_Empty(LinkQueue Q) {//队列判空
	return Q.front == Q.rear ? true : false;
}

void EnQueue(LinkQueue& Q, int i) {//新元素入队
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode*));
	p->Vertex = i;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	return;
}

void DeQueue(LinkQueue& Q, int& x) {//队头元素出队
	LinkNode* p = Q.front->next;
	x = p->Vertex;
	Q.front->next = p->next;
	if (Q.rear == p)Q.rear = Q.front;
	free(p);
	return;
}

void Visit(int i) {
	printf("%d ", i);
	return;
}

邻接表实现广度优先搜索的代码如下:

void BFS(ALGraph& G, LinkQueue& Q, int i) {//广度优先搜索(对连通分量)
	Visit(i);//先访问i
	Visited[i] = true;
	EnQueue(Q, i);
	int v, w;//v记录队首元素,w用于临时记录访问的顶点
	while (!Q_Is_Empty(Q)) {//当队列不为空时
		DeQueue(Q, v);//队首元素出队
		for (ArcNode* p = G.vertices[v].firstarc; p != NULL; p = p->nextarc) {
		//访问v所有的邻接顶点
			w = p->adjvex;
			if (!Visited[w]) {//若顶点w未被访问过
				Visit(w);//访问顶点w
				Visited[w] = true;//对顶点w作已访问标记
				EnQueue(Q, w);//顶点w入队
			}
		}
	}
	return;
}

void BFSTraverse(ALGraph& G, LinkQueue& Q) {//对图G进行广度优先遍历
	for (int i = 1; i <= G.vexnum; ++i) {
		Visited[i] = false;//访问标记数组初始化
		G.vertices[i].data = i;//其实这一步没用
	}
	InitQueue(Q);//初始化队列
	for (int i = 1; i <= G.vexnum; ++i)//从1号顶点开始遍历
		if (!Visited[i])//对每个连通分量调用一次BFS()
			BFS(G, Q, i);//若顶点v_i未被访问过,则从顶点v_i处开始调用BFS()
	return;
}

邻接矩阵实现广度优先搜索算法如下:(并不完整,感兴趣的读者可以尝试自己写一下)

#define MaxVertexNum 114
typedef struct {
	int Vex[MaxVertexNum];
	int Edge[MaxVertexNum][MaxVertexNum];
	int vexnum, arcnum;
}MGraph;

void BFS_(MGraph& G, LinkQueue& Q, int i) {
	Visit(i);
	Visited[i] = true;
	EnQueue(Q, i);
	int v, w;
	while (!Q_Is_Empty(Q)) {
		DeQueue(Q, v);
		for (w = 1; w <= G.vexnum; ++w) {
			if (!Visited[w] && G.Edge[v][w]) {
				Visit(w);
				Visited[w] = true;
				EnQueue(Q, w);
			}
		}
	}
	return;
}

辅助数组 V i s i t e d [   ] Visited[\ ] Visited[ ]标志顶点是否被访问过,其初始值为 f a l s e false false。在图的遍历过程中,一旦某个顶点 v i v_i vi被访问,就立即置 V i s i t e d [ i ] Visited[i] Visited[i]值为 t r u e true true,防止其被多次访问。

B F S BFS BFS算法性能分析

无论是邻接表还是邻接矩阵的存储方式, B F S BFS BFS算法都需要借助一个辅助队列 Q Q Q,所有顶点均需入队一次,在最坏的情况下,空间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V)
遍历图的过程实质上是对每个顶点查找其邻接点的过,耗费的时间取决于所采用的存储结构。
采用邻接表存储时,每个顶点均需入队一次,时间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V),在搜索每个顶点的邻接点时,每条边至少访问一次,时间复杂度为 O ( ∣ E ∣ ) O(|E|) O(E)。因此,总的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E)
采用邻接矩阵存储时,查找每个顶点的邻接点所需时间为 O ( ∣ V ∣ ) O(|V|) O(V),因此,总的时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^{2}) O(V2)

B F S BFS BFS算法求解单源最短路径

若图 G = ( V , E ) G=(V,E) G=(V,E)为无权图,定义从顶点 u u u到顶点 v v v的最短路径 d ( u , v ) d(u,v) d(u,v) u u u v v v的任何路径中最少的边数;若从 u u u v v v没有通路,则 d ( u , v ) = ∞ d(u,v)=\infin d(u,v)=
使用 B F S BFS BFS,我们可以求解一个满足上述定义的“无权图的单源最短路径问题”,这是由广度优先搜索总是按照距离由近到远来遍历图中每个顶点的性质决定的。
B F S BFS BFS算法求解单源最短路径问题的算法如下,我根据王道书上的伪代码自己稍作了一些改动:

#define INF 0x7fffffff
void BFS_MIN_Distance(ALGraph G, LinkQueue& Q, int u) {
	int d[MaxVertexNum], v;//d[i]表示从u到i结点的最短路径
	memset(d, INF, sizeof(d));//初始化路径长度为无穷大
	Visited[u] = true, d[u] = 0;
	EnQueue(Q, u);
	while (!Q_Is_Empty(Q)) {//BFS主过程
		DeQueue(Q, u);//队头出队
		for (ArcNode* w = G.vertices[u].firstarc; w != NULL; w = w->nextarc) {
			//遍历u的所有邻接点
			v = w->adjvex;
			if (!Visited[v]) {//若未访问
				Visited[v] = true;//标记访问
				d[v] = d[u] + 1;//路径长度加1
				EnQueue(Q, v);//顶点w入队
			}
		}
	}
	return;
}
广搜的完整代码可以看我的Github:传送门

广度优先生成树

在广度优先遍历的过程中,我们可以得到一棵遍历树,称为广度优先生成树。需要注意的是,同一个图的邻接矩阵存储表示是唯一的,所以其广度优先生成树也是唯一的,但是因为邻接表存储表示不唯一,所以其广度优先生成树也不是唯一的。广度优先遍历序列同理,因此不再展开讲)

(下图来自王道考研408数据结构课程视频的截图 - 图的广度优先遍历)
图片来自王道考研408数据结构课程视频
对非连通图的广度优先遍历,可以得到广度优先生成森林。其中,对每一个连通分量进行广度优先遍历得到的广度优先生成树的集合,就是这个非连通图的广度优先生成森林。
这期视频最后的思考题,我个人认为答案如下:

  1. 1 1 1出发,需要调用 4 4 4 B F S BFS BFS函数,过程分别是: 1 → 5 1→5 15 2 2 2 3 → 6 3→6 36 4 → 7 → 8 4→7→8 478
  2. 7 7 7出发,需要调用 1 1 1 B F S BFS BFS函数,过程是: 7 → 3 → 6 → 8 → 2 → 4 → 1 → 5 7→3→6→8→2→4→1→5 73682415

深度优先搜索

知识点回顾:二叉树的先序遍历
若二叉树为空,则什么也不做;否则:

  • 访问根结点;
  • 先序遍历左子树;
  • 先序遍历右子树。

对应的递归算法如下:

void PreOrder(BiTree T) {//先序遍历(根左右)
	if (T != NULL) {
		visit(T);//访问根结点
		PreOrder(T->lchild);//递归访问左子树
		PreOrder(T->rchild);//递归访问右子树
	}
	return;
}

与广度优先搜索不同,深度优先搜索 D e p t h − F i r s t − S e a r c h Depth-First-Search DepthFirstSearch D F S DFS DFS)类似于树的先序遍历。如果其名称中所暗含的意思一样,这种搜索算法所遵循的策略是尽可能“深”地搜索一个图。
它的基本思想是:首先访问图中某一起始顶点 v v v,然后从 v v v出发,访问与 v v v邻接且未被访问的任意一个顶点 w 1 w_1 w1,再访问与 w 1 w_1 w1邻接且未被访问的任意一个顶点 w 2 w_2 w2……重复上述过程。当不能再继续往下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则再从该点开始继续上述搜索过程,直至图中所有顶点均被访问过为止。

代码实现

首先预处理,使用邻接表的方式存储图。

#define MaxVertexNum 114
typedef struct ArcNode {
	int adjvex;
	struct ArcNode* nextarc;
}ArcNode;
typedef struct VNode {
	int data;
	ArcNode* firstarc;
}VNode, AdjList[MaxVertexNum];
typedef struct {
	AdjList vertices;
	int vexnum, arcnum;
}ALGraph;

bool Visited[MaxVertexNum];//访问标记数组

inline void Visit(int i) {
	Visited[i] = true;//对i作已访问标记
	printf("%d ", i);
	return;
}

邻接表实现深度优先搜索算法如下:

inline void DFS(ALGraph G, int i) {//注:可以不加inline,仅个人习惯
	Visit(i);//访问初始顶点i
	for (ArcNode* p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) {
	//检测i的所有邻接点
		int j = p->adjvex;
		if (!Visited[j])DFS(G, j);//若j未被访问,则递归访问j
	}
	return;
}

inline void DFSTraverse(ALGraph G) {
	for (int i = 1; i <= G.vexnum; ++i) {
		Visited[i] = false;//初始化访问标记数组
		G.vertices[i].data = i;
	}
	for (int i = 1; i <= G.vexnum; ++i) {//从1开始遍历
		if (!Visited[i])//若当前顶点未访问则调用DFS()
			DFS(G, i);
	}
	return;
}

这样写 D F S T r a v e r s e ( ) DFSTraverse() DFSTraverse()函数也能同时解决非连通图的遍历问题。
同样的,我也写了个不完整的邻接矩阵实现深度优先搜索算法,感兴趣的读者可以自己动手试试补全。

#define MaxVertexNum 114
typedef struct {
	int Vex[MaxVertexNum];
	int Edge[MaxVertexNum][MaxVertexNum];
	int vexnum, arcnum;
}MGraph;

inline void DFS_(MGraph G, int i) {
	Visit(i);//访问初始顶点i
	for (int j = 1; j <= G.vexnum; ++j) {
		//检查i的所有邻接点
		if (!Visited[j] && G.Edge[i][j])
			DFS_(G, j);//j为i尚未访问的邻接点,递归访问j
	}
	return;
}
深搜的完整代码可以看我的Github:传送门

D F S DFS DFS算法的性能分析

D F S DFS DFS是一个递归算法,主要空间复杂度来自递归函数工作栈,最坏情况下空间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V)
遍历图的过程实质上是通过边查找邻接点的过程,因此两种遍历方式的时间复杂度都相同,不同之处仅在于对顶点的访问顺序不同。采用邻接矩阵存储时,总的时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^{2}) O(V2);采用邻接表存储时,总的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E)

深度优先生成树和生成森林

与广度优先搜索一样,深度优先搜索也会产生一棵深度优先生成树。当然,这是有条件的,即对连通图调用 D F S DFS DFS才能产生深度优先生成树,否则产生的将是深度优先生成森林
(下图来自王道考研408数据结构课程视频的截图 - 图的深度优先遍历)
图来自王道考研408数据结构课程视频
2 2 2出发,易知深度优先遍历序列为 2 → 1 → 5 → 6 → 3 → 4 → 7 → 8 2→1→5→6→3→4→7→8 21563478
图来自王道考研408数据结构课程视频
与广度优先搜索类似,邻接矩阵生成的深度优先序列和深度优先搜索树都是唯一的;而邻接表生成的深度优先序列和深度优先搜索树都是不唯一的,具体由邻接表边表的存储顺序决定。

图的遍历与图的连通性

图的遍历算法可以用来判断图的连通性。对于无向图来说,若无向图是连通的,则从任意一个顶点出发,仅需一次遍历就能够访问图中的所有顶点;若无向图是非连通的,则从某一个顶点出发,一次遍历只能访问到该顶点所在连通分量的所有顶点,而对于图中其他连通分量的顶点,则无法通过这次遍历访问到。对于有向图来说,若从初始顶点出发到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶点。
因此,在 B F S T r a v e r s e ( ) BFSTraverse() BFSTraverse() D F S T r a v e r s e ( ) DFSTraverse() DFSTraverse()函数中,添加了第二个 f o r for for循环,用于多次选取初始点,继续进行遍历,防止出现一次无法遍历图中所有顶点的情况。对于无向图,上述两个函数调用 B F S ( G , i ) BFS(G,i) BFS(G,i) D F S ( G , i ) DFS(G,i) DFS(G,i)的次数,等于该图的连通分量数;而对于有向图则不是这样,因为一个连通的有向图分为强连通的和非强连通的,它的连通子图也分为强连通分量和非强连通分量,对非强连通分量一次调用 B F S ( G , i ) BFS(G,i) BFS(G,i) D F S ( G , i ) DFS(G,i) DFS(G,i)存在无法访问到该连通分量所有顶点的情况。

知识点回顾:图的基本概念


对图的遍历,408考研初试中经常在选择题里考察遍历序列和遍历生成树的问题,对代码要求不那么高。因此要结合课后习题,在充分理解概念和算法思想的基础上,重点掌握手推遍历序列的能力。
以上。

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

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

相关文章

excel数据透视

Excel中&#xff0c;数据透视图&#xff08;PivotChart&#xff09;和数据透视表&#xff08;PivotTable&#xff09;是两个紧密相关的工具&#xff0c;用于分析数据。数据透视表是数据透视图的数据源&#xff0c;也就是说&#xff0c;数据透视图是基于数据透视表中的数据创建的…

matplotlib 创建多个子图

有些时候我们需要用for循环来创建多个子图&#xff0c;来对比特征。现在已画出8组随机数来作为示例。 from matplotlib import pyplot as plt import numpy as np #设置画布大小 figplt.figure(figsize(20,8)) #解决中文乱码问题 plt.rcParams[font.sans-serif] [SimHei] fo…

BlockingQueue详解(含动画演示)

目录 BlockingQueue详解0、BlockingQueue简介BlockingQueue接口中方法注释BlockingQueue的实现&#xff0c;总结计划 1、ArrayBlockingQueue简介2、ArrayBlockingQueue的继承体系3、ArrayBlockingQueue的构造方法①、 ArrayBlockingQueue(int capacity)②、ArrayBlockingQueue(…

HumanPlus——斯坦福ALOHA团队开源的人形机器人:融合影子学习技术、RL、模仿学习

前言 今天只是一个平常的日子&#xff0c;不过看到了两篇文章 一篇是《半年冒出近百家新公司&#xff0c;「具身智能」也有春天》 我看完之后转发到朋友圈&#xff0c;并评论道&#xff1a;让机器人翻一万个后空翻&#xff0c;不如让机器人打好一个螺钉&#xff0c;毕竟在目前…

Python酷库之旅-第三方库openpyxl(03)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

html--404页面

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <title>404 错误页面不存在&…

01--MySQL数据库概述

目录 第1章 MySQL数据库概述 1.1 基本概念 1.2 MySQL数据库管理系统 1.3 表的关系 第2章 MySQL卸载、安装、登录 第3章 客户端使用演示 3.1 命令行客户端 3.1.1 数据库 3.1.2 数据表 3.1.3 导入数据 3.1.4 导出数据 3.2 可视化客户端 第4章 SQL语句 4.1 SQL的分类…

C#实现高斯模糊(图像处理)

在C#中实现高斯模糊&#xff0c;可以使用System.Drawing库。高斯模糊是一种基于高斯函数的滤波器&#xff0c;它可以有效地平滑图像。以下是详细的步骤&#xff0c;包括生成高斯核并应用到图像上的代码示例。 1. 生成高斯核 首先&#xff0c;我们需要编写一个方法来生成高斯核…

碳+绿证如何能源匹配?考虑碳交易和绿证交易制度的电力批发市场能源优化程序代码!

前言 近年来&#xff0c;面对日益受到全社会关注的气候变化问题&#xff0c;国外尤其是欧美等发达国家和地区针对电力行业制定了一系列碳减排组合机制。其中&#xff0c;碳排放权交易&#xff08;以下简称“碳交易”&#xff09;和绿色电力证书交易&#xff08;以下简称“绿证…

JAVA医院绩效考核系统源码 功能特点:大型医院绩效考核系统源码

JAVA医院绩效考核系统源码 功能特点&#xff1a;大型医院绩效考核系统源码 医院绩效管理系统主要用于对科室和岗位的工作量、工作质量、服务质量进行全面考核&#xff0c;并对科室绩效工资和岗位绩效工资进行核算的系统。医院绩效管理系统开发主要用到的管理工具有RBRVS、DRGS…

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…

【2024.6.22】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

《STM32 HAL库》CAN通信系列函数详尽解析——HAL_CAN_Init()

食用指南&#xff1a;本文主要内容为梳理CAN初始化函数主要运行逻辑及重点功能实现代码的详尽解析。函数源码在文末&#xff0c;建议在阅读源码之后观看。 CAN相关寄存器图&#xff1a; 主要逻辑分析&#xff1a; 下面分点梳理函数的主要逻辑&#xff08;注意逻辑序号&#xf…

为何云原生是未来?企业IT架构的颠覆与重构

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的背景和起源 背景 起源 关…

打字侠,中小学生暑期的打字练习神器

亲爱的家长们&#xff0c;暑假来临&#xff0c;孩子们又要开始“沙发上的咸鱼”模式了&#xff01;与其看着他们抱着手机、平板不放&#xff0c;不如让他们成为“打字侠”&#xff0c;在快乐中提升打字技能&#xff01; “打字侠”是一款为中小学生量身打造的打字练习神器。别…

WPF 程序 分布式 自动更新 登录 打包

服务器server端 core api 客户端WPF // 检查应用更新 //1、获取最新文件列表 // var files fileService.GetUpgradeFiles(); // 2、文件判断&#xff0c;新增的直接下载&#xff1b;更新的直接下载&#xff1b;删除的直接删除 // 客户端本地需要一个记录…

宇宙星空星辰美景素材哪里找?高清无水印分享

宇宙星空的美丽总能激发人们的无限遐想和灵感&#xff0c;不仅在科学教育领域&#xff0c;更在电影制作和视觉艺术中占有一席之地。为了帮助您找到高质量的宇宙星空视频素材&#xff0c;以下平台将成为您获取令人难忘天体视频素材的首选。 蛙学府 蛙学府作为新媒体创作者的宝库…

如何将图片转换为表格?方法并不难!

如何将图片转换为表格&#xff1f;在数字化时代&#xff0c;图片中的表格信息提取和整理成为了我们日常工作中不可或缺的一部分。不论是学术研究、商业分析还是个人生活&#xff0c;快速、准确地将图片转换为表格都显得尤为重要。今天&#xff0c;我们就来介绍四款强大的图片转…

经验总结--开关MOS管发热的一般原因/电源开发经验总结

开关MOS管发热的一般原因 做电源设计,或者做驱动方面的电路,难免要用到场效应管,也就是人们常说的MOS管。MOS管有很多种类,也有很多作用。做电源或者驱动的使用,当然就是用它的开关作用。 无论N型或者P型MOS管,其工作原理本质是一样的。MOS管是由加在输入端栅极的电压来控…

Android蓝牙开发(二)之蓝牙配对和蓝牙连接

BluetoothDevice.class.getMethod 进行配对&#xff0c;代码如下&#xff1a; Method method BluetoothDevice.class.getMethod(“createBond”); Log.e(getPackageName(), “开始配对”); method.invoke(listdevice.get(position)); invoke传的参数就是要配对的设备&…