广度优先搜索
应用场景
- 从节点A到节点B,是否存在路径?
- 从节点A到节点B的最短路径是什么?
思想
- 创建一个队列用于存储要搜索的点;
- 从队列中弹出一个点,判断条件,执行操作:如果满足退出条件则程序结束,否则将该点的所有邻居存入队列,继续执行第二步,直到遍历结束。
代码实现
public boolean bfs(Queue<String> queue, StringBuilder[] searched, String next) {
for (StringBuilder s : searched) {
// 有搜过当前点,则跳过这个点,继续广搜
if (queue.peek().equals(s)) {
queue.poll();
bfs(queue, searched, next);
}
}
if (queue.poll().equals("c")) {
// 如果找到了点,则返回
return true;
} else {
// 没有找到这个点,则将下一个点加入队列,继续广搜
queue.offer(next);
next = "a";
bfs(queue, searched, next);
}
return false;
}
深度优先搜索
思想
逮着一个分支操作完,返回上一个最近的分支接着操作,直到遍历完。
总结
差异
- 两种搜索方式的唯一差异就是确定下一个搜索的点是哪位
- 前者在答案靠近原点时比较快,后者在答案靠近第一溜分支比较快