数据结构与算法--图

news2024/11/24 1:40:00

数据结构与算法--图

  • 1 图的基本概念
  • 2 无向图和有向图
  • 3 图相关的关键术语
  • 4 图的相关性质
  • 5 图的存储
    • 4.1 邻接表法
    • 4.2 邻接矩阵法
  • 6 图的代码表示

 

1 图的基本概念

 

图(Graph) 是由一个顶点集V和一个弧集E构成的网状数据结构,记作 G = ( V , E ) G = (V ,E) G=(V,E) 在图中,数据元素通常称作顶点(Vertex),V是顶点的有穷非空集合;V R VRVR是两个顶点之间的关系的集合

线性表可以为空表,树可以是空数,但是图不可以为空,即图一定是非空集

在这里插入图片描述


 

2 无向图和有向图

 

在一个图中,如果任意两个顶点构成的偶对(a,b)属于E是无序的,即顶点之间的连线是没有方向的,则称该图为无向图。

在一个图中,如果任意两个顶点构成的偶对(a,b)属于E是有序的,即顶点之间的连线是有方向的,则称为有向图

在这里插入图片描述


 

3 图相关的关键术语

 

顶点 :  图中的节点

:   有向图 v为起点 w为终点 <v,w>表示v到w的一条弧

:    无向图 有<v,w>就有<w,v>

:   可以理解成边的长度

顶点的度 :    和该顶点相关联的边的数目 度 = 入度 + 出度

顶点的入度 :   该顶点为终点

顶点的出度 :   改顶点为起点

路径 :    从一个顶点到另一个顶点的路径

连通图 :    任意两个顶点都是连通的


 

4 图的相关性质

 
n为图中的节点数
e为边或弧的数目 则有如下性质

  1. 在无向图中
    e的取值范围是 0 ~ n(n-1)/2
    在无向图中,如果有e = n(n-1)/2则,则为完全图
  2. 在有向图中
    e的取值范围是 n(n-1)
    在有向图中,如有n(n-1)条弧,则称为有向完全图

 

5 图的存储

 

邻接表法 邻接矩阵法

在这里插入图片描述

4.1 邻接表法

 
使用链表来表示图的连接关系,对于每个顶点,使用链表存储与其相邻的顶点,邻接表的优点是对于稀疏图而言,存储空间较小;同时可以快速遍历每一个顶点的邻接顶点,但是查找两个顶点之间是否存在边的时间复杂度为 O ( k ) O(k) O(k),其中k是相邻顶点的数量

特点 :

  1. 在邻接表中,给定一顶点就很容易地找到它所有邻边

  2. 在有向图的邻接表中,求一个给定顶点的出度只需计算其邻接表中的结点个数即可,但求某顶点的入度,则需要遍历全部的邻接表

  3. 图的邻接表表示并不唯一,因为各边表结点的顺序是任意的

  4. 邻接表便于增加和删除节点,便于统计边数

邻接表属于链式存储,但邻接表的表头属于顺序存储结构

在这里插入图片描述

4.2 邻接矩阵法

使用一个二维数组来表示图的连接关系,对于n个顶点的无向图,使用 n * n的矩阵表示 如果两个顶点 ij之间存在边,则在矩阵中 (i,j)(j,i)的值为1,否则为0,(i,j) 位置的值表示从顶点i到顶点j的边

邻接矩阵的优势是查找两个顶点之间是否存在边的时间复杂度为 O ( n ) O(n) O(n)

在这里插入图片描述

无向图的邻接矩阵一定是对称矩阵


 

6 图的代码表示

 
顶点

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<>();
    }
}

