广度优先搜索与深度优先搜索

时间:2018-12-19 17:51:32

标签: algorithm graph-algorithm depth-first-search breadth-first-search

有人可以简单介绍一下BFS和DFS吗?
我想了解何时比BFS更偏爱BFS。

1 个答案:

答案 0 :(得分:1)

BFS和DFS都是图遍历算法,两者之间的区别在于每种算法遍历图的方式。

DFS ,假设您有以下图形,我们希望从节点1开始遍历:

          1
         / \
        2   3
       / \   \
      4   5   6

DFS意味着先进行深度搜索,因此它将以这种方式遍历图形:

  • 从节点1开始,然后寻找其子节点。它找到节点2
  • 转到节点2,然后寻找其子节点。它找到节点4
  • 转到节点4,然后发现它没有子节点。
  • 再次Up到节点2并查看其其他子节点。它找到节点5
  • 转到节点5,然后发现它没有子节点。
  • 再次到达节点2,发现它没有更多的子节点。
  • 转到节点1,然后寻找其子节点。它找到节点3
  • 转到节点3,然后寻找其子节点。它找到节点6
  • 转到节点6,发现它没有子节点。
  • 转到节点3,发现它没有更多的子节点。
  • 转到节点1并发现它没有更多的子代,因此图遍历此时已结束。

如果您在这里首先注意到此算法的运行方式,那么它一旦发现节点2是节点1的子代,便开始寻找它。而不关心节点1的其余子节点(节点3),然后转到最深的节点(节点4,{{1} })它开始到5寻找节点Up的其余子节点。

另一方面,考虑我们要使用 BFS 算法遍历同一图形。使用 BFS 时,您开始将图形节点视为级别,相对于您从其开始遍历的节点,每个级别都比其后的级别更近。这意味着:

1

因此遍历该图将是:

  • 从节点 1 (level 0) / \ 2 3 (level 1) / \ \ 4 5 6 (level 2) 开始,然后寻找其子节点(节点12)[下一级]。
  • 遍历1级节点(32)并寻找其子级(节点345)[下一级]。
  • 遍历2级节点(645),并寻找这个孩子(没有孩子)[没有下一层]。
  • 然后图形遍历到此结束。

您可以在此处认识到,节点的直接子节点(下一级)始终是最接近该节点的节点,因此使用BFS而不是DFS的优点在于,它可以为您保证从节点{{ 1}}使用尽可能短的路径到达节点6

但是请注意,BFS算法无法找到所有类型图形的最短路径。我在此示例中提到的图是未加权图(所有边/路径均相同的图)。如果您的图形是加权的(边缘/路径具有权重,并且不相同),那么您必须使用考虑到这一点的另一种算法(例如Dijkstra)。