图Graph的存储、图的广度优先搜索和深度优先搜索(待更新)

news2024/9/25 23:15:07

目录

一、图的两种存储方式

1.邻接矩阵

2.邻接表


生活中处处有图Graph的影子,例如交通图,地图,电路图等,形象的表示点与点之间的联系。

首先简单介绍一下图的概念和类型:

 

图的的定义:图是由一组顶点和一组能够将两个顶点相连的边组成的

图的类型:

顶点之间的连接方向:无方向-->无向图  有方向-->有向图 

边上是否有权值:有-->带权图  无-->无权图

以下分别是:无向无权、有向无权、无向有权、有向有权图

 

 

一、图的两种存储方式

1.邻接矩阵

存储原理:邻接矩阵是一种用数组来表示图的方法,其中矩阵的行和列表示图中的顶点,矩阵元素表示顶点之间是否有边相连。具体来说,如果顶点v和顶点u之间有边,则矩阵的第u行第v列的元素为1;否则为0。带权值则为权值,没有相连的为0。

优点:

  • 结构简单,易于理解和实现。

  • 对于稠密图,邻接矩阵的空间利用率较高。

  • 可以方便地计算出图中节点的度(即与该节点相邻的节点的数量)。

缺点:

  • 对于稀疏图,邻接矩阵可能占用大量空间。

  • 访问相邻节点的速度较慢,需要进行遍历操作。

示例:下图的邻接矩阵存储

 

代码实现 

import java.util.Arrays;

//邻接矩阵
public class Graph01 {

    char[] val;//顶点数据

    int[][] edges;//二维数组记录边

    Vertex[] vertices;//顶点类数组

    int N;//表大小

    public Graph01(char[] arr) {
        this.N = arr.length;
        //初始化顶点数据
        this.val = Arrays.copyOf(arr, arr.length);
        this.edges = new int[this.N][this.N];
        this.vertices = new Vertex[this.N];
        for (int i = 0; i < this.N; i++) {
            this.vertices[i] = new Vertex(arr[i]);
        }
    }

    private class Vertex {
        Character val;

        public Vertex(Character val) {
            this.val = val;
        }
    }

    //打印邻接矩阵
    public void show() {
        System.out.format("%5c", 32);
        for (int i = 0; i < this.N; i++) {
            System.out.format("%5c", this.val[i]);
        }
        System.out.println();

        for (int i = 0; i < this.N; i++) {
            System.out.format("%5c", this.val[i]);
            for (int j = 0; j < this.N; j++) {
                System.out.format("%5d", this.edges[i][j]);
            }
            System.out.println();
        }
    }


    public static void main(String[] args) {
        char[] arr = {'A', 'E', 'F', 'G', 'H', 'P'};
        Graph01 graph01 = new Graph01(arr);

        // 构建边集
        int[][] edges = graph01.edges;
        edges[0][1] = 5;
        edges[0][2] = 4;
        edges[0][3] = 2;

        edges[1][0] = 5;
        edges[1][3] = 1;
        edges[1][4] = 3;

        edges[2][0] = 4;

        edges[3][0] = 2;
        edges[3][1] = 1;
        edges[3][4] = 2;
        edges[3][5] = 4;

        edges[4][1] = 3;
        edges[4][3] = 2;
        edges[4][5] = 3;


        edges[5][3] = 4;
        edges[5][4] = 3;

        // 调用打印方法
        graph01.show();
    }
}

打印结果 : 

 

2.邻接表

存储原理:

邻接表中的每个节点都对应一个链表,链表中的每个元素都是一个顶点(或节点),表示与当前节点相邻的节点。这种方式在处理稀疏图(即边的数量远小于顶点的数量)时效率较高。

优点:

  • 存储空间开销较小,适用于稀疏图。

  • 查找速度快,可以直接通过索引访问相邻节点。

  • 可动态添加、删除节点和边。

缺点:

  • 存储结构相对复杂,不利于处理大规模数据。

  • 空间利用率不高,对于稠密图可能存在大量未使用的节点和边。

代码实现 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//邻接表
public class Graph02 {

    char[] val;//顶点数据

    List<Integer>[] edgesList;//边连接

