IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 心得体会day33(日撸 Java 三百行) -> 正文阅读

[Java知识库]心得体会day33(日撸 Java 三百行)

文章链接:日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客

Day33 图的广度优先遍历

33.1 思路:

结合下图,广度优先遍历假设从a节点出发,a访问后,访问领接点b/c,b访问了再访问c,又接着访问b的领接点,c的领接点,这样一层一层的访问,这就好比树的层次遍历一样。在访问图时要借助一个队列来实现

如图广度优先遍历的一种顺序是:a->b->c->d->e

33.2 代码实现

结合上面的思路和文章来敲代码,在这段代码中,正如文章所说矩阵只要准备好了,写这些代码真的很方便。我感受最深的是:找节点的邻接点,这一行代码就可以去判断节点的领接点

connectivityMatrix.getData()[tempIndex][i] == 0
    /**
     *  Breadth first traversal. paraStartIndex The start index.
     * @param paraStartIndex
     * @return
     */
    public String breadthFirstTraversal(int paraStartIndex) {
        CircleQueue tempQueue =  new CircleQueue();
        String resultString = "";

        int tempNumNodes = connectivityMatrix.getRows();
        boolean[] tempVisitedArray = new boolean[tempNumNodes];

        //Initialize the queue
        tempVisitedArray[paraStartIndex] = true;
        resultString += paraStartIndex;
        tempQueue.enqueue(new Integer(paraStartIndex));

        //Now visit the rest of the graph
        int tempIndex;
        Integer tempInteger = (Integer) tempQueue.dequeue();
        while (tempInteger != null) {
            tempIndex = tempInteger.intValue();

            //Enqueue all its unvisited neighbors.
            for (int i = 0; i < tempNumNodes; i++) {
                if (tempVisitedArray[i]) {
                    continue;
                }

                //Not directly connected
                if (connectivityMatrix.getData()[tempIndex][i] == 0) {
                    continue;
                }

                //Visit before enqueue.
                tempVisitedArray[i] = true;
                resultString += i;
                tempQueue.enqueue(new Integer(i));
            }

            //Take out one from the head.
            tempInteger = (Integer)tempQueue.dequeue();
        }

        return resultString;
    }

结合单元测试的例子画的图如下:

This is the connectivity matrix of the graph.
[[0, 1, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 1, 0]]
No element in the queue
The breadth first order of visit: 2031

33.3 判断联通性

在今天的文章中,这个遍历只能遍历连通图(有向图),若是非连通图,则会漏一些节点数据(需要加一个循环来验证节点是否访问完)。在代码中有一个布尔类型数组:boolean[] tempVisitedArray = new boolean[tempNumNodes];若我们在一次广度遍历完遍历这个tempVisitedArray数组,再循环遍历是否有false,若有则说明图是非连通图,这是我们还需要把未遍历的节点再遍历完。我自己写了一个判断连通,这里传了一个参数,为了方便,没有将这个数组设置为成员变量,仅仅只是做了一个测试。

    /**
     * Judge connectivity
     * @param tempVisitedArray bool类型 数组
     * @return
     */
    public boolean isConectivity(boolean[] tempVisitedArray) {
        int tempNumNodes = connectivityMatrix.getRows();
        for (int i = 0; i < tempNumNodes; i++){
            if (!tempVisitedArray[i]){
                System.out.println("The graph is not connectivity, The node is " + i);
                return false;
            }
        }
        return true;
    }

测试 1:?将测试的领接矩阵改为如下图所示的非连通图,则会发现打印的遍历会少打印

This is the connectivity matrix of the graph.
[[0, 1, 1, 0, 0], [1, 0, 0, 1, 0], [1, 0, 0, 1, 0], [0, 1, 1, 0, 0], [0, 0, 0, 0, 0]]
No element in the queue
The graph is not connectivity, The node is 4  //则是未被访问的节点 则图为非连通
The breadth first order of visit: 2031

测试2: (这里考虑的是无向图)

This is the connectivity matrix of the graph.
[[0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 1, 0]]
No element in the queue
The graph is not connectivity, The node is 3
The breadth first order of visit: 012

总结:

今天主要学习了图的遍历之广度优先遍历算法,结合day32利用矩阵运算可以判断图的连通性,则今天的广度优先遍历算法也可以判断图的连通性,我们只需要再借助一个bool类型的数组即可

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:48:23  更:2022-03-06 12:50:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:42:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码