怎么理解java图的对象化描述

技术怎么理解java图的对象化描述这篇文章主要讲解了“怎么理解java图的对象化描述”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java图的对象化描述”吧!一、

本文主要讲解“如何理解java图的对象描述”。本文的解释简单明了,易学易懂。现在,请跟随边肖的思路,一起学习学习《如何理解java图的对象描述》!

00-1010对于画面,我一直是懵懂的。

懂图的意思,但不懂图的具体实现。

对于目前各大厂商的面试问题,无非以下几点:

深度优先搜索,广度优先搜索:DFS,BFS最小生成树:Kruskal,Prim最短路径:Dijkstra,Dijkstra增强堆拓扑排序:TopologicalSort

事实上,这些算法听起来并不太难理解,但是当我们实际编写代码时,我们会发现一件事。愚蠢的图的边和点太难描述,导致写的人和写的人都消失了,我们绕不开他们。

一、前言

是我们现实生活中的连接关系的抽象,比如朋友圈,微博的关注关系。

对于图,有向图和无向图,如下图所示:

怎么理解java图的对象化描述

我们可以看到,有向图表示只有一个顶点可以到达另一个顶点,而无向图表示两个顶点可以互相到达。

在图1中,V4到达V1,而V1无法到达V4。

图2中,V4到达V1,V1也可以到达V4。

当然,还有另外一种图形形式,叫做加权图(主要用来计算一些距离和通行费),如下图所示:

怎么理解java图的对象化描述

00-1010我们刷题的时候,题目给出的例子往往是这样的:743。网络延迟时间。

怎么理解java图的对象化描述

标题会给我们一个二维矩阵。一行矩阵有三个数字:起点、终点和权重。

如何表达这个二维矩阵,成了我们在画图题中要做的一件难事。

在本文中,我们将直接使用特殊的表示来解决这个问题。我们将从最基本的邻接矩阵和邻接表表示开始。

二、什么是图

邻接矩阵是表示图中顶点之间邻接关系的矩阵。

无向图的邻接矩阵:对称矩阵:int[][]

怎么理解java图的对象化描述

有向图的邻接矩阵:行之和为度,列之和为度。

怎么理解java图的对象化描述

加权图的邻接矩阵

怎么理解java图的对象化描述

三、怎么存储一个图的结构

邻接表是链式存储结构,类似于链表数组。

无向图邻接表:hashmap整数,ArrayList整数

怎么理解java图的对象化描述

1、邻接矩阵

让我们想一想,以上两种方法是图的表示图像吗?

虽然有些题目用矩阵表示的时候做起来很舒服,但是还是好好想想吧。当我们找到最小生成树时,当我们使用边的连接来解锁点时,我们将使用矩阵。

感觉不是很抽象很难理解,如所示,我们需要定制一个图的表示方法来增强我们对图的理解。

对于图表,我们来思考一下它主要包括哪些内容。

图是由点和边组成的结构,也就是说,如果我们想画一个图,我们必须有点和边。

重点描述:

点的值:整数值

相邻点:数组列表节点下一个

相邻边:数组列表边

度:int in

>

出度:int out

public class Node {
    public int value;
    public int in;
    public int out;
    public ArrayList<Node> nexts;
    public ArrayList<Edge> edges;
    public Node(int value) {
        this.value = value;
        in = 0;
        out = 0;
        nexts = new ArrayList<>();
        edges = new ArrayList<>();
    }
}

边的描述:

来自哪里:Node from去往哪里:Node to边的权重:int weight

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

图的描述:

多个点的集合:HashMap<Integer, Node> nodes多个边的集合:Set<Edge> edges

public class Graph {
    public HashMap<Integer, Node> nodes;
    public Set<Edge> edges;
    public Graph() {
        nodes = new HashMap<>();
        edges = new HashSet<>();
    }
}

这里可能有疑问了,你这样写虽然形象,但是怎么进行转化呢?

别急,下面我们就进行转化。