    Vertex[] vertices;

    int N;//表大小
    public Graph02(char[] arr){
       this.N = arr.length;
       this.val = Arrays.copyOf(arr,arr.length);
       this.edgesList = new List[this.N];
       this.vertices = new Vertex[this.N];
       for (int i = 0; i < this.N; i++) {
            this.vertices[i] = new Vertex(arr[i]);
            this.edgesList[i] = new ArrayList<>();
        }
   }

    private class Vertex{
        Character val;
        public Vertex(Character val){
            this.val = val;
        }
    }

    public void show(){

        //打印邻接矩阵
        for (int i = 0; i <this.N; i++) {
            System.out.format("%-3c",this.val[i]);
            List<Integer> list = this.edgesList[i];
            list.stream().forEach(item->{
                System.out.format("%d-->",item);
            });
            System.out.println();
        }
    }


    public static void main(String[] args) {
        char[] arr = {'A', 'E', 'F', 'G', 'H', 'P'};
        Graph02 graph02 = new Graph02(arr);

        // 构建边集
        List<Integer>[] edges = graph02.edgesList;

        edges[0].add(1);
        edges[0].add(2);
        edges[0].add(3);

        edges[1].add(0);
        edges[1].add(3);
        edges[1].add(4);

        edges[2].add(0);

        edges[3].add(0);
        edges[3].add(1);
        edges[3].add(4);
        edges[3].add(5);

        edges[4].add(1);
        edges[4].add(3);
        edges[4].add(5);

        edges[5].add(3);
        edges[5].add(4);


        // 调用打印方法
        graph02.show();
    }
}

打印结果 :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1236420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webpack 配置

1、基础配置 // node js核心模塊 const path require(path) // 插件是需要引入使用的 const ESLintPlugin require(eslint-webpack-plugin) // 自动生成index.html const HtmlWebpackPlugin require(html-webpack-plugin); // 将css文件单独打包&#xff0c;在index.html中…

Windows系统如何安装与使用TortoiseSVN客户端,并实现在公网访问本地SVN服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

计算机基础知识56

choices参数的使用 # 应用场景&#xff1a; 学历&#xff1a;小学、初中、高中、本科、硕士、博士、1 2 3 4 5 6 客户来源: 微信渠道、广告、介绍、QQ、等等 性别&#xff1a;男、女、未知 # 对于以上可能被我们列举完的字段我们一般都是选择使用…

【JavaEE】Spring的创建和使用(保姆级手把手图解)

一、创建一个Spring项目 1.1 创建一个Maven项目 1.2 添加 Spring 框架支持 在pom.xml中添加 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE&…

智能座舱架构与芯片- (15) 测试篇 下

三、持续集成与交付 3.1 自动化编译框架 在智能座舱软件中&#xff0c;分为上层应用软件和底层软件。有些上层应用软件是与指令集平台无关的&#xff0c;例如Java应用程序等&#xff0c;它们对所运行的CPU平台没有依赖性&#xff0c;可以很好的适配当前平台进行执行。而在底层…

IDEA JRebel安装使用教程

1、下载插件 版本列表&#xff1a;https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions 下载&#xff1a;JRebel and XRebel 2022.4.1 这里下载2022.4.1版本&#xff0c;因为后续新版本获取凭证会比较麻烦。下载完成会是一个压缩包。 2、安装 选择第一步…

机器学习笔记 - 创建CNN + RNN + CTC损失的模型来识别图像中的文本

我们将创建一个具有CTC损失的卷积循环神经网络来实现我们的OCR识别模型。 一、数据集 我们将使用 Visual Geometry Group 提供的数据。 Visual Geometry Group - University of OxfordComputer Vision group from the University of Oxfordhttps://www.robots.ox.ac.uk/~vgg/d…

离散数学考前小记

数理逻辑 求前束范式的一般步骤&#xff1a; 利用等值公式消去“ → \rightarrow →”和“ ↔ \leftrightarrow ↔”否定深入改名前移量词 仅含有全称量词的前束范式称为SKOLEM标准形。 SKOLEM标准形的求解算法&#xff1a; 先求谓词演算公式的前束范式使用n元函数干掉存在…

