我在这个项目上独自工作,可以用另一双眼睛来看这个,看看我做错了什么。第一个循环无限运行。
public void bfs(String start)
{
//Initial Case
add_queue.add(start);
graph.visit(start);
Iterator<String> neighbors;
String neighbor;
while(!add_queue.empty())
{
neighbors = graph.neighbors(start);
neighbor = neighbors.next();
graph.visit(neighbor);
add_queue.add(neighbor);
while(neighbors.hasNext())
{
neighbor = neighbors.next();
if(!graph.isVisited(neighbor)) //If vertex is not visited it is new and is added to the queue
{
add_queue.add(neighbor);
graph.visit(neighbor);
}
}
start = add_queue.remove();
remove_queue.add(start); //transfers vertex from add_queue to remove queue so that the order that the vertices were traversed is stored in memory
}
}
答案 0 :(得分:3)
我认为你是在添加邻居的第一个顶点而不检查它是否已被访问过..在这里:
neighbor = neighbors.next(); <- you get first
graph.visit(neighbor); <- you visit
add_queue.add(neighbor); <- you add it without any check
while(neighbors.hasNext())
{
neighbor = neighbors.next();
if(!graph.isVisited(neighbor)) <- you do check for the others
{
add_queue.add(neighbor);
graph.visit(neighbor);
}
}
这意味着你永远不会清空那个队列..因为它以1开头大小,然后你在每次迭代时删除1个元素,但你添加至少1个元素(你从不添加任何人)。
答案 1 :(得分:0)
add_queue
对empty()
的定义是什么?
这可能是一个糟糕的命名问题,但听起来empty()
确实某事,而不只是检查它是否为空(可能称为isEmpty()
)。
此外,看起来你总是在每个外部循环中添加至少1到add_queue(在内部循环之前),但是每次迭代只从add_queue中删除一个项目。
答案 2 :(得分:0)
有几个地方需要调查:
graph.isVisited()
实际上正在识别何时通过graph.visit()
访问了某个节点。graph.neighbor(start)
真的回到了开始的邻居吗?并不包括在此列表中的开头?答案 3 :(得分:0)
您的代码有点不清楚。 graph.neighbors
究竟返回了什么?
通常,为了执行BFS,您希望将当前节点的 children 添加到队列中,而不是它的邻居。由于它全部进入队列,因此将确保以正确的顺序访问树中的每个节点。假设它是一棵树而不是一般图形,这也将确保您不会多次访问节点,从而允许您将检查删除到isVisited
。
因此,将下一个节点从队列中取出,将其所有子节点添加到队列中,访问节点,然后重复,直到队列为空。