[英]Breadth First Search (BFS)
我正在研究 BFS 算法,我只是有一个关于如何将相邻节点插入队列的问题。
例如,假设我们正在处理一个无向图,并且我们想要执行 BFS 来输出图的内容,那么我们如何知道在从初始节点中拉出初始节点后相邻节点插入队列的顺序队列? 另外,有没有办法修改相邻节点插入队列的方式?
任何帮助将不胜感激,谢谢。
兄弟姐妹(邻居)的插入顺序完全由插入它们的代码决定 - 从理论的角度来看没有要求。 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);
}
}
因此,如果以n
作为树的根开始,它将按级别顺序遍历整棵树,即广度优先。 所以你问,孩子是按什么顺序插入的? 好吧,这仅取决于getChildren()
遍历节点的顺序(在本例中)。 其他实现可能会对它们进行排序并按该顺序添加它们。 或者为父母下的孩子制定一个链表顺序。 或者随意挑选。
如果节点具有数值并且树具有格式
1
1.1 1.2 1.3
1.2.1 1.2.2 1.3.1
代码可能被设置为按编号顺序遍历子代。 它将处理 1,将其子项 (1.1, 1.2, 1.3) 添加到队列中,处理 1.1,将其子项(无)添加到队列中,处理 1.2,将其子项 (1.2.1, 1.2.2) 添加到队列中, 处理 1.3 及其子进程 (1.3.1) 到队列中,然后移至第三级。
如果您想修改顺序,您可以 (A) 更改将节点添加到队列的代码逻辑,指定一种特定方式来选择下一个要推送的子节点,而不是盲目地迭代,(B) 更改/覆盖enquque 块调用的迭代函数getChildren()
,或 (C) 如果您知道迭代方法但无法更改代码,则强制树具有迭代函数以您想要的方式遍历的设置,例如通过重命名节点或以特定方式将它们链接到结构中。 选项 (B) 可能是首选。
由于您说该图是“无向图”,听起来您可能无法控制图本身的顺序,因此选项 (C) 无论如何都不起作用。 因此,如果要控制子节点的顺序,则需要使迭代代码以某种方式对节点进行排序,以便获得一致的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.