Keil MDK 安装

0 Preface/Foreword 1 下载和安装 官网&#xff1a;Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. Keil MDK 下载链接&#xff1a;Keil MDK 1.1 下载 根据需求下载对应的Keil MDK edition。 不同的editions包括 …

洛谷 P3252 [JLOI2012] 树

读题就读趋势了&#xff0c;还以为是每个深度都可以选一个&#xff0c;然后深度升序就可以了&#xff0c;以为是个按深度的01背包。 但是前面还说了是一条路径&#xff0c;路径是不能断开的。那就从每个点开始爆搜一次就好了。 看了一下范围n<1e5&#xff0c;n^2爆搜理论上…

【计算机网络笔记】路由算法之距离向量路由算法

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

从0开始学习JavaScript--JavaScript类型化数组进阶

前面的文章&#xff0c;已经介绍了JavaScript类型化数组的基本概念、常见类型和基本操作。在本文中&#xff0c;我们将深入探讨类型化数组的一些进阶特性&#xff0c;包括共享内存、大端小端字节序、以及类型化数组与普通数组之间的转换&#xff0c;通过更丰富的示例代码&#…

4D毫米波雷达和3D雷达、激光雷达全面对比

众所周知&#xff0c;传统3D毫米波雷达存在如下性能缺陷&#xff1a; 1&#xff09;静止目标和地物杂波混在一起&#xff0c;难以区分&#xff1b; 2) 横穿车辆和行人多普勒为零或很低&#xff0c;难以检测&#xff1b; 3) 高处物体和地面目标不能区分&#xff0c;容易造成误刹…

chromium114添加新的语言国际化支持

一、需求说明 需要chromium114支持新语言体系,例如藏语,蒙古语,苗语等 二、操作步骤 1. build/config/locales.gni修改 在all_chrome_locales变量中添加新的语种标识,如下图。 2. 添加编译文件,告诉浏览器在编译时需要加载和输出那些文件 尝试编译出现错误一提示。需要…

读像火箭科学家一样思考笔记05_思想实验

1. 思想实验室 1.1. 思想实验至少可以追溯到古希腊时期 1.1.1. 从那时起&#xff0c;它们就跨越各个学科&#xff0c;在哲学、物理学、生物学、经济学等领域取得重大突破 1.1.2. 它们为火箭提供动力&#xff0c;推翻政府&#xff0c;发展进化生物学&#xff0c;解开宇宙的奥…

十七、SpringAMQP

目录 一、SpringAMQP的介绍&#xff1a; 二、利用SpringAMQP实现HelloWorld中的基础消息队列功能 1、因为publisher和consumer服务都需要amqp依赖&#xff0c;因此这里把依赖直接放到父工程mq-demo中 2、编写yml文件 3、编写测试类&#xff0c;并进行测试 三、在consumer…

c++|内联函数

一、概念 以inline修饰的函数叫做内联函数&#xff0c;编译时c编译器会在调用函数的地方展开&#xff0c;而不会建立栈帧&#xff0c;提升了程序运行的效率 例子&#xff1a; #include <iostream> using namespace std;int Add(int left, int right) {return left - ri…

【qsort学习及改造冒泡排序能排序任何数】

qsort学习及改造冒泡排序能排序任何数 qsort的使用 qsort的使用 这个函数也不是很复杂&#xff01;&#xff01;&#xff01; qsort(void*base,size_t num,size_t width,int(int (__cdecl *compare )(const void *elem1, const void *elem2 )))  void * base,为数组的基地…

人工智能:科技之光,生活之美

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们的生活中&#xff0c;它如同一束璀璨的科技之光&#xff0c;照亮我们生活的每一个角落&#xff0c;使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…

基于单片机设计的气压与海拔高度检测计(采用MPL3115A2芯片实现)

一、前言 随着科技的不断发展&#xff0c;在许多领域中&#xff0c;对气压与海拔高度的测量变得越来越重要。例如&#xff0c;对于航空和航天工业、气象预报、气候研究等领域&#xff0c;都需要高精度、可靠的气压与海拔高度检测装置。针对这一需求&#xff0c;基于单片机设计…