【图】认识与表达

news2024/9/21 19:24:19

文章目录

    • 一、图的基本构成
    • 二、图的表达方式
      • 1)邻接矩阵
      • 2)邻接表
      • 3)数组
      • 4)综合

一、图的基本构成

地图上有很多的建筑,每个建筑之间有着四通八达的道路连接着,如果想要使用数据结构来表示建筑和建筑之间的道路,就应该选择图。

在这里插入图片描述

树是由节点构成的,存在一对多的关系,并且节点之间有着父节点、子节点的划分。图是比树结构更加复杂的数据结构

树里面的节点放在图中指的是顶点,是图中最基本的单元,存在着多对多的关系,顶点之间都是平等的,没有父顶点、子顶点这样的说法

连接各个顶点的是边,对于带权图来说,边并不是一样的,有各自的权重,就像是城市之间的道路有各自的长短一样。并且边是存在方向的,对于有向图来说,顶点A能够到达顶点B,但是顶点B没有办法到达顶点A,对于无向图来说,顶点A、B之间就是互通的

在这里插入图片描述

二、图的表达方式

关于图的表达方式有很多种,常见的有邻接矩阵、邻接表、数组 …

1)邻接矩阵

邻接矩阵是用来表达顶点之间关联关系的矩阵,就是通过一个 n * n 的数组将图表述出来

在这里插入图片描述

如上图所示,由于有5个顶点,因此创建 5 * 5 的二维数组,数组的行代表着起始顶点,列代表着终止顶点,元素值代表着从起始顶点到终止顶点的权重。

顶点 A 可以通向顶点 B ,权重为 9,数组元素 arr[0][1] 就是 9。当然像顶点 A 到顶点 A 这样的情况,对应的值必然是 0

如果这个图是一个无向图,最后得到的二维数组一定是一个对称的数组,顶点 A 和顶点 B 有关联,顶点 B 必然和顶点 A 有关联

2)邻接表

邻接矩阵的缺点就在于空间占用量太大,如果有 N 个顶点,意味着需要使用到 N * N 的二维数组,N 非常大时,太浪费空间,邻接表法就是一个相对来说更加节省空间的表示图的方法

在这里插入图片描述

在邻接表中,图的每个顶点都会是链表的头节点,一共有 5 个顶点,表示有 5 个链表,头节点后面依次连接着该顶点可以到达的相邻顶点。链表节点由三部分组成:顶点值,到目标顶点的权重,指向下一个节点的地址

如果想要知道顶点 C 是否可以到达顶点 D,只需要对以顶点 C 为链表头节点的链表进行遍历即可,若存在,表示可达,否则不可达

当然如果想要有多少顶点可以到达顶点 D,我们可以选择将所有的链表都进行遍历操作,但是会有一点浪费时间,因此我们可以使用逆邻接表来解决

在这里插入图片描述

逆邻接表每个顶点也作为链表的头节点,链表后面依次跟着的节点是可以到达该顶点的临近顶点,想要找可以到达顶点 D 的顶点都有哪些,直接找到以顶点 D 为头节点的链表进行遍历即可

3)数组

数组也是一种很常见的表达图的方式,使用一个二维数组,其中每一行有三个元素:起点顶点值,目标顶点值,两顶点间的权重

在这里插入图片描述

4)综合

表达图的方式有太多种,在写相关题目的时候,就需要根据题目提供的图的模型来解决问题。为了能够更加快速的解决问题,就需要准备一个图的标准模板,只需要掌握了标准模板解决问题的方法,将题目提供的图的模型转换成标准模板即可

顶点:

public class Node {
    //顶点的值
    public Integer value;
    //顶点的出度(有多少条边以该顶点为起点)
    public int out;
    //顶点的入度(有多少条边以该顶点为终点)
    public int in;
    //有这个顶点发散出去的相邻顶点有哪些
    public ArrayList<Node> nextNodes;
    //由这个顶点发散出去的边有哪些
    public ArrayList<Edge> borderEdges;

    public Node(Integer value) {
        this.value = value;
        out = 0;
        in = 0;
        nextNodes = new ArrayList<>();
        borderEdges = new ArrayList<>();
    }
}

边:

public class Edge {
    //边的起点
    public Node from;
    //边的终点
    public Node to;
    //边的权值
    public int weight;

