【数据结构与算法】图 ( 图的存储形式 | 图的基本概念 | 图的表示方式 | 邻接矩阵 | 邻接表 | 图的创建 | 代码示例 )

news2024/9/21 20:26:32

文章目录

  • 一、图的存储形式
  • 二、图的基本概念
  • 三、图的表示方式
    • 1、邻接矩阵
    • 2、邻接表
  • 四、图的创建 ( 代码示例 )





一、图的存储形式



线性表 中的元素 , 有 一个 直接前驱一个 直接后继 ;

中的元素 , 有 一个 直接前驱多个 直接后继 ;

中的元素 , 有 多个 直接前驱多个 直接后继 ;


图 数据结构 中 , 每个 结点 是一个 元素 , 可以有 0 个或 多个 相邻元素 , 两个结点 之间的 连接 称为 边 ;

在下面的图中 , A ~ G 是结点 , 结点之间的连接是 边 , 每条边 可以有权重 ;

在这里插入图片描述





二、图的基本概念



图的基本概念 :

  • 顶点 : 图中的 结点 ;
  • 边 : 图中 结点 之间的边 ;
  • 路径 : 边的权重 ;
  • 图的分类 : 边的方向 ;
    • 无向图 : 结点之间的边 没有方向 ; 上图是一个无向图 ;
    • 有向图 : 结点之间的边 有方向 ; 节点之间的边有箭头 ;
    • 带权图 : 边 是有 权重 的 , 计算时不仅要计算路径 , 还要考虑路径的权重 ;




三、图的表示方式



图的表示方式 :

  • 邻接矩阵 : 二维数组 ;
  • 邻接表 : 链表 ;

1、邻接矩阵


图 中有 6 个结点 , 0 ~ 5 ;

使用 6x6 的矩阵 表示 图 , 第 i 行 第 j 列 的元素表示 结点 i 和 结点 j 是否连接 ;

默认情况下 结点 与 结点 本身 没有连接 ;

第 0 行 第 1 列 值为 1 , 表示 结点 0 到 结点 1 之间 有边连接 ;
第 4 行 第 5 列 值为 1 , 表示 结点 4 到 结点 5 之间 有边连接 ;

在这里插入图片描述


2、邻接表


邻接矩阵 要 为 n 个顶点 分配 n x n 大小的空间 , 存储结点间的边是否存在 , 这样会造成一定的损失 ;

邻接表 中 , 只存储 存在的 边 , 不存储 不存在的 边 ;

邻接表 底层数据结构 由 数组 + 链表 组成 ;


在这里插入图片描述

上图中 , 邻接表 左侧的 0 ~ 5 表示 标号为 0 ~ 5 之间的结点 ;

第一行 0 : 1 -> 2 -> 3 ->4 -> 表示 结点 0 与 1、2、3、4 四个结点之间存在边 ;

第二行 1 : 0 -> 4 -> 表示 结点 1 与 0、4 两个节点之间存在边 ;

第二行 2 : 0 -> 4 -> 5 -> 表示 结点 2 与 0、4、5 三个节点之间存在边 ;

在这里插入图片描述





四、图的创建 ( 代码示例 )



创建下图的数据结构 , 使用 邻接矩阵 表示图 ;

在这里插入图片描述

使用矩阵表示上图 :

[ 0 A B C D E A 0 1 1 0 0 B 1 0 1 1 1 C 1 1 0 0 0 D 0 1 0 0 0 E 0 1 0 0 0 ] \begin{bmatrix} 0 & A & B & C & D & E \\ A & 0 & 1 & 1 & 0 & 0 \\ B & 1 & 0 & 1 & 1 & 1 \\ C & 1 & 1 & 0 & 0 & 0 \\ D & 0 & 1 & 0 & 0 & 0 \\ E & 0 & 1 & 0 & 0 & 0 \\ \end{bmatrix} 0ABCDEA01100B10111C11000D01000E01000


数据结构分析 :

  • 使用 ArrayList 存储顶点 ;
  • 使用 int[][] 邻接矩阵 存储 图 ;

代码示例 :

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

public class Graph {

    /**
     * 图顶点
     */
    private ArrayList<String> vertexList;

    /**
     * 图的邻接矩阵
     */
    private int[][] edges;

    /**
     * 图中边的数据
     */
    private int numOfEdges;

    /**
     *  构造器
     * @param n 顶点个数
     */
    public Graph(int n) {
        // 创建 n x n 邻接矩阵
        edges = new int[n][n];
        // 初始化顶点容器
        vertexList = new ArrayList<>(n);
        // 边数量统计
        numOfEdges = 0;
    }

    /**
     * 插入顶点
     * @param vertex 顶点名称
     */
    public void insertVertex(String vertex) {
        vertexList.add(vertex);
    }

