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日

相关文章

  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

    算法与数据结构 2023年4月17日
    00
  • 一、对系统理论的认识

           经过一周的时间学习,我们知道了系统的定义:是一个由一组相互连接的要素构成的,能够实现某个目标的整体,任何一个系统都包括三种构成要件:要素连接,功能或目标。       1.系统的连接使得系统呈现特定的结构,使得系统的各个部件连接而产生系统特有的功能—相关性导新功能涌现。连接的媒介—“三流”(信息流,能量流,物质流)。       2.系统的静态…

    算法与数据结构 2023年4月18日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • 如何使用C语言实现平衡二叉树数据结构算法

    使用C语言实现平衡二叉树数据结构算法可以分为以下几个步骤: 第一步:了解平衡二叉树 平衡二叉树是一种二叉搜索树,它具有以下特点: 高度平衡:每个节点的左右子树的高度差不能超过1。 有序性:对于任意一个节点,它的左子树中的所有节点都小于它,它的右子树中的所有节点都大于它。 平衡二叉树的优点在于它的查找、插入和删除操作都可以在O(log n)的时间内完成,比较快…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之环形链表

    Java 数据结构与算法系列精讲之环形链表 概述 在本文中,我们将探讨环形链表的相关概念,以及如何使用Java语言实现环形链表的各种操作。我们将依次介绍以下几个部分: 环形链表的基本概念 环形链表的创建 环形链表的遍历 环形链表的插入、删除、查找等操作 环形链表的示例程序 环形链表的基本概念 链表是一种基本的数据结构,是由一组节点组成的序列,每个节点包含数据…

    数据结构 2023年5月17日
    00
  • ecnuoj 5039 摇钱树

    5039. 摇钱树 题目链接:5039. 摇钱树 感觉在赛中的时候,完全没有考虑分数规划这种做法。同时也没有想到怎么拆这两个交和并的式子。有点难受…… 当出现分数使其尽量大或者小,并且如果修改其中直接相关的某个值会导致分子分母同时变化的时候,还是要多想想分数规划的做法。 下面引用一下题解 另外这两个交和并的式子,令 \(a = S \and T, b = T…

    算法与数据结构 2023年4月17日
    00
  • C语言植物大战数据结构二叉树递归

    C语言植物大战数据结构二叉树递归攻略 什么是二叉树? 二叉树是一种树形结构,每个节点最多只能有两个子节点。这两个子节点被称为左子树和右子树。二叉树具有自己的结构,因此它们也适合表示具有层次结构的数据。 什么是递归? 递归是一种算法的编写技巧,通过自己来定义自己的方法,以达到解决问题的目的。递归算法把复杂的问题简单化,但是也存在着可能导致程序无限递归的风险。 …

    数据结构 2023年5月17日
    00
  • Java数据结构之线段树的原理与实现

    Java数据结构之线段树的原理与实现 什么是线段树 线段树是一种基于分治思想的数据结构,它可以用来解决各种区间查询问题,例如区间求和、最大值、最小值等等。在算法竞赛和数据结构课程中,线段树被广泛应用,是一种非常实用的数据结构。 线段树的基本原理 线段树是一种二叉树,它的每个节点包含一个区间,叶子节点表示区间中的单个元素,非叶子节点表示区间的合并。 线段树的建…

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