漫画:深度优先遍历 和 广度优先遍历

本文详细介绍了图遍历的两种核心方法:深度优先遍历(DFS)和广度优先遍历(BFS)。通过游乐场游玩路线的生动比喻,讲解了DFS一头扎到底的探索方式与BFS层层推进的遍历策略。并提供了具体的实现过程,包括DFS的回溯与BFS的重放,展示了栈和队列在遍历过程中的应用。

 

 

—————  第二天  —————

 

 

 

 

 

————————————

 

 

 

 

 

 

什么是 深度/广度 优先遍历?

 

深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。

 

这两种遍历方式有什么不同呢?我们来举个栗子:

 

我们来到一个游乐场,游乐场里有11个景点。我们从景点0开始,要玩遍游乐场的所有景点,可以有什么样的游玩次序呢?

 

 

 

第一种是一头扎到底的玩法。我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。

 

在图中,我们首先选择景点1的这条路,继续深入到景点7、景点8,终于发现走不动了(景点旁边的数字代表探索次序):

 

 

于是,我们退回到景点7,然后探索景点10,又走到了死胡同。于是,退回到景点1,探索景点9:

 

 

按照这个思路,我们再退回到景点0,后续依次探索景点2、3、5、4、6,终于玩遍了整个游乐场:

 

 

像这样先深入探索,走到头再回退寻找其他出路的遍历方式,就叫做深度优先遍历(DFS)

 

 

 

除了像深度优先遍历这样一头扎到底的玩法以外,我们还有另一种玩法:首先把起点相邻的几个景点玩遍,然后去玩距离起点稍远一些(隔一层)的景点,然后再去玩距离起点更远一些(隔两层)的景点......

 

在图中,我们首先探索景点0的相邻景点1、2、3、4:

 

 

接着,我们探索与景点0相隔一层的景点7、9、5、6:

 

 

最后,我们探索与景点0相隔两层的景点8、10:

 

 

像这样一层一层由内而外的遍历方式,就叫做广度优先遍历(BFS)

 

 

 

深度/广度优先遍历 的实现

 

 

 

深度优先遍历

 

首先说说深度优先遍历的实现过程。这里所说的回溯是什么意思呢?回溯顾名思义,就是自后向前,追溯曾经走过的路径。

 

我们把刚才游乐场的例子抽象成数据结构的图,假如我们依次访问了顶点0、1、7、8,发现无路可走了,这时候我们要从顶点8退回到顶点7。

 

 

而后我们探索了顶点10,又无路可走了,这时候我们要从顶点10退回到顶点7,再退回到顶点1。

 

 

像这样的自后向前追溯曾经访问过的路径,就叫做回溯。

 

要想实现回溯,可以利用的先入后出特性,也可以采用递归的方式(因为递归本身就是基于方法调用栈来实现)。

 

下面我们来演示一下具体实现过程。

 

首先访问顶点0、1、7、8,这四个顶点依次入栈,此时顶点8是栈顶:

 

 

从顶点8退回到顶点7,顶点8出栈:

 

 

接下来访问顶点10,顶点10入栈:

 

 

从顶点10退到顶点7,从顶点7退到顶点1,顶点10和顶点7出栈:

 

 

探索顶点9,顶点9入栈:

 

 

以此类推,利用这样一个临时栈来实现回溯,最终遍历完所有顶点。

 

 

广度优先遍历

 

接下来该说说广度优先遍历的实现过程了。刚才所说的重放是什么意思呢?似乎听起来和回溯差不多?其实,回溯与重放是完全相反的过程。

 

仍然以刚才的图为例,按照广度优先遍历的思想,我们首先遍历顶点0,然后遍历了邻近顶点1、2、3、4:

 

 

接下来我们要遍历更外围的顶点,可是如何找到这些更外围的顶点呢?我们需要把刚才遍历过的顶点1、2、3、4按顺序重新回顾一遍,从顶点1发现邻近的顶点7、9;从顶点3发现邻近的顶点5、6。

 

 

像这样把遍历过的顶点按照之前的遍历顺序重新回顾,就叫做重放。同样的,要实现重放也需要额外的存储空间,可以利用队列的先入先出特性来实现。

 

