“chaos”的算法--之图的深度遍历和广度遍历

简介:

近段时间又回顾了下数据结构中的图,我之前的有一篇博文介绍了图与线性表和树的区别与联系。
并且就图的存储和图的创建也做了一些简单的说明,

这一篇我将着重说说图的两种基本的遍历方法,深度遍历和广度遍历。
深度遍历:
深度遍历类似于树的先根遍历,是树的先根遍历的推广。假设初始状态是图中所有顶点未曾被访问,则深度遍历可从图中
某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有与v有路径的顶点都被访问到,若此时
图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。
其具体的代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int  DFSTraverse(MGraph G)
{
  int  v;
  printf ( "\n深度遍历输出 : \n" );
  for (v = 0; v < G.vexnum; v++)
  {
   visited[v] = 0;
  }
  for (v = 0; v < G.vexnum; v++)
  {
   if (visited[v] == 0)
   {
    DFS(G, v);
    printf ( "\n" );
   }
  }
  return  true ;
}
int  DFS(MGraph G,  int  v)
{
  int  w;
  visited[v] = 1;
  printf ( "%s  " , G.vexs[v]);
  for (w = 0; w < G.vexnum; w++)
  {
   if (G.arcs[v][w].adj ==1 && visited[w] == 0)
   {
    DFS(G,w);
   }
  }
  return  true ;
}

   其实质是运用了递归思想,在遍历图中时,对图中的每个顶点之多调用一次DNS函数,因为一旦某个顶点呗标志城已被访问,
就不再从它出发进行搜索了,因此遍历图的实质上是对每个顶点查找器邻接点的过程。

广度遍历:
    广度优先搜索遍历类似于树的按层次遍历的过程。假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别
从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的邻接点”被访问,直至图中所有已被访问的邻接点都被访问到,
若此时图中尚有顶点未被访问到,则另选图中一个未被访问的顶点作为起始点,重复上述操作,直至图中所有顶点都被访问到为止。
其具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
int  QueueInit(Queue *sq)
{
  if (sq)
  {
   sq->front = 0;
   sq->rear = 0;
  }
  else
   return  false ;
  return  true ;
}
int  QueueIsEmpty(Queue sq)
{
  if (sq.front == sq.rear)
   return  true ;
  else
   return  false ;
}
int  EnQueue(Queue *sq,  int  x)
{
  if (sq->front == (sq->rear+1)%MAX_VERTEX_NUM)
  {
   printf ( "Queue is full!\n" );
   return  false ;
  }
  else
  {
   sq->data[sq->rear] = x;
   sq->rear = (sq->rear+1)%MAX_VERTEX_NUM;
  }
}
int  OutQueue(Queue *sq)
{
  if (QueueIsEmpty(*sq))
  {
   printf ( "Queue is Empty!\n" );
   return  false ;
  }
  else
  {
   sq->front = (sq->front+1)%MAX_VERTEX_NUM;
  }
}
int  QueueFront(Queue sq,  int  *e)
{
  if (QueueIsEmpty(sq))
  {
   printf ( "Queue is full!\n" );
   return  false ;
  }
  else
  {
   *e = sq.data[sq.front];
   return  true ;
  }
}
int  BFSTraverse(MGraph G)
{
  int  v;
  printf ( "广度遍历 : \n" );
  for (v = 0; v < G.vexnum; v++)
  {
   visited[v] = 0;
  }
  for (v = 0; v < G.vexnum; v++)
  {
   if (visited[v] == 0)
   {
    BFS(G, v);
    printf ( "\n" );
   }
  }
  return  true ;
}
int  BFS(MGraph G,  int  v)
{
  int  v1, v2;
  Queue sq;
  QueueInit(&sq);
  EnQueue(&sq, v);
  visited[v] = 1;
  printf ( "%s  " , G.vexs[v]);
  while (QueueIsEmpty(sq) ==  false )
  {
   QueueFront(sq, &v1);
   OutQueue(&sq);
   for (v2 = 0; v2 < G.vexnum; v2++)
   {
    if (G.arcs[v1][v2].adj != 0 && visited[v2] == 0)
    {
     EnQueue(&sq, v2);
     visited[v2] = 1;
     printf ( "%s  " , G.vexs[v2]);
    }
   }
  }
  return  true ;
}

   对于图的广度优先遍历的试下来说,运用了队列的特点,每一个顶点之多进一次队列,便利图的实质上是通过边或者弧
找邻接点的过程。

   从上可以看出,其实广度遍历和深度遍历它们两者的时间复杂度是一样的,两者的不同之处仅仅在于对顶点访问的顺序不同而已。




     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/836495,如需转载请自行联系原作者



相关文章
|
14天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
17天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
42 5
|
17天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
22 2
|
20天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
24 0
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
27 0
|
4月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
45 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
80 0
|
4月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
69 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
4月前
|
数据采集 存储 算法
「AIGC算法」图搜索算法详解
本文探讨了图搜索算法,包括遍历和最短路径搜索。DFS和BFS是遍历算法,前者使用栈深入搜索,后者用队列逐层遍历。Dijkstra、Bellman-Ford、A*、Floyd-Warshall和Johnson算法则解决最短路径问题。文中还给出了DFS的Python实现示例。这些算法在路径规划、网络分析等领域有重要应用。
91 0
|
1月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面