public static Graph createGraph(int[][] matrix) {
        // 初始化一个图
        Graph graph = new Graph();
        for (int[] arr : matrix) {
            // 来的点
            int from = arr[0];
            // 去的点
            int to = arr[1];
            // 权重
            int value = arr[2];
            // 生成相对应的点
            Node fromNode = new Node(from);
            Node toNode = new Node(to);
            // 查看当前有没有这个点的信息
            if (!graph.nodes.containsKey(from)) {
                graph.nodes.put(from, fromNode);
            }
            if (!graph.nodes.containsKey(to)) {
                graph.nodes.put(to, toNode);
            }
            // 生成一个边(这里的边是有向边)
            Edge edge = new Edge(fromNode, toNode, value);
            // 点里面加入边
            graph.nodes.get(from).edges.add(edge);
            //  点里面加入下一个点
            graph.nodes.get(from).nexts.add(toNode);
            // 点里面加入入度和出度
            graph.nodes.get(from).out++;
            graph.nodes.get(to).in++;
            // 图里面加入边
            graph.edges.add(edge);
        }
        return graph;
    }

当我们转化完的时候,进行测试:

public static void main(String[] args) {
        int[][] arr = new int[][]{{2, 1, 1}, {2, 3, 1}, {3, 4, 1}};
        Graph graph = createGraph(arr);
        // 从2开始的边有哪些
        List<Edge> edgeList = graph.nodes.get(2).edges;
        for (Edge edge : edgeList) {
            System.out.println("从" + edge.from.value + "---->" + edge.to.value + "权值为" + edge.weight);
        }
    }

最终结果:

从2---->1权值为1
从2---->3权值为1

以后我们在做题的时候,都可以保存此转化代码,直接进行调用即可

简单形象的描绘了我们的图

四、图的作用

图经常用在以下地方:

  • 深度优先搜索、广度优先搜索:DFS、BFS

  • 最小生成树:Kruskal、Prim

  • 最短路径:Dijkstra、Dijkstra加强堆版

  • 拓扑排序:TopologicalSort

感谢各位的阅读,以上就是“怎么理解java图的对象化描述”的内容了,经过本文的学习后,相信大家对怎么理解java图的对象化描述这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/77262.html

(0)

相关推荐

  • 为什么spring使用value注解标红(spring中set注入为什么灵活性好)

    技术如何进行spring@value注入配置文件值失败的原因分析今天就跟大家聊聊有关如何进行spring@value注入配置文件值失败的原因分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大

    攻略 2021年12月18日
  • 语文中什么叫双音节词,在语文中,什么叫做双音节词语

    技术语文中什么叫双音节词,在语文中,什么叫做双音节词语由两个音节组成的词就叫双音节词,它占词的绝大多数。如:认真语文中什么叫双音节词、 勤劳 、谨慎等。此外,还有单音节词,如:鸟、 山 、笑等。还有多音节词,如:社会主义

    生活 2021年10月28日
  • Qt中树形控件Tree Widget的使用方法有哪些

    技术Qt中树形控件Tree Widget的使用方法有哪些本篇内容主要讲解“Qt中树形控件Tree Widget的使用方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Q

    攻略 2021年11月30日
  • spark的数据本地优化级别(spark参数优化)

    技术spark中怎么配置启用LZO压缩这篇文章给大家介绍spark中怎么配置启用LZO压缩,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Spark中配置启用LZO压缩,步骤如下:一、spark-en

    攻略 2021年12月17日
  • 怎么解决Xcode10升级导致项目报错的常见问题

    技术怎么解决Xcode10升级导致项目报错的常见问题这篇文章主要讲解了“怎么解决Xcode10升级导致项目报错的常见问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么

    攻略 2021年11月4日
  • 减数过程图手绘,3对染色体的减数分裂图怎么画

    技术减数过程图手绘,3对染色体的减数分裂图怎么画减数分裂的特征主要是同源染色体的分离减数过程图手绘,所以说需要画三对儿同源染色体,在减数第一次分裂画三对 同源染色体的变化。前期同源染色体联会,中期同源 染色体的排列在赤道

    生活 2021年10月28日