    /**
     * 插入边
     * @param v1 起始顶点索引
     * @param v2 终止顶点索引
     * @param weight 顶点的权重
     */
    public void insertEdge(int v1, int v2, int weight) {
        edges[v1][v2] = weight;
        edges[v2][v1] = weight;

        // 边的数量增加 1
        numOfEdges++;
    }

    /**
     * 获取结点个数
     * @return
     */
    public int getNumberOfVertex() {
        return vertexList.size();
    }

    /**
     * 获取边的个数
     * @return
     */
    public int getNumberOfEdges() {
        return numOfEdges;
    }

    /**
     * 获取指定节点的索引值
     * @param i
     * @return
     */
    public String getVertexByIndex(int i) {
        return vertexList.get(i);
    }

    /**
     * 获取 v1 到 v2 的权值
     * @param v1
     * @param v2
     * @return
     */
    public int getWeight(int v1, int v2) {
        return edges[v1][v2];
    }

    /**
     * 打印邻接矩阵
     */
    public void showGraph() {
        for (int i = 0; i < edges.length; i++) {
            System.out.println(Arrays.toString(edges[i]));
        }
    }

    public static void main(String[] args) {
        // 创建图
        Graph graph = new Graph(5);

        // 添加顶点
        graph.insertVertex("A");
        graph.insertVertex("B");
        graph.insertVertex("C");
        graph.insertVertex("D");
        graph.insertVertex("E");

        // 添加边
        graph.insertEdge(0, 1, 1);  // AB
        graph.insertEdge(0, 2, 1);  // AC

        graph.insertEdge(1, 0, 1);  // BA
        graph.insertEdge(1, 2, 1);  // BC
        graph.insertEdge(1, 3, 1);  // BD
        graph.insertEdge(1, 4, 1);  // BE

        graph.insertEdge(2, 1, 1);  // CA
        graph.insertEdge(2, 2, 1);  // CB

        graph.insertEdge(3, 1, 1);  // DB

        graph.insertEdge(4, 1, 1);  // EB

        // 打印临街矩阵
        graph.showGraph();
    }
}

执行结果 :

> Task :Graph.main()
[0, 1, 1, 0, 0]
[1, 0, 1, 1, 1]
[1, 1, 1, 0, 0]
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]

在这里插入图片描述

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

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

相关文章

常见的视频文件格式有哪些?

常见的视频文件格式有哪些&#xff1f;常见在线流媒体格式&#xff1a;mp4、flv、f4v、webm移动设备格式&#xff1a;m4v、mov、3gp、3g2RealPlayer &#xff1a;rm、rmvb微软格式 &#xff1a;wmv、avi、asfMPEG 视频 &#xff1a;mpg、mpeg、mpe、tsDV格式 &#xff1a;div、…

【学习笔记】构建小型金融知识图谱(github项目)

前言 需要构建农业知识图谱&#xff0c;先来学习一下构建知识图谱的基本流程和套路&#xff0c;熟悉过程方便 科研 后续工作的开展&#xff0c;写下此篇博客作为我的笔记吧~ 参考代码来源&#xff1a;github项目 jm199504/Financial-Knowledge-Graphs 1.知识图谱存储方式 知…

intel的集成显卡(intel(r) uhd graphics) 配置stable diffusion

由于很多商务本没有独立显卡&#xff0c;只有Intel的集成显卡&#xff0c;在配置安装stable diffusion 时候需要特殊对待&#xff0c;参考不少帖子&#xff0c;各取部分现稍加整合。整体思路分两个部分&#xff1a;第一步是先配置环境&#xff0c;主要是安装Anaconda Pytorch&…

Biotin-PEG-SVA,生物素聚乙二醇琥珀酰亚胺戊酸酯,可用于检测或分子标记

Biotin-PEG-SVA 结构式&#xff1a;PEG分子量&#xff1a; 1000&#xff0c;2000&#xff0c;3400&#xff0c;5000&#xff0c;10000中文名称&#xff1a;生物素聚乙二醇琥珀酰亚胺戊酸酯&#xff0c;生物素-PEG-琥珀酰亚胺戊酸酯英文名称&#xff1a;Biotin-PEG-SVA &#xf…

自动化测试项目实战 ——12306火车票网站自动登录工具

还记得前几年春运&#xff0c;12306火车票预订网站经常崩溃无法登录吗。 今天我们就开发一个12306网站自动登录软件。 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解&#xff0c;我们了解了Web的原理. Web的原理就是&#xff0c;浏览器发送一个Request给Web服务器…

torchserve安装、模型的部署与测试(基于docker)

问题描述 pytorch 一直很受大家的欢迎&#xff0c;但是作为一个深度模型&#xff0c;与外界复杂的业务需求交互其实是一件比较麻烦的事情&#xff0c;这里 torchserve 提供一个基于 TCP 的交互方法&#xff0c;算法模型部署后&#xff0c;用户可以通过提交 post 请求&#xff…

今天面了个腾讯拿25K出来的软件测试工程师,让我见识到了真正的天花板...

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