下面我们来演示一下具体实现过程。

 

首先遍历起点顶点0,顶点0入队:

 

 

接下来顶点0出队,遍历顶点0的邻近顶点1、2、3、4,并且把它们入队:

 

 

然后顶点1出队,遍历顶点1的邻近顶点7、9,并且把它们入队:

 

 

然后顶点2出队,没有新的顶点可入队:

 

 

以此类推,利用这样一个队列来实现重放,最终遍历完所有顶点。

 

 

 

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1uploading.4e448015.gif转存失败重新上传取消

 

/**

* 图的顶点

*/

private static class Vertex {

int data;

Vertex(int data) {

this.data = data;

}

}



/**

* 图(邻接表形式)

*/

private static class Graph {

private int size;

private Vertex[] vertexes;

private LinkedList<Integer> adj[];



Graph(int size){

this.size = size;

//初始化顶点和邻接矩阵

vertexes = new Vertex[size];

adj = new LinkedList[size];

for(int i=0; i<size; i++){

vertexes[i] = new Vertex(i);

adj[i] = new LinkedList();

}

}

}



/**

* 深度优先遍历

*/

public static void dfs(Graph graph, int start, boolean[] visited) {

System.out.println(graph.vertexes[start].data);

visited[start] = true;

for(int index : graph.adj[start]){

if(!visited[index]){

dfs(graph, index, visited);

}

}

}



/**

* 广度优先遍历

*/

public static void bfs(Graph graph, int start, boolean[] visited, LinkedList<Integer> queue) {

queue.offer(start);

while (!queue.isEmpty()){

int front = queue.poll();

if(visited[front]){

continue;

}

System.out.println(graph.vertexes[front].data);

visited[front] = true;

for(int index : graph.adj[front]){

queue.offer(index);;

}

}

}





public static void main(String[] args) {

Graph graph = new Graph(6);



graph.adj[0].add(1);

graph.adj[0].add(2);

graph.adj[0].add(3);



graph.adj[1].add(0);

graph.adj[1].add(3);

graph.adj[1].add(4);



graph.adj[2].add(0);



graph.adj[3].add(0);

graph.adj[3].add(1);

graph.adj[3].add(4);

graph.adj[3].add(5);



graph.adj[4].add(1);

graph.adj[4].add(3);

graph.adj[4].add(5);



graph.adj[5].add(3);

graph.adj[5].add(4);



System.out.println("图的深度优先遍历:");

dfs(graph, 0, new boolean[graph.size]);

System.out.println("图的广度优先遍历:");

bfs(graph, 0, new boolean[graph.size], new LinkedList<Integer>());

}

 

光伏储能虚拟同步发电机VSG并网仿真模型(Similink仿真实现)内容概要:本文档介绍了光伏储能虚拟同步发电机(VSG)并网仿真模型的Simulink实现方法,重点在于通过建立光伏储能系统与虚拟同步发电机相结合的仿真模型,模拟其在并网过程中的动态响应与控制特性。该模型借鉴了同步发电机的惯性阻尼特性,提升了新能源并网系统的频率电压支撑能力,增强了系统的稳定性与可控性。文档还提及相关电力系统仿真技术的应用,包括逆变器控制、储能配置、并网稳定性分析等,并提供了完整的Simulink仿真文件及技术支持资源链接,便于科研人员复现与二次开发。; 适合人群:电气工程、自动化、能源系统等相关专业的研究生、科研人员及从事新能源并网技术开发的工程师。; 使用场景及目标:①用于研究光伏储能系统在弱电网条件下的并网稳定性问题;②掌握虚拟同步发电机(VSG)控制策略的设计与仿真方法;③支持高水平论文(如EI/SCI)的模型复现与创新研究;④为微电网、智能电网中的分布式能源接入提供技术参考。; 阅读建议:建议结合提供的Simulink模型文件与文档说明逐步操作,重点关注VSG控制模块的参数设置与动态响应分析,同时可延伸学习文中提及的MPPT、储能管理、谐波分析等相关技术,以提升综合仿真能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值