我理解并可以轻松实现 BFS。
我的问题是,我们怎样才能让这个 BFS 限制在一定的深度?假设,我只需要深入 10 级。
最佳答案
你可以用恒定的空间开销来做到这一点。
BFS 的属性是队列中所有未访问的节点的深度都不会减少,最多增加 1。因此当您从 BFS 队列中读取节点时,您可以在单个 depth
变量中跟踪当前深度, 初始为 0。
你需要做的就是记录队列中的哪个节点对应下一次深度增加。您可以简单地通过使用变量 timeToDepthIncrease
来记录插入此节点时已在队列中的元素数,并在您从队列中弹出节点时递减此计数器来完成此操作。
当它达到零时,您从队列中弹出的下一个节点将处于一个新的、更大(增加 1)的深度,因此:
- 增量
depth
- 将
pendingDepthIncrease
设置为真
每当将子节点压入队列时,首先检查pendingDepthIncrease
是否为真。如果是,则此节点的深度会更大,因此在推送之前将 timeToDepthIncrease
设置为队列中的节点数,并将 pendingDepthIncrease
重置为 false。
最后,当depth
超过想要的深度时停止!稍后可能出现的每个未访问节点必须处于此深度或更深。
[编辑:感谢评论者 keyser。]
关于java - 如何实现广度优先搜索到一定深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258305/