    public Edge(Node from,Node to,int weight) {
        this.from = from;
        this.to = to;
        this.weight = weight;
    }
}

图:

//图所包含的两大要素,顶点和边
public class Graph {
    //图中所有的顶点,key是顶点的值,value是对应的顶点的具体信息
    public HashMap<Integer,Node> nodes;
    //图中的边
    public HashSet<Edge> edges;

    public Graph() {
        nodes = new HashMap<>();
        edges = new HashSet<>();
    }
}

例如:将通过数组表达的图转换成标准模板

public class ChangeGraph {
    //提供一个二维数组,其中的每一个一维数组由三个元素组成[原点,终点,权值]
    public Graph ChangeCase(int[][] array) {
        Graph graph = new Graph();//创建一个新的图
        for (int i = 0;i < array.length;i ++) {
            int from = array[i][0];
            int to = array[i][1];
            if(!graph.nodes.containsKey(from)) {
                //没有包含起始点,就创建一个新点
                Node fromNode = new Node(from);
                fromNode.out++;//出度加一
                graph.nodes.put(from,fromNode);//添加到图的模型中
            }else {
                //已经包含起始点,那就单纯出度加一
                graph.nodes.get(from).out++;
            }
            if (!graph.nodes.containsKey(to)) {
                //没有包含终点,就创建一个终点
                Node toNode = new Node(to);
                toNode.in++;//入度加一
                graph.nodes.put(to,toNode);//添加到图的模型中
            }else {
                //已经包含终点,就单纯入度加一
                graph.nodes.get(to).in++;
            }
            Node node1 = graph.nodes.get(from);
            Node node2 = graph.nodes.get(to);

            node1.nextNodes.add(node2);//新添加临近点
            Edge newEdge = new Edge(node1,node2,array[i][2]);//创建新边
            graph.edges.add(newEdge);//添加到图的模型中
            node1.borderEdges.add(newEdge);//新添加临近边
        }
        return graph;
    }
}

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

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

相关文章

知识图谱-KGE-语义匹配-双线性模型-2019:CrossE

【paper】 Interaction Embeddings for Prediction and Explanation in Knowledge Graphs【简介】 本文是浙大和苏黎世大学的学者联合发表于 WSDM 2019 上的工作&#xff0c;文章提出了 CrossE&#xff0c;模型的思想也没有很高端&#xff0c;就是引入了一个矩阵C&#xff0c;用…

List——顺序表链表OJ

文章目录前言一、合并两个有序链表二、使用顺序表实现“杨辉三角”三、环形链表四、环形链表Ⅱ总结前言 上两篇内容&#xff0c;对链表和顺序表进行了讲解并手动实现了自己的顺序表和链表&#xff0c;本篇文章将结合LeetCode上的OJ题&#xff0c;进行具体的使用以熟悉其中的方…

Spring注解式缓存redis

一、Spring 整合redis 导入依赖 <redis.version>2.9.0</redis.version> <redis.spring.version>1.7.1.RELEASE</redis.spring.version><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>&l…

Qt中操作SQLite数据库

0.前言 SQLite是一款开源、轻量级、跨平台的数据库&#xff0c;无需server&#xff0c;无需安装和管理配置。它的设计目标是嵌入式的&#xff0c;所以很适合小型应用&#xff0c;也是Qt应用开发种常用的一种数据库。 1.驱动 Qt SQL模块使用驱动程序插件&#xff08;plugins&am…

多线程与高并发(一)

【前言】&#xff1a; 多线程、JVM、操作系统。 【概述】&#xff1a; 基础概念 JUC同步工具 同步容器 Disruptor //一个MQ框架&#xff0c;公认的单机环境下效率最高。 线程池 【线程的概念】&#xff1a; 【纤程】&#xff1a; 【 run和start的区别 】&#xff1a; //n…

[附源码]Python计算机毕业设计SSM家用饰品在线销售系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【面试问题】进程和线程的区别——通俗易懂

1. ”进程“是什么1.2 管理进程1.3 内存管理1.4 进程间通信2. 线程是什么3.进程和线程的区别1. ”进程“是什么 在对比"进程"和"线程"两者之间的区别前,我们需要先了解什么是"进程"?什么是"线程"? **“进程”(process)也叫"任…

HIFI测序揭示拟南芥MSH1参与介导的细胞器基因组重组与变异积累规律

