有人可以简单介绍一下BFS和DFS吗?
我想了解何时比BFS更偏爱BFS。
答案 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)
开始,然后寻找其子节点(节点1
,2
)[下一级]。3
,2
)并寻找其子级(节点3
,4
,5
)[下一级]。6
,4
,5
),并寻找这个孩子(没有孩子)[没有下一层]。您可以在此处认识到,节点的直接子节点(下一级)始终是最接近该节点的节点,因此使用BFS而不是DFS的优点在于,它可以为您保证从节点{{ 1}}使用尽可能短的路径到达节点6
。
但是请注意,BFS算法无法找到所有类型图形的最短路径。我在此示例中提到的图是未加权图(所有边/路径均相同的图)。如果您的图形是加权的(边缘/路径具有权重,并且不相同),那么您必须使用考虑到这一点的另一种算法(例如Dijkstra)。