Java数据结构之图(动力节点Java学院整理)

Java数据结构之图是动力节点Java学院整理的一篇关于图的攻略教程,该教程包含以下主要内容:

一、图的定义

图是由若干个顶点以及它们之间的相互关系所构成的数学模型。它包含了许多实际生活中的应用,如社交网络、地图、电子邮件网络等。

二、图的存储方式

图的存储方式有两种:邻接矩阵和邻接表。

邻接矩阵

邻接矩阵以二维数组的形式存储图。对于有n个顶点的图,其邻接矩阵大小为n×n。如果顶点i和顶点j之间存在边,则矩阵元素a[i][j]=1,否则a[i][j]=0。此外,当图是有向图时,要注意邻接矩阵的对称性。

邻接表

邻接表是一种链表数组,每个链表中存储了与该顶点相连的其他顶点。它只考虑存在的边,所以用邻接表可以节约存储空间。如果涉及到有向图,还需要使用逆邻接表。

三、图的遍历算法

图的遍历有两种算法:深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索(DFS)

DFS从某个顶点口开始沿着图的某一分支往下遍历,直到一条路走到黑。当该节点的所有后继节点都访问完成后,回溯到该节点的前一个节点重复以上过程。

广度优先搜索(BFS)

BFS从某个顶点开始,先遍历所有与该节点相邻的节点,然后再遍历这些节点所有未访问过的后继节点。也就是说,BFS先遍历距离起始节点近的节点。

四、基本算法

基本算法包括:最短路径、最小生成树、拓扑排序和关键路径。

最短路径

最短路径是指两个顶点之间连接所需的最小步数或最小权值的路径。最短路径算法常见的有Dijstra算法和Floyd算法。

最小生成树

最小生成树是指在一个无向图中生成一个子图,使得这个子图可以连通所有点,且边的权值之和最小。最小生成树算法常见的有Kruskal算法和Prim算法。

拓扑排序

拓扑排序是对于有向无环图来说的,它有多种具体实现算法。它的目的是给顶点下一个有限的偏序编号,使得对于每一条有向边(u,v),节点u在序列中比节点v先出现。拓扑排序算法常见的有深度优先排序算法和Kahn算法。

关键路径

关键路径是与项目完成时间相关的路径,它是贯穿整个项目的关键路径。在关键路径上任何一项活动的完成时间延误都会导致整个项目的完成时间延误。关键路径算法常见的有AOE网络图和AOV网络图。

五、示例说明

下面以一个最短路径的示例来说明图的应用。

假设有如下图所示的无向图,其每个边的权值表示该边的长度。

                1
            /       \
           2         3
        /    \     /   \
       4     5   6      7
      /     / \   
     8    9    10

我们要求顶点1到顶点8的最短路径,可以使用Dijkstra算法来解决。首先,对每个顶点设立一个距离值,初始化距离值为无穷大,再将起始顶点的距离值设为0。然后,采用贪心策略,每次找出距离起点最近的一个顶点,并判断是否能够松弛(减少)其邻接节点的距离值。

以此类推,直到所有顶 点的距离值都被确定为止。在该图中,经过Dijkstra算法计算得出1到8的最短路径为1-2-4-8,路径长度为14。

另一个示例是拓扑排序的应用。假设有以下两个活动:

活动    1    2    3    4    5
时间    4    2    5    8    6

活动    前置活动    1    2    3    4   
       相关活动    5    3    4    5

前者是一组活动及其所需时间,后者是一组活动的前置关系。我们需要在这个活动列表中进行拓扑排序,求出最短完成时间。

首先,对这些活动进行拓扑排序。然后,对于排序结果的每个活动,计算其最早开始时间和最晚开始时间,算出每个活动的最早完成时间和最晚完成时间。最短完成时间即为最后一个活动的最晚完成时间。在该例中,拓扑排序结果为1-2-3-4-5,最短完成时间为23。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之图(动力节点Java学院整理) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 比特币区块链的数据结构

    让我来为你详细讲解比特币区块链的数据结构。 1. 区块链的定义 比特币区块链是一个去中心化的、可追溯的、公共的、可验证的交易数据库。每一笔交易都通过哈希算法,与之前的交易连接成一个区块,形成了一个数据结构链,也就是“区块链”。 2. 区块链的数据结构 区块链的数据结构由区块、交易和哈希三部分组成: 区块 区块是区块链数据结构的基本单位,每一个区块代表着一段时…

    数据结构 2023年5月17日
    00
  • C++数据结构红黑树全面分析

    C++数据结构红黑树全面分析攻略 红黑树是一种自平衡二叉搜索树,它可以保证最坏情况下的操作时间复杂度为O(logn),是一种非常高效的数据结构,而且广泛应用于STL等库的实现中。本文将详细介绍红黑树的基本概念、插入、删除、查找等相关操作,帮助读者深入理解和掌握红黑树的实现过程。 基本概念 红黑树是一种特殊的二叉搜索树,它的每个节点要么是红色,要么是黑色。同时…

    数据结构 2023年5月17日
    00
  • Halcon学习教程(一) 之提取十字线中心 图像分割

      原文作者:aircraft   原文链接:https://www.cnblogs.com/DOMLX/p/17266405.html      废话不多说,因为毕业后工作原因比较忙,好久没更新博客了,直接上图。。。     上图有个十字线,我们要提取出十字线的中心(Hhhh这个线是我随手画的 没画直!!) 第一步:肯定是读取图像进行灰度提取处理啦。   …

    算法与数据结构 2023年4月18日
    00
  • js处理层级数据结构的方法小结

    “JS处理层级数据结构的方法小结”是一篇讲解JavaScript如何处理嵌套数据结构的文章。在现代的web应用中,嵌套结构是非常常见的,比如JSON数据、树形数据等。以下是对该话题的详细讲解: 1. 嵌套数据结构的概念 指的是包含嵌套关系的数据类型,如数组、对象、树形结构、XML文档等。这些类型之间有着固定层级关系,包含多个层次的数据。嵌套数据结构的处理,往…

    数据结构 2023年5月17日
    00
  • C++数据结构的队列详解

    C++数据结构的队列详解 队列是什么? 队列是一种先进先出(First In First Out, FIFO)的数据结构,类似于现实生活中的排队等待服务。 队列中的数据按照先进先出的原则被处理。新的元素只能被插入在队列的末尾,而旧的元素只能从队列的开头被删除。因此,队列的末尾称为队尾,队列的开头被称为队头。 队列的实现方式 数组实现方式 队列可以使用数组实现…

    数据结构 2023年5月17日
    00
  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月19日
    00
  • C++数据结构与算法之反转链表的方法详解

    C++数据结构与算法之反转链表的方法详解 在C++中,反转链表是一种常见的数据结构与算法技巧。在本文中,我们将详细讲解反转链表的实现过程以及常见的两种反转方法。 基本定义 在开始讲述反转链表算法之前,我们先介绍一下链表的基本定义。 链表是一种数据结构,其中每个节点包含一个数据元素和一个指向下一个节点的指针。下面是一个简单的链表的节点结构定义: struct …

    数据结构 2023年5月17日
    00
  • C++抽象数据类型介绍

    C++抽象数据类型介绍 什么是抽象数据类型? 抽象数据类型(Abstract Data Type,ADT),是数据类型的一个数学模型。它实现了数据类型的抽象过程,将数据与操作分离,使得操作具有独立性,而数据只作为函数参数和返回值存在。 举个例子,ADT可以定义一个栈(Stack),栈的实现需要以下操作: 初始化栈 压入数据 弹出数据 获取栈顶数据 检查栈是否…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部