public class Edge {
    public int weight;// 权值可以表示距离
    public Node from;// 
    public Node to;// 

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

/**
 * 图的表示方式 邻接图 邻接矩阵
 * @author Mrchao
 * @version 1.0.0
 * @date 2023-07-10
 */
public class Graph {
    // 点集 key 点的编号 Node实际的点
    public HashMap<Integer,Node> nodes;
    // 边集
    public HashSet<Edge> edges;

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

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

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

相关文章

RPC框架学习

一、设计目标 RPC 框架的目标就是让远程服务调用更加简单、透明&#xff0c;RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#xff09;、序列化方式&#xff08;XML/Json/ 二进制&#xff09;和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者&a…

多线程知识汇总

IntentService 多线程的应用在Android 开发中是非常常见的&#xff0c;常用方法主要有&#xff1a; 集成Thread类 实现Runnable接口 AsyncTask Handler HandlerThread IntentService IntentService 定义&#xff1a; Android 里的一个封装类&#xff0c;继承四大组件之一 ser…

Android 跨进程通信并传输复杂数据

前言 AIDL (Android Interface Definition Language) 支持以下数据类型&#xff1a; 基本数据类型&#xff1a;int、long、float、double、boolean、char、byte。 字符串类型&#xff1a;String。 集合类型&#xff1a;List、Map、Set。 Parcelable 类型&#xff1a;实现了 Par…

linux 文件锁

建议锁,强制锁,记录锁的概念 建议锁&#xff1a; 如果某一个进程对一个文件持有一把锁之后&#xff0c;其他进程仍然可以直接对文件进行操作(open, read, write)而不会被系统禁止&#xff0c;即使这个进程没有持有锁。只是一种编程上的约定。建议锁只对遵守建议锁准则的进程生…

@JsonFormat、@JSONField、@DateTimeFormat详细解说

JsonFormat、JSONField、DateTimeFormat详细解说_jsonfield format_xinlianluohan的博客-CSDN博客 三者出处 1、JsonFormat来源于jackson&#xff0c;Jackson是一个简单基于Java应用库&#xff0c;Jackson可以轻松的将Java对象转换成json对象和xml文档&#xff0c;同样也可以…

CSS SASS calc() 计算表达式或使用变量

calc&#xff08;&#xff09;是css的一个函数&#xff0c;可用于元素计算长度&#xff0c;比如div宽度想要减去一个固定宽度后并自适应&#xff0c;可以写为calc(100% - 60px) 注意“-”两边有空格 sass已经是常用的预编译语言&#xff0c;允许使用变量等规则&#xff0c;如果…

上海亚商投顾:沪指窄幅震荡微跌 两市成交金额创年内新低

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指盘中跌超1%&#xff0c;黄白二线有所分化。华为星闪概念股午后拉升&…

EPC与5GC/5GS互联互通

一、5GS与EPC/E-UTRAN互通的非漫游架构 1&#xff0e;N26接口是MME和5GS AMF之间的CN间接口&#xff0c;以实现EPC和NG核心之间的互通。网络中支持N26接口是可选的&#xff0c;用于互通。N26支持在S10上支持的功能的子集&#xff08;对于互通是必要的&#xff09;。 2&#xf…

面试题:HTTPS 是如何保证传输安全的?又被问了!

文章目录 1. HTTP 协议1.1 HTTP 协议介绍1.2 HTTP 中间人攻击1.3 防止中间人攻击 2. HTTPS 协议2.1 HTTPS 简介2.2 CA 认证体系 总结 1. HTTP 协议 在谈论 HTTPS 协议之前&#xff0c;先来回顾一下 HTTP 协议的概念。 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议&…

Android13 大屏设备底部显示TaskBar并NavagatonBar居右

Android 13大屏设备时底下显示任务栏以及虚拟按键靠右的问题&#xff0c; 当前需求是去掉底部任务栏的显示&#xff0c;并把虚拟按键导航栏居中显示。 修改前的效果&#xff1a; 修改后的效果&#xff1a; 通过查看源码逻辑&#xff0c;可以发现只需把isTablet相关的逻辑和…

Mybatis 映射器中映射方法接受多个参数(@Param)

前面我们介绍了使用Mybatis映射器进行数据的增删改查操作&#xff1b;本篇我们继续介绍在Mybatis映射器的映射方法中如何使用多个参数。 如果您对Mybatis使用映射器进行数据的增删改查操作不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; …

【数据结构】二叉树的构建与基本操作实现

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.前序建立二叉树 2.销毁二叉树 3.统计 …

uni-app 之 picker选择器

uni-app 之 picker选择器 同步滚动&#xff1a;开 uni-app 之 picker选择器 一、普通选择器 二、多列选择器 三、时间选择器 四、日期选择器 一、普通选择器 <template><view><picker change"bindPickerChange" :value"index" :range&q…

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理 在过去十年中&#xff0c;航天器一直是现代技术进步的先决条件。迄今为止&#xff0c;为了更好地完成各种实际任务&#xff0c;已经在航天器姿态控制领域进行了大量研究。航天器一旦进入太空&#xff0c;就容易出现不确定…

JavaWeb开发-05-SpringBootWeb请求响应

一.请求 1.Postman 2.简单参数 ​ package com.wjh.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/** 测试请求参数接受*/ R…

【IntelliJ IDEA】cmd和idea Terminal查看java版本不一致

问题描述 原来win10电脑上安装的是jdk8的版本&#xff0c;因某些原因&#xff0c;现在想换成jdk7的版本&#xff0c;修改环境变量后&#xff0c;在cmd中执行 [java -version]命令&#xff0c;显示的是7的版本。 但在idea的Terminal中执行&#xff0c;确实显示8的版本。 原因分…

vue设置路由模式为history,打包部署,并解决404问题

现在Router配置里面加上 base 和 mode 属性&#xff1a; export default new Router({base: /your_project_name/,mode: history,routes: [......] })这样就能支持 history 模式了&#xff0c;但是现在静态资源获取还有问题。 解决静态资源获取问题 在 config/index.js 文件…

TS中的数据类型

一、number类型 let c: number; c 10; c "hello"; // 不能复制string类型 二、string类型 let d: string; d "hello"; d 10; // 不能复制number类型 三、boolean类型 let e: boolean true; e false; e 10; // 不能赋值true和false以外的值 四…

Cypress安装与使用教程(1)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

半导体划片机工艺应用

半导体划片工艺是半导体制造过程中的重要步骤之一&#xff0c;主要用于将大尺寸的晶圆切割成小片&#xff0c;以便进行后续的制造和封装过程。以下是一些半导体划片工艺的应用&#xff1a; 晶圆划片&#xff1a;在半导体制造过程中&#xff0c;需要将大尺寸的晶圆切割成小片&am…