BFS讲解及JAVA实现

打算将BFS和DFS分开来说,这样可以说的详细点,并且将会在分别介绍这两种搜索算法的时候主要去实践,然后理论方面打算单独发出一篇文章将异同点和应用的知识,都会在文章末尾贴出链接的。

BFS

BFS:也就是广度优先搜索。

首先也是举一个图例

BFS讲解及JAVA实现_第1张图片
其主要思想是从S开始,用队列的形式标记访问过的节点,并且这些节点在访问过之后将不会被访问,规范好队列的总容量,并且对经历过的节点进行距离的统计,由于连通图的每一个节点都会被访问,所以,其时间复杂度是O(V+E)。

接下来再用队列的思想将以上图示这种BFS算法实现:

实现思路如下:

  1. 获取到s节点,做为该队列的队尾
  2. 将Search周边节点的行为作为循环的条件。
  3. 每一次探索,默认将距离+1
  4. 将节点的地址设置为key,通过探索传过来的数据判断是否已经将队列遍历干净了。

实现代码如下:

public void bfs(HashMap<Character, LinkedList<Character>> graph,HashMap<Character,Integer> dist,char start){
        Queue<Character> queue = new LinkedList<>();
        queue.offer(start);
        dist.put(start, 0);
        int i = 0;
        while (!queue.isEmpty()) {
            char queueTop = queue.poll(); //获取队首元素,并且将此元素移除
            i++;
            System.out.println("第" + i + "次循环的栈顶为" + queueTop + "并且这个栈顶距离S的举例为" + dist.get(queueTop));
            int distance = dist.get(queueTop)+1;//自动获取到周边节点距离S的长度
            for (Character s : graph.get(queueTop)) {
                if (!dist.containsKey(s)) {//如果dist节点中不含有这个元素,那就是这个元素还没有被offer进队列
                    dist.put(s, distance);
                    queue.offer(s);
                }
            }

        }
    }

总体来说,从例子就可以看出来了,BFS多用于寻找最短路径的问题。

DFS讲解及Java实现:https://blog.csdn.net/qq_41936805/article/details/101978227

你可能感兴趣的:(数据结构与算法)