猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索

目录

1、定义

2、算法分析

3、算法实现

4、性能分析


作者简介:大家好呀!我是路遥叶子,大家可以叫我叶子哦!❣️    
个人主页:【叶子博客】
博主信息:四季轮换叶,一路招摇胜!

希望大家多多支持一起进步呀!~❤️
若有帮助,还请【关注点赞收藏】,不行的话我再努力努力呀!
————————————————
欢迎各位的加入,一起壮大社区发展学习,叶子等着你们【叶子社区】

1、定义

  • 从图中的某个顶点v开始,先访问该顶点再依次访问该顶点的每一个未被访问过的邻接点 w1、w2、...

  • 然后按此顺序访问顶点w1、w2、...的各个还未被访问过的邻接点。

  • 重复上述过程,直到图中的所有顶点都被访问过为止。

练习1:从v0出发,写出它的按广度优先搜索进行遍历的遍历序列。

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索_第1张图片

 广度优先搜索过程:

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索_第2张图片

  • 对于一个图,从某个顶点出发可得到多种搜索遍历结果,即一个图的BFS序列不唯一。

  • 给定起始点图的存储结构时,BFS算法所给出的BFS序列是唯一的。

练习2:从v点出发,写出它的按广度优先搜索进行遍历的遍历序列。

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索_第3张图片

  广度优先搜索过程:

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索_第4张图片

​​​2、算法分析

  • 核心思想:使用队列记录所有的结点,只要进入到队伍,表示被访问。

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索_第5张图片

  • 广度优先搜索遍历中,需要使用队列,依次记住被访问过的顶点,因此,算法开始时,访问起始点V,并将其插入队列中,以后每次从队列中删除一个数据元素,就依次访问它的每一个未被访问过的邻接点,并将其插入队列中。这样当队列为空的时候,表明所有与起始点相通的顶点都已被访问完毕,算法结束。

  • 顶点的出队顺序,就是广度优先搜索遍历的序列。


3、算法实现

  • 算法核心:

    • 使用一个队列记录当前节点,所有未被访问的邻接点。

    • 使用一个visited数组,记录顶点是否被访问

public class BTraverser {
	private static boolean[] visited;// 访问标志数组
	// 对图G做广度优先遍历
	public static void BFSTraverse(IGraph G) throws Exception {
		visited = new boolean[G.getVexNum()];// 访问标志数组
		for (int v = 0; v < G.getVexNum(); v++)
			// 访问标志数组初始化
			visited[v] = false;
		for (int v = 0; v < G.getVexNum(); v++)
			if (!visited[v]) // v尚未访问
				BFS(G, v);
	}
	private static void BFS(IGraph G, int v) throws Exception {
		visited[v] = true;
		System.out.print(G.getVex(v).toString() + " ");
		LinkQueue Q = new LinkQueue();// 辅助队列Q
		Q.offer(v);// v入队列
		while (!Q.isEmpty()) {
			int u = (Integer) Q.poll();// 队头元素出队列并赋值给u
			for (int w = G.firstAdjVex(u); w >= 0; w = G.nextAdjVex(u, w))
				if (!visited[w]) {// w为u的尚未访问的邻接顶点
					visited[w] = true;
					System.out.print(G.getVex(w).toString() + " ");
					Q.offer(w);
				}
		}
	}

	public static void main(String[] args) throws Exception {
		ALGraph G = GenerateGraph.generateALGraph();
		BTraverser.BFSTraverse(G);
	}
}

4、性能分析

广度优先搜索遍历图的过程,实际上就是寻找队列中顶点的邻接点的过程。

假设图中有n个顶点和e条边

  • 时间复杂度

    • 当图的存储结构采用邻接矩阵时,需要扫描邻接矩阵的每一个顶点,其时间复杂度为O(n2)

    • 当图的存储结构采用邻接表时,需要扫描邻接表中的每一个单链表,其时间复杂度为O(e)

  • 空间复杂度

    • 需要使用队列,依次记住被访问过的顶点,每一个顶点最多入队、出队一次,空间复杂度为O(n)

    • 增设一个辅助数组visited,空间复杂度为O(n)。


写到最后

四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!

 你的支持认可是我创作的动力

 创作不易,不妨点赞评论❤️收藏一下

 感谢大佬们的支持,欢迎各位前来不吝赐教

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索_第6张图片

 

你可能感兴趣的:(阶段一:数据结构,数据结构,算法,广度优先)