html实现浪漫的爱情日记(附源码)

文章目录1.设计来源1.1 主界面1.2 遇见1.3 相熟1.4 相知1.5 相念2.效果和源码2.1 动态效果2.2 源代码2.3 代码结构源码下载更多爱情表白源码作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/129264757 html实现浪漫的爱情…

Vue3 组合式函数,实现minxins

截至目前&#xff0c;组合式函数应该是在VUE 3应用程序中组织业务逻辑最佳的方法。它让我们可以把一些小块的通用逻辑进行抽离、复用&#xff0c;使我们的代码更易于编写、阅读和维护。 一. 什么是“组合式函数”&#xff1f; 根据官方文档说明&#xff0c;在 Vue 应用的概念中…

你还不会用CAD一键布置停车位?赶紧学起来!

在设计CAD建筑图的过程中&#xff0c;你还在一个一个地画停车位吗&#xff1f;那未免也太低效了吧&#xff01;今天&#xff0c;小编用浩辰CAD建筑软件来教大家一键布置停车位&#xff0c;赶紧学起来吧&#xff01; 浩辰CAD建筑软件是行业应用最广泛的创新型建筑设计专业软件&…

2023软件测试金三银四常见的软件测试面试题-【接口测试】

九、接口测试 9.1 接口测试怎么测 &#xff08;jmeter版本&#xff09; 首先开发会给我们一个接口文档&#xff0c;我们根据开发给的接口文档&#xff0c;进行测试点的分析&#xff0c;主要是考虑正常场景与异常场景&#xff0c;正常场景&#xff0c;条件的组合&#xff0c;…

uni-app实现可滑动日历

效果&#xff1a; uni-calendar.vue <template><view class"uni-calendar"><view v-if"!insert&&show" class"uni-calendar__mask" :class"{uni-calendar--mask-show:aniMaskShow}" click"clean"&…

项目难点——【4】分布式事务

项目难点——【4】分布式事务 1 概述 我们想知道什么是分布式事务首先了解下什么是本地事务。 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现的&#xff0c;因此叫数据 库事务&#xff0c;由于应用主要靠关系数据库来控制事务&#xff0c;而数据库通…

顺序表(2)

目录 1、线性表 2、顺序表 1、概念及结构 2、接口实现 1、SeqList.h 2、SeqList.c 3、练习 例1、移除元素 例2、删除有序数组中的重复项 例3、合并两个有序数组 1、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列&#xff…

运行你的第一个 Django APP

Django 版本&#xff1a;4.1.7 Python 版本&#xff1a;3.9.13 目录一、运行 Django二、创建 APP一、运行 Django 1、新建项目&#xff08;Project&#xff09; 项目类型为 Django&#xff0c;选择虚拟环境&#xff0c;点击 Create 后就会自动下载并安装 Django。 如果你是在 …

机器学习——支持向量机学习

支持向量机(Support Vector Machine, SVM)不仅具有坚实的统计学理论基础,还可以很好地应用于高维数据、避免维度灾难问题&#xff0c;已经成为一种倍受关注的机器学习分类技术。为了解释SVM的基本思想,我们首先介绍一下最大边缘超平面(Maximal Margin Hyperplane)给定训练数据集…

C++STL详解(三)——vector的介绍和使用

文章目录vector的介绍vector的使用vector的定义方式vector的空间增长问题reserve和resizevector的迭代器使用begin 和endrbegin和rendinsert 和erasefind函数元素访问vector迭代器失效问题1&#xff1a;inserse插入扩容时空间销毁造成野指针问题2&#xff1a;erase删除或者inse…

什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化

什么是“奥卡姆剃刀”&#xff0c;如何用“奥卡姆剃刀”解决复杂问题&#xff1f;复杂问题简单化问题什么是“奥卡姆剃刀”?如何使用“奥卡姆剃刀”解决问题复杂问题简单化“汉隆剃刀”小结问题 假设你在夜空中看到一颗闪闪发光的「不明飞行物」&#xff0c;你认为这会是什么呢…

优秀的IC/FPGA开源项目(六)-手语字母翻译器

《优秀的IC/FPGA开源项目》是新开的系列&#xff0c;旨在介绍单一项目&#xff0c;会比《优秀的 Verilog/FPGA开源项目》内容介绍更加详细&#xff0c;包括但不限于综合、上板测试等。两者相辅相成&#xff0c;互补互充~一种智能手套&#xff0c;可将手语字母翻译成带显示器的书…

【分享】订阅集简云畅捷通T+cloud连接器自动同步财务费用单至畅捷通

方案场景 伴随公司发展和数字化水平提高&#xff0c;大量的财务单据需要手动审核和录入&#xff0c;这些重复机械的操作占据大量人力&#xff0c;同时极容易出现数据出错或丢失等情况&#xff0c;严重影响着企业经营效率。 使用集简云提供服务的畅捷通TCloud钉钉连接器完成财…