换人!小编连怎么能快速找到女朋友都不知道

简介: 换人!小编连怎么能快速找到女朋友都不知道

换人!小编连怎么能快速找到女朋友都不知道

在数据结构中对广撒网有一种类似的定义,叫做广度优先搜索(Breadth-First-Search),简称BFS。是一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次进的,依次往外搜索。

image.png


先把一个顶点附近的顶点查找一遍,然后再从它附近的顶点开始查找,重复一样的操作。如上图所示,先从A点出发,查找离A点最近的B和C,如果这两个不是想要的节点,那么就以B和C为起点,查找与B和C相连接的顶点。广度优先搜索策略得到的路径是起始点到终点的最短路径


为什么说广度优先搜索策略找到的路径是最短路径呢?最简单的一种解释方式,想想圆规画圆,以A点为顶点,不断的增加圆的半径。


这个像不像你先跟某寝室的女孩子小A相处,然后发现小A不跟你玩,然后你开始通过A对她的室友下手,emmm……最后得出结论,渣男实锤了。我们下次还是聊点专一的操作吧。


编程逻辑

  1. 从一个顶点 A 出发,查找与 A 相通的其它顶点
  2. 判断查找的顶点是否访问过,访问过则直接跳过
  3. 如果顶点没有访问过,判断顶点是否为要查找的顶点
  4. 如果是不是要查找到顶点,则标记顶点为已访问的状态
  5. 把刚刚更改状态的顶点放入待查找顶点集合
  6. 接着寻找顶点 A 的相通顶点,重复 2 ~ 5 的步骤
  7. 当 A 的通顶点都遍历一遍时,从待查找顶点集合中取出一个元素,重复上述 1 ~ 6 的操作

代码实现

import java.util.LinkedList;
import java.util.Queue;
/**
 * 广度优先搜索
 *
 * @since 2021-03-18
 */
public class GrapBfs {
    // 顶点的个数
    private int v;
    // 邻接表
    private LinkedList<Integer>[] adj;
    public GrapBfs(int v) {
        this.v = v;
        adj = new LinkedList[v];
        for (int i = 0; i < v; i++) {
            adj[i] = new LinkedList<>();
        }
        visited = new boolean[v];
        pre = new Integer[v];
        for (int i = 0; i < v; i++) {
            pre[i] = -1;
        }
    }
    /**
     * 一条边的两个顶点,表示两个边相连
     *
     * @param s 顶点
     * @param t 顶点
     */
    public void addEdge(int s, int t) {
        adj[s].add(t);
        adj[t].add(s);
    }
    public int getV() {
        return v;
    }
    public LinkedList<Integer>[] getAdj() {
        return adj;
    }
    // 存放接下来需要查找其周边顶点的顶点
    Queue<Integer> queue = new LinkedList<>();
    // 记录顶点是否已经被访问过
    boolean[] visited;
    // 记录顶点的前一个顶点
    Integer[] pre;
    /**
     * 广度优先搜索
     * 
     * @param start 起始位置
     * @param end 结束位置
     */
    public void bfs(int start, int end) {
        if (start == end) {
            return;
        }
        queue.offer(start);
        Integer present;
        visited[start] = true;
        while (!queue.isEmpty()) {
            present = queue.poll();
            LinkedList<Integer> linkedList = adj[present];
            for (Integer nextVertex : linkedList) {
                if (visited[nextVertex]) {
                    continue;
                }
                visited[nextVertex] = true;
                pre[nextVertex] = present;
                if (nextVertex == end) {
                    print(pre, nextVertex);
                    System.out.println(end);
                    return;
                }
                queue.offer(nextVertex);
            }
        }
    }
    /**
     * 输出查找的路径
     * 
     * @param pre 记录顶点前一个顶点的数组
     * @param nextVertex 当前顶点的下一个顶点
     */
    private void print(Integer[] pre, Integer nextVertex) {
        if (pre[nextVertex] == -1) {
            return;
        }
        print(pre, pre[nextVertex]);
        System.out.print(pre[nextVertex]);
    }
    public static void main(String[] args) {
        GrapBfs grap = new GrapBfs(9);
        grap.addEdge(1, 2);
        grap.addEdge(1, 4);
        grap.addEdge(2, 3);
        grap.addEdge(2, 5);
        grap.addEdge(3, 6);
        grap.addEdge(4, 5);
        grap.addEdge(5, 6);
        grap.addEdge(5, 7);
        grap.addEdge(6, 8);
        grap.addEdge(7, 8);
        grap.bfs(1, 7);
    }
}

