Java 广度优先搜索(BFS)
我正在研究BFS算法,我刚才有一个关于如何将相邻节点插入队列的问题 例如,假设我们正在处理一个无向图,我们希望执行BFS以输出图的内容,那么我们如何知道在从队列中拉出初始节点后,相邻节点插入队列的顺序是什么?此外,是否有任何方法可以修改相邻节点插入队列的方式Java 广度优先搜索(BFS),java,algorithm,traversal,breadth-first-search,Java,Algorithm,Traversal,Breadth First Search,我正在研究BFS算法,我刚才有一个关于如何将相邻节点插入队列的问题 例如,假设我们正在处理一个无向图,我们希望执行BFS以输出图的内容,那么我们如何知道在从队列中拉出初始节点后,相邻节点插入队列的顺序是什么?此外,是否有任何方法可以修改相邻节点插入队列的方式 任何帮助都将不胜感激,谢谢 兄弟姐妹(邻居)的插入顺序完全由插入它们的代码决定-从理论角度来看没有要求。BFS的要求是,在深度k+1处的任何节点之前,先遍历深度k处的所有节点 例如,给定队列q和根节点root: q.enqueue(root
任何帮助都将不胜感激,谢谢 兄弟姐妹(邻居)的插入顺序完全由插入它们的代码决定-从理论角度来看没有要求。BFS的要求是,在深度
k+1
处的任何节点之前,先遍历深度k
处的所有节点
例如,给定队列q
和根节点root
:
q.enqueue(root);
while(!q.isEmpty()) {
Node n = q.dequeue();
<process n>
// add children to queue
for (Node child : n.getChildren()) {
q.enqueue(child);
}
}
代码可以设置为按数字顺序遍历子级。它将处理1,将其子级(1.1、1.2、1.3)添加到队列,处理1.1,将其子级(无)添加到队列,处理1.2,将其子级(1.2.1、1.2.2)添加到队列,处理1.3,将其子级(1.3.1)添加到队列,然后移动到第三级
如果要修改顺序,可以(A)更改将节点添加到队列中的代码逻辑,指定选择下一个要推送的子节点的特定方式,而不是盲目迭代,(B)更改/覆盖Enqque块调用的迭代函数getChildren()
,或(C)如果您知道迭代的方法,但无法更改代码,请强制树具有将由迭代函数以您想要的方式遍历的设置,例如通过重命名节点或以特定方式在结构中链接节点。方案(B)可能是首选方案
既然你说这个图是“无向的”,听起来好像你无法控制这个图本身的顺序,所以选项(C)无论如何都不起作用。因此,如果要控制子节点的顺序,则需要让迭代代码以某种方式对节点进行排序,以便获得一致的结果。答案部分取决于节点是邻居这一事实的表示方式。根据BFS算法的实现,邻域的顺序可能重要,也可能不重要。在许多情况下,顺序没有区别。为了添加实际的透视图,图形很可能使用标准数据结构表示,如邻接列表(在这种情况下,邻居将以其作为当前节点的邻居添加的任何顺序进行迭代)、邻接矩阵(在这种情况下,邻居可能会以升序数字顺序进行迭代)或边列表(在这种情况下,邻居将以其边添加的任何顺序进行迭代)。如果对邻接列表或边列表数据结构使用集合而不是列表,则可能未指定顺序。
1
1.1 1.2 1.3
1.2.1 1.2.2 1.3.1