在BFS中,节点在生成时进行目标测试。在其他搜索中,节点在扩展之前进行目标测试。这两个语句之间的区别是什么?这有什么好处?
答案 0 :(得分:1)
广度优先搜索(BFS)使用节点队列进行处理。可以使用堆栈类似地编写用于比较的深度优先搜索(DFS)。
展开节点时,所有相邻的未访问节点都会添加到队列(或堆栈)中。
当节点经过目标测试时,算法会检查节点是否具有某些所需属性,并且应该返回节点而不是继续搜索。
请注意,这是一个搜索,一旦找到所需的节点就会停止,而不是遍历,它始终访问所有可到达的节点。
在将新节点添加到队列之前进行BFS目标检查。 BFS在从队列中提取节点后扩展节点。
出于效率原因,BFS可以在添加到队列之前进行目标测试。对于BFS,您从根节点向外遍历以查找目标节点。如果您已找到目标(或目标,如果它不是唯一的),则无需进一步搜索相邻节点。如果在将节点添加到队列之前进行目标测试,则还意味着队列中已有的节点都不是目标。换句话说,如果您在从队列中提取节点时进行了目标测试,则在添加第一个目标节点之前,您不会从队列中提取目标节点。通过这种推理,无论是在向队列插入节点时进行目标测试,还是在从队列中提取节点时进行目标测试,都应该找到相同的节点。不同之处在于首先进行目标测试,在返回目标节点之前,您不必处理队列中已有的所有节点。