复杂度

V 表示顶点的个数,E 表示边的个数

广度优先搜索的时间复杂度为O(E),空间复杂度为O(V)

最坏的情况下,我们从一个顶点出发,需要遍历整个图才能找到需要查找的顶点,此时每个顶点都要进出遍集合,每个边被访问一边,所以时间复杂度为O(V+E)

对一个连通图来说,也就是一个图中的所有顶点都是连通的,E 肯定要大于等于 V-1,所以时间复杂度简写为O(E)

空间消耗主要有是待访问顶点的集合,标记已访问的集合。每一块需要的口存储空间大小都不会超过顶点的个数,所以空间复杂度为O(V)

目录
相关文章
|
3月前
|
存储 人工智能 JavaScript
编织魔法与修电脑:码农征途的奇妙起点
编织魔法与修电脑:码农征途的奇妙起点
67 0
|
10月前
|
程序员
No.17 “迷茫的辍学大学生,我该如何找到自己的方向?”来自B站粉丝的求助信(二)
No.17 “迷茫的辍学大学生,我该如何找到自己的方向?”来自B站粉丝的求助信(二)
|
10月前
|
Go
No.17 “迷茫的辍学大学生,我该如何找到自己的方向?”来自B站粉丝的求助信(一)
No.17 “迷茫的辍学大学生,我该如何找到自己的方向?”来自B站粉丝的求助信
|
10月前
|
区块链
No.17 “迷茫的辍学大学生,我该如何找到自己的方向?”来自B站粉丝的求助信(三)
No.17 “迷茫的辍学大学生,我该如何找到自己的方向?”来自B站粉丝的求助信(三)
|
机器学习/深度学习 编解码 人工智能
腾讯的这个算法,我搬到了网上,随便玩!
腾讯的这个算法,我搬到了网上,随便玩!
腾讯的这个算法,我搬到了网上,随便玩!
|
弹性计算 Cloud Native 算法
“我想要用我余生,换夜空繁星闪耀”
本文是7月28日《一个95后阿里郎的自学修养》文字稿,我们花了一个小时时间,从一阿里郎学生时代的成长经验,聊到了求职时期的tips,最后聊到了工作后的收获,希望与象牙塔里的你一起分享。
2097 0
“我想要用我余生,换夜空繁星闪耀”
|
传感器 人工智能 运维
融合阿里云,牛客助您找到心仪好工作
给面试官和求职者提供face to face的交流体感。
258 0
融合阿里云,牛客助您找到心仪好工作
|
传感器 人工智能 运维
牛客融合阿里云,助您找到心仪好工作
牛客网在线视频面试业务平台每年支撑数百万求职者与大洋彼岸的面试官进行面对面交流,经过阿里云全球加速产品的加持,用户的使用体验得到了非常大的提升,也进一步提高了求职者的面试成功率。希望我们的融合,能帮您快速找到心仪的好工作!
1218 0
牛客融合阿里云,助您找到心仪好工作
|
数据库 C++
这届清华新生太难了吧!C++作业难到上热搜,特奖都说做不了,大厂猎头已密切关注
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 本科大一,刚学了16周C++,能做个什么项目? 清华大学自动化系2020年的大一C++大作业,是这样要求的: 开发一款集合雨课堂和网络会议优点于一身的网络教学软件。
这届清华新生太难了吧!C++作业难到上热搜,特奖都说做不了,大厂猎头已密切关注
|
新零售
【转】初次创业时,抓住6大要素能让我们少走很多弯路!
前段时间,马云在某次论坛上发言中的一句“8年后最不值钱的是房子”的话,被很多吃瓜群众各种调侃。有人说:对于不缺房子的马云而言,房子当然便宜啦;又有人说:马云又要开荒种菜了,忽悠大家成为韭菜种子,以后好割韭菜等等。
1716 0