近日&#xff0c;中国农业科学院农业基因组所武志强课题组在《The Plant Journal》在线发表了题为“Long-read sequencing characterizes mitochondrial and plastid genome variants in Arabidopsis msh1 mutants”的研究论文&#xff0c;该研究通过高精度的长读长测序&#x…

安卓APP源码和设计报告——仿淘宝水果商城

项目名称 仿淘宝水果商城项目概述 随着互联网技术地高速发展&#xff0c;计算机进入到每一个人的生活里&#xff0c;从人们的生活方式到整个社会的运转都产生了巨大的变革&#xff0c;而在信息技术发达的今天&#xff0c;互联网的各种娱乐方式都在渗透到人们的生活方式之中&…

Procreate绘画教程

Procreate绘画教程 从 30 多年的设计师/插画家那里彻底有效地学习 Procreate&#xff01;已更新至 Procreate 5.2&#xff01; 课程英文名&#xff1a;Procreate Solid Foundations 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码…

三条建议!让您在世界杯期间确保网络安全!

2022年11月&#xff0c;全球的目光都聚焦在依旧“夏日炎炎”的卡塔尔。随着人们观看、分享赛事的习惯从传统的电视转为网络&#xff0c;世界杯必将成为整个2022年的“流量王”。在我国&#xff0c;仅仅德国与日本的一场比赛在微博平台就带来了13.8亿次阅读。 据估计&#xff0…

细粒度图像分类论文研读-2020

文章目录Filtration and Distillation: Enhancing RegionAttention for Fine-Grained Visual Categorization(by localization- classification subnetwork)AbstractIntroductionApproachDiscriminative Regions ProposingFeature Learning and Recognition EnsembleFiltration…

Spring源码深度解析:十一、Spring的循环依赖

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 这篇文章是接着 Spring源码深度解析&#xff1a;七、bean的加载① - doGetBean 的继续分析过程。 二、什么是循环依赖 循环依赖&#xff0c;其实就是循环引用&#xff0c;就是两个或者两个以上的 bea…

【MySQL】数据处理函数

只有当你开始相信自己时&#xff0c;你才拥有真正的人生。——《洛奇》 前言&#xff1a; 大家好&#xff0c;我是爱打拳的程序猿。今天给大家展示是数据处理函数的用法&#xff0c;分为单行处理函数和分组函数。数据处理函数主要是为了更方便解决数据的各种问题。文章以代码和…

2023年Unity UI教程

2023年Unity UI教程 Unity 新 UI 系统 UI 工具包的完整概述 课程英文名&#xff1a;Modern Unity UI with UI Toolkit 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 课程编号&#xff1a;336 百度网盘地址&am…

SSM框架-获取容器的方式

9 容器 9.1 获取容器 记载类路径下的容器所在的配置文件,也就是之前用的 public class App2 {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao (BookDao) ctx.…

liunx 部署 kkfileview文件预览 以及解决https访问

kkfileview gitee地址 https://gitee.com/kekingcn/file-online-preview 1.下载office组件 wget https://kkfileview.keking.cn/LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz tar -zxvf LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz cd LibreOffice_7.1.4.2_Linux_x86-64_rpm/R…

TensorRT推理手写数字分类(一)

系列文章目录 &#xff08;一&#xff09;使用pytorch搭建模型并训练 文章目录系列文章目录前言一、网络搭建1.LeNet网络结构2.pytorch代码二、网络训练1.pytorch代码2.结果展示三、保存和加载模型1.保存整个网络2.保存网络中的参数总结前言 为了学习一下使用TensorRT进行推理…

硬核!Github星标79.4K的阿里强推Java面试参考指南到底有多强?

谈到Java面试&#xff0c;相信大家第一时间脑子里想到的词肯定是金三银四&#xff0c;金九银十。好像大家的潜意识里做Java开发的都得在这个时候才能出去面试&#xff0c;跳槽成功率才高&#xff01;但LZ不这么认为&#xff0c;LZ觉得我们做技术的一生中会遇到很多大大小小的面…

Java并发编程—如何写好代码?链式调用该怎么玩?

目录 一、案例说明 二、原生方式代码流程 三、链式调用代码流程 四、链式调用手搓的方式&#xff1a; 五、总结&#xff1a; 在上一篇博客https://blog.csdn.net/qq_52545155/article/details/128212148?spm1001.2014.3001.5501&#xff0c;博主在写商城统